101 Commits

Author SHA1 Message Date
b9f35c8b11 Merge branch 'release-2.0.0-beta.2' 2015-08-16 16:36:46 +02:00
6c99224814 Prepare release 2.0.0-beta.2 2015-08-16 16:36:36 +02:00
b360d5b640 Merge branch 'text-formatting' into develop 2015-08-16 16:34:10 +02:00
fbcb060f12 Omit space before units starting with a slash.
- VERBESSERUNG: Einheiten, die mit einem Schrägstrich beginnen, werden nicht mehr mit Leerzeichen vom Wert getrennt.
2015-08-16 16:33:18 +02:00
221509520d Fix markup detection DocumentWriter. 2015-08-16 16:25:53 +02:00
392de61b74 Omit superfluous newline in output. 2015-08-16 05:17:24 +02:00
2745ab819c Do not create character style (currently not used). 2015-08-16 05:17:06 +02:00
2e8c881e1f Clean up assembly settings. 2015-08-15 20:15:52 +02:00
92a8faa972 Implement text styles.
- NEU: Überschriften und pathologische Werte werden jetzt besonders ausgezeichnet (fett).
2015-08-15 20:14:24 +02:00
4cb2999297 Create icons. 2015-08-14 20:00:21 +02:00
a609c7f93c Fix paragraph replacements in Daniel's style.
- VERBESSERT: Floskel-Ersetzungen in Daniels Spezial.
2015-08-14 19:27:29 +02:00
d5340d1b3a Fix ElementView.
- VERBESSERT: Element-Bearbeitungsfenster.
2015-08-14 18:12:34 +02:00
91b7aa70e9 Update ward style.
- GEÄNDERT: Diff.-BB-Werte im Stations-Stil in Hämatologie-Zeile integriert.
2015-08-14 18:11:58 +02:00
863dfa071a Prevent running the formatter without appropriate selection.
- VERBESSERT: Formatieren läßt sich nicht mehr starten, ohne daß Labor-Text markiert ist.
2015-08-14 17:04:50 +02:00
7a105d7aad Do not include material for explicitly selected items.
- VERÄNDERUNG: Laborwerte, die explizit (also nicht mit "*") ausgewählt werden, werden jetzt ohne vorangestelltes Material-Kürzel eingefügt (z.B. jetzt "Sammelurin: Volumen" anstatt "Sammelurin: SU-Volumen").
2015-08-14 16:01:52 +02:00
32d4e8d955 Implement bold font; make tests pass again.
- NEU: Überschriften und pathologische Werte werden fett gedruckt.
- FIX: Kleinere Bugfixes.
2015-08-14 11:22:11 +02:00
39e8b1f81d Add pre/post images to webpage. 2015-08-14 06:46:25 +02:00
de6dab5fb4 Fix link to version history. 2015-08-13 21:02:36 +02:00
5d2acb6233 Merge branch 'release-2.0.0-beta.1' into develop 2015-08-13 20:51:46 +02:00
bb67a993fb Merge branch 'release-2.0.0-beta.1' 2015-08-13 20:51:04 +02:00
193a83a769 Prepare release 2.0.0-beta.1 2015-08-13 20:50:53 +02:00
65e34cdf1d Write homepage. 2015-08-13 20:46:03 +02:00
8f9eb83e9d Use 'PTT' rather than 'aPTT'. 2015-08-13 19:57:53 +02:00
65ac72fb50 Use serialized Settings as defaults; fixes. 2015-08-13 19:20:20 +02:00
0461dfd66e Add more information to README.md. 2015-08-13 18:12:18 +02:00
63447def9b Multiple fixes for Views and ViewModels. 2015-08-13 17:59:23 +02:00
3a615eda8b Fix demoting elements while moving up. 2015-08-12 22:54:29 +02:00
a9d0e8ee7e Add IsExpanded property to ElementViewModel. 2015-08-12 22:29:31 +02:00
2bb0452a87 Implement moving of elements.
- NEU: Elemente können verschoben werden.
2015-08-12 22:03:25 +02:00
12c2412e38 Adjust size of SettingsView window. 2015-08-12 17:55:19 +02:00
e0b749382e Use buttons in SettingsView. 2015-08-12 17:54:23 +02:00
6f65340ca5 Use icons in SettingsRepositoryView. 2015-08-12 15:50:01 +02:00
f2cb30fabb Fix FormatElement labels if no content. 2015-08-12 10:05:50 +02:00
1afa9bb14f Fix views.
Needed to set all WindowStyles to ToolWindow and make the windows
topmost because Word and WPF do not play together all too well.
2015-08-12 10:04:59 +02:00
03a62ddf5a Fix SettingsRepositoryView layout. 2015-08-11 22:00:34 +02:00
5a0923e8e8 Implement reset settings feature.
- NEU: Auf Werkseinstellungen zurücksetzen.
2015-08-11 21:39:21 +02:00
0708f2a2b3 Implement import and export of Settings.
- NEU: Stile können importiert und exportiert werden.
2015-08-11 21:22:34 +02:00
00c60ba0ad Comment on serialization. 2015-08-11 19:51:23 +02:00
6af2243660 Do not return Null from SettingsRepository.Load(). 2015-08-11 16:16:26 +02:00
c9fc4a5fae Implement serialization of Settings and SettingsRepository.
- FIX: Stile werden jetzt gespeichert.
2015-08-11 16:12:39 +02:00
53d13b394e Do not expand elements tree by default. 2015-08-10 09:18:36 +02:00
947b53cf97 Fix material convertsion and units detection. 2015-08-10 06:55:57 +02:00
6c9f003134 Do not build headers from empty time stamps. 2015-08-09 21:21:56 +02:00
51bfdc760e Remove superfluous field from FormatElementViewModel. 2015-08-09 21:12:07 +02:00
a009c1ab39 Add control elements for columns.
- NEU: Steuer-Elemente für Spalten.
2015-08-09 20:54:43 +02:00
5833e0fcb7 Fix dev path in ExceptionViewModel. 2015-08-09 20:52:35 +02:00
750fb093b1 Show Word version and build number in exceptions. 2015-08-09 20:48:17 +02:00
11b9b9df54 Make formatter tests pass. 2015-08-09 19:54:48 +02:00
b59c9f2898 Wire up the views. 2015-08-09 13:24:44 +02:00
257e3e8568 Fix deleting settings. 2015-08-08 06:33:01 +02:00
c6121353e4 Make SettingsTest pass. 2015-08-07 21:40:12 +02:00
bde85e5651 Fix views and view models. 2015-08-07 21:37:14 +02:00
edaf88c4cd Implement blacklisting feature.
- NEU: Parameter können im Thesaurus als "blacklisted" markiert werden und werden dann bei Verwendung einer Wildcard ("*") nicht berücksichtigt.
2015-08-06 07:47:44 +02:00
b6c33971bd Fix thesaurus.
- FIX: Mehrere Thesaurus-Fehler behoben.
2015-08-06 06:42:08 +02:00
476f2d69be Improve date and time header (some tests failing now).
- NEU: Datumsangaben werden in eine Zeile "Laborwerte vom ..." eingebettet.
2015-08-05 22:04:07 +02:00
2cefede3c0 Output formatting.
- NEU: Formatierung der Ausgabe mit Absatzvorlage.
2015-08-05 21:52:06 +02:00
d0bd7dd2a5 Make sure to remember last used setting. 2015-08-05 21:43:08 +02:00
ed43497179 Implement copying of elements. 2015-08-05 21:22:03 +02:00
1205958eb1 Implement test to delete child element and make it pass. 2015-08-05 20:36:31 +02:00
60296602a9 Implement DeleteElementCommand. 2015-08-05 20:28:09 +02:00
742a588083 Make tests pass again (except not implemented ones). 2015-08-05 20:02:02 +02:00
b7fdf87ea5 Close view after sending UseSettingsMessage. 2015-08-05 06:47:30 +02:00
880e8b0bdc Fix importing of actual Word text.
- FIX: Datenimport funktioniert jetzt auch mit Word-Text und nicht nur in den Tests.
2015-08-05 06:46:52 +02:00
06a74992ef Make tests pass with refactored ZaaImporter. 2015-08-05 06:15:07 +02:00
285c6a2555 Add CanRun property to Formatter. 2015-08-04 23:26:21 +02:00
75c9c984c6 Refactor and harden ZaaImporter. 2015-08-04 23:21:38 +02:00
ae9cf7fa2e Improve demo document. 2015-08-04 20:17:36 +02:00
33d453cf73 Use ViewModelListBox dynamic resource. 2015-08-04 06:25:13 +02:00
8d6ed32a84 Fix LastSelected and LastSelectedElement properties. 2015-08-04 06:21:48 +02:00
5fe7250b53 Merge branch 'release-2.0.0-alpha.5' into develop 2015-08-04 02:46:46 +02:00
34006ba1e9 Merge branch 'release-2.0.0-alpha.5' 2015-08-04 02:46:21 +02:00
204139d16b Prepare release 2.0.0-alpha.5. 2015-08-04 02:46:12 +02:00
41b155e8be Begin implemenation of format and choose style commands. 2015-08-04 02:43:17 +02:00
b6209731ec Fix salutation regex in DanielsStyle.
- FIX: Daniels Spezial löscht nicht mehr die Unterschriften.
2015-08-04 01:19:19 +02:00
a128b76522 Implement tests for SettingsViewModel add and add child commands. 2015-08-04 01:17:14 +02:00
805da69d47 Implement passing test for ElementPickerViewModel. 2015-08-03 14:31:35 +02:00
8437f0907c Implement Demo feature.
- NEU: Eingebautes Demo-Dokument zum Ausprobieren.
2015-08-03 12:11:30 +02:00
db8f88c563 Fix SettingsViewModelTest.CannotAddChildElementToFormatElement. 2015-08-03 06:32:05 +02:00
14b09f89c5 Merge branch 'release-2.0.0-alpha.4' into develop 2015-08-02 22:05:39 +02:00
305baf2402 Merge branch 'release-2.0.0-alpha.4' 2015-08-02 22:05:08 +02:00
e4edd0f197 Prepare release 2.0.0-alpha.4. 2015-08-02 22:04:58 +02:00
23acb13019 Improve Daniel's style. 2015-08-02 22:01:51 +02:00
1e4c3681f2 Implement ElementPickerViewModel; initial SettingsViewModelTest. 2015-08-02 21:51:58 +02:00
9fd0907310 Implement unique IDs for settings. 2015-08-02 07:19:12 +02:00
286ddb1641 Fix cloning of SettingsViewModels. 2015-08-02 07:11:16 +02:00
d0be7524d3 Make some classes ICloneable; implement SettingsRepositoryViewModel. 2015-08-01 21:23:56 +02:00
5197c294b9 Merge branch 'release-2.0.0-alpha.3' into develop 2015-07-31 17:24:28 +02:00
088422b8a1 Merge branch 'release-2.0.0-alpha.3' 2015-07-31 17:23:51 +02:00
09b3decd03 Prepare release 2.0.0-alpha.3 2015-07-31 17:23:41 +02:00
12cd58180f Create rudimentary view models, default settings. 2015-07-31 17:19:49 +02:00
a725246f27 Use large ribbon buttons rather than splitbutton. 2015-07-28 18:19:54 +02:00
f2e75b1abe Put license into About view; adjust install license file. 2015-07-28 18:16:39 +02:00
4bae35b665 Check for updates at startup.
- FIX: Beim Start wird jetzt nach Updates gesucht.
2015-07-28 13:25:17 +02:00
4d614e0be5 Fix versioninfo.txt. 2015-07-28 13:24:41 +02:00
4ca9e21e80 Fix versioninfo.txt for alpha.2. 2015-07-28 12:07:22 +02:00
cf1b75e6a0 Merge branch 'release-2.0.0-alpha.2' into develop 2015-07-28 12:05:00 +02:00
6a9b5010a1 Merge branch 'release-2.0.0-alpha.2' 2015-07-28 11:57:24 +02:00
28b31533c7 Prepare release 2.0.0-alpha.2 2015-07-28 11:57:12 +02:00
edd81457cf Add format ribbon buttons. 2015-07-28 11:54:21 +02:00
81619edcb1 Implement exception handling and reporting.
- NEU: Fehlerbehandlung und Fehlerberichte.
2015-07-27 22:19:30 +02:00
b4f3d81336 Implement DanielsStyle. 2015-07-27 20:39:05 +02:00
140 changed files with 6076 additions and 711 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "www/PHPMailer"]
path = www/PHPMailer
url = git@github.com:PHPMailer/PHPMailer.git

View File

@ -1,6 +1,65 @@
Unpublished changes (2015-06-19) Version 2.0.0-beta.2 (2015-08-16)
======================================================================== ========================================================================
- FIX: Kleinere Bugfixes.
- GEÄNDERT: Diff.-BB-Werte im Stations-Stil in Hämatologie-Zeile integriert.
- NEU: Überschriften und pathologische Werte werden fett gedruckt.
- NEU: Überschriften und pathologische Werte werden jetzt besonders ausgezeichnet (fett).
- VERBESSERT: Element-Bearbeitungsfenster.
- VERBESSERT: Floskel-Ersetzungen in Daniels Spezial.
- VERBESSERT: Formatieren läßt sich nicht mehr starten, ohne daß Labor-Text markiert ist.
- VERBESSERUNG: Einheiten, die mit einem Schrägstrich beginnen, werden nicht mehr mit Leerzeichen vom Wert getrennt.
- VERÄNDERUNG: Laborwerte, die explizit (also nicht mit "*") ausgewählt werden, werden jetzt ohne vorangestelltes Material-Kürzel eingefügt (z.B. jetzt "Sammelurin: Volumen" anstatt "Sammelurin: SU-Volumen").
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Version 2.0.0-beta.1 (2015-08-13)
========================================================================
- FIX: Datenimport funktioniert jetzt auch mit Word-Text und nicht nur in den Tests.
- FIX: Mehrere Thesaurus-Fehler behoben.
- FIX: Stile werden jetzt gespeichert.
- NEU: Auf Werkseinstellungen zurücksetzen.
- NEU: Datumsangaben werden in eine Zeile "Laborwerte vom ..." eingebettet.
- NEU: Elemente können verschoben werden.
- NEU: Formatierung der Ausgabe mit Absatzvorlage.
- NEU: Parameter können im Thesaurus als "blacklisted" markiert werden und werden dann bei Verwendung einer Wildcard ("*") nicht berücksichtigt.
- NEU: Steuer-Elemente für Spalten.
- NEU: Stile können importiert und exportiert werden.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Version 2.0.0-alpha.5. (2015-08-04)
========================================================================
- FIX: Daniels Spezial löscht nicht mehr die Unterschriften.
- NEU: Eingebautes Demo-Dokument zum Ausprobieren.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Version 2.0.0-alpha.3 (2015-07-31)
========================================================================
- FIX: Beim Start wird jetzt nach Updates gesucht.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Version 2.0.0-alpha.2 (2015-07-28)
========================================================================
- NEU: Fehlerbehandlung und Fehlerberichte.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Version 2.0.0-alpha.1 (2015-07-27)
========================================================================
- NEW: First release of version 2 series.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

View File

@ -52,6 +52,11 @@ folgende Teile aufgeteilt:
existieren verschiedene Klassen, die die Klassen des Labor-Modells existieren verschiedene Klassen, die die Klassen des Labor-Modells
(`zaaReloaded2.LabModel`) umschließen und um entsprechende (`zaaReloaded2.LabModel`) umschließen und um entsprechende
Funktionalitäten erweitern. Funktionalitäten erweitern.
- __Kontrolle der Formatierung:__ Der Namensraum
`zaaReloaded2.Controller` umfaßt Klassen, mit denen ein
`zaaReloaded2.Formatter.Formatter` gesteuert werden kann. Diese
Klassen spielen eine große Rolle bei den benutzerdefinierten
Anpassungen von Stilen.
## Parsen der Lauris-Ausgabe ## Parsen der Lauris-Ausgabe
@ -174,4 +179,49 @@ oder nicht-normalen Parametern oder immer mit ausgegeben werden:
Die Markierung besonderer Parameter erfolgt in der Textdatei, aus der Die Markierung besonderer Parameter erfolgt in der Textdatei, aus der
das `zaaReloaded2.Thesaurus.Parameters` generiert wird (s.o.). das `zaaReloaded2.Thesaurus.Parameters` generiert wird (s.o.).
## User Interface
Das User Interface wurde mit der Windows Presentation Foundation nach
dem [MVVM][]-Muster implementiert. Dabei wurde auf das Hilfs-Framework
[Bovender][bovender-framework] zurückgegriffen.
## Updates
Das Add-in sucht täglich nach einem Update; dabei wird die Datei
<http://zaa.nephrowiki.de/versioninfo.txt> heruntergeladen. Updates
werden automatisch im Hintergrund geladen und beim Schließen von Word
(bzw. der Zentralen Arztbriefablage) installiert und stehen dann beim
nächsten Starten der Anwendung zur Verfügung.
## Serialisierung
Um das Stil-Repositorium (`zaaReloaded2.Controller.SettingsRepository`)
in den Assembly-Properties speichern zu können und für den Im- und
Export von Stilen werden die in .NET eingebauten
Serialisierungs-Strukturen genutzt. Weil es mit der Verwendung eines
`XmlSerializer`s Probleme gab, weil der `XmlSerializer` nicht mit
Interface-Eigenschaften umgehen kann, wurde zunächst für alle Klassen,
die serialisiert werden müssen (`SettingsRepository`,
`zaaReloaded2.Controller.Settings` und die von
`zaaReloaded2.Controller.Elements.ElementBase` abgeleiteten Klassen) das
Interface `ISerializable` implementiert. Das hat aber auch nicht dazu
geführt, daß der `XmlSerializer` die Klassen serialisierte, so daß
jetzt der `SoapFormatter` verwendet wird. Der stört sich nicht an
Interface-Eigenschaften und produziert auch XML, wenngleich im etwas
komplizierten [SOAP][]-Format.
Um das `SettingsRepository` in den Assembly-Properties zu persistieren,
muß das serialisierte XML noch in einen Base64-kodierten String
umgewandelt werden, damit das SOAP-XML nicht mit dem XML der
Assembly-Properties ins Gehege kommt (siehe
`zaaReloaded2.Controller.SettingsRepository.Load()` und
`zaaReloaded2.Controller.SettingsRepository.Store()`).
[SOAP]: http://de.wikipedia.org/wiki/SOAP
[MVVM]: http://de.wikipedia.org/wiki/MVVM
[bovender-framework]: https://github.com/bovender/bovender
<!-- vim: set tw=72 sw=2 ts=2 sts=-1 : --> <!-- vim: set tw=72 sw=2 ts=2 sts=-1 : -->

View File

@ -24,6 +24,7 @@ using Microsoft.Office.Interop.Word;
using zaaReloaded2.LabModel; using zaaReloaded2.LabModel;
using zaaReloaded2.Formatter; using zaaReloaded2.Formatter;
using zaa = zaaReloaded2.Controller.Elements; using zaa = zaaReloaded2.Controller.Elements;
using System.Text.RegularExpressions;
namespace Tests.Controller.Elements namespace Tests.Controller.Elements
{ {
@ -61,7 +62,12 @@ namespace Tests.Controller.Elements
_formatter.Laboratory = lab; _formatter.Laboratory = lab;
_formatter.Settings.Elements.Add(new zaa.Items("Na, K, Cl")); _formatter.Settings.Elements.Add(new zaa.Items("Na, K, Cl"));
_formatter.Run(); _formatter.Run();
Assert.AreEqual("Na 133, K 6 (5)\r", _document.Range().Text); string expected = (
StripMarkup(
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00)) +
"Na 133, K 6 (5)\r\r").Replace(Environment.NewLine, "\r")
);
Assert.AreEqual(expected, _document.Range().Text);
} }
[Test] [Test]
@ -78,7 +84,12 @@ namespace Tests.Controller.Elements
_formatter.Laboratory = lab; _formatter.Laboratory = lab;
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, K, Cl")); _formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, K, Cl"));
_formatter.Run(); _formatter.Run();
Assert.AreEqual("Klinische Chemie: Na 133, K 6 (5)\r", _document.Range().Text); string expected = (
StripMarkup(
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00)) +
"Klinische Chemie: Na 133, K 6 (5)\r\r").Replace(Environment.NewLine, "\r")
);
Assert.AreEqual(expected, _document.Range().Text);
} }
[Test] [Test]
@ -113,8 +124,12 @@ namespace Tests.Controller.Elements
_formatter.Laboratory = lab; _formatter.Laboratory = lab;
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, *")); _formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, *"));
_formatter.Run(); _formatter.Run();
Assert.AreEqual("Klinische Chemie: Na 133, Cl 110, K 6\r", string expected = (
_document.Range().Text); StripMarkup(
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00))
) +
"Klinische Chemie: Na 133, Cl 110, K 6\r\r").Replace(Environment.NewLine, "\r");
Assert.AreEqual(expected, _document.Range().Text);
} }
[Test] [Test]
@ -133,8 +148,12 @@ namespace Tests.Controller.Elements
_formatter.Laboratory = lab; _formatter.Laboratory = lab;
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, SU-*")); _formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, SU-*"));
_formatter.Run(); _formatter.Run();
Assert.AreEqual("Klinische Chemie: Na 133, SU-Protein 2,8\r", string expected = (
_document.Range().Text); StripMarkup(
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00))
)+
"Klinische Chemie: Na 133, SU-Protein 2,8\r\r").Replace(Environment.NewLine, "\r");
Assert.AreEqual(expected, _document.Range().Text);
} }
[Test] [Test]
@ -153,8 +172,20 @@ namespace Tests.Controller.Elements
_formatter.Laboratory = lab; _formatter.Laboratory = lab;
_formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, SU-*, *")); _formatter.Settings.Elements.Add(new zaa.Items("Klinische Chemie: Na, SU-*, *"));
_formatter.Run(); _formatter.Run();
Assert.AreEqual("Klinische Chemie: Na 133, SU-Protein 2,8, Cl 110, U-Na 99\r", string expected = (
_document.Range().Text); StripMarkup(
TimePointFormatter.DateAndTimeHeader(new DateTime(2015, 07, 13, 13, 31, 00))
) +
"Klinische Chemie: Na 133, SU-Protein 2,8, Cl 110, U-Na 99\r\r")
.Replace(Environment.NewLine, "\r");
Assert.AreEqual(expected, _document.Range().Text);
} }
static string StripMarkup(string s)
{
return _markupStripper.Replace(s, string.Empty);
}
static readonly Regex _markupStripper = new Regex(@"<[^>]+>");
} }
} }

View File

@ -27,7 +27,7 @@ namespace Tests.Controller
[TestFixture] [TestFixture]
class SettingsRepositoryTest class SettingsRepositoryTest
{ {
SettingsRepository _savedSettings; string _savedSettings;
[SetUp] [SetUp]
public void SetUp() public void SetUp()
@ -49,12 +49,14 @@ namespace Tests.Controller
Settings s = new Settings(); Settings s = new Settings();
string testName = "test"; string testName = "test";
s.Name = testName; s.Name = testName;
sr.Settings.Add(s); sr.SettingsList.Add(s);
int expected = sr.SettingsList.Count;
int index = sr.SettingsList.IndexOf(s);
sr.Store(); sr.Store();
sr = null; sr = null;
sr = SettingsRepository.Load(); sr = SettingsRepository.Load();
Assert.AreEqual(1, sr.Settings.Count); Assert.AreEqual(expected, sr.SettingsList.Count);
Assert.AreEqual(testName, sr.Settings[0].Name); Assert.AreEqual(testName, sr.SettingsList[index].Name);
} }
} }
} }

View File

@ -0,0 +1,54 @@
/* SettingsTest.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using zaaReloaded2.Controller;
using zaaReloaded2.Controller.Elements;
using System.IO;
namespace Tests.Controller
{
[TestFixture]
class SettingsTest
{
[Test]
public void CloneSettings()
{
SelectEachDay selectEachDay = new SelectEachDay();
Items items = new Items("some text");
Settings source = new Settings(
"hello world",
new List<ElementBase>() { selectEachDay, items });
source.ReferenceStyle = zaaReloaded2.Formatter.ReferenceStyle.IfSpecialOrAbnormal;
Settings clone = source.Clone() as Settings;
Assert.AreNotSame(source, clone);
Assert.AreEqual("Kopie von " + source.Name, clone.Name,
"Name");
Assert.AreNotSame(source.Elements, clone.Elements);
Assert.AreEqual(source.ReferenceStyle, clone.ReferenceStyle,
"ReferenceStyle");
Assert.AreEqual(
((Items)source.Elements[1]).Content,
((Items)clone.Elements[1]).Content,
"Items content");
}
}
}

View File

@ -21,6 +21,7 @@ using System.Linq;
using System.Text; using System.Text;
using NUnit.Framework; using NUnit.Framework;
using zaaReloaded2.Formatter; using zaaReloaded2.Formatter;
using Microsoft.Office.Interop.Word;
namespace Tests.Formatter namespace Tests.Formatter
{ {
@ -95,5 +96,15 @@ namespace Tests.Formatter
Assert.IsFalse(_docWriter.HasBufferedText); Assert.IsFalse(_docWriter.HasBufferedText);
Assert.AreEqual(String.Empty, _docWriter.ToString()); Assert.AreEqual(String.Empty, _docWriter.ToString());
} }
[Test]
public void TextMarkup()
{
DocumentWriter output = new DocumentWriter();
_docWriter.Parent = output;
_docWriter.Write("This is not bold. <b>This is bold!</b>\rThis not.");
_docWriter.Flush();
Assert.AreEqual("This is not bold. This is bold!\rThis not.", output.Text);
}
} }
} }

View File

@ -1,7 +1,7 @@
 
04.07.2015 12:31:00: Laborwerte vom 04.07.2015 12:31:00:
Klinische Chemie: Na 144 mM, K 4,3 mM Klinische Chemie: Na 144 mM, K 4,3 mM
06.07.2015 10:28:00: Laborwerte vom 06.07.2015 10:28:00:
Klinische Chemie: Na 138 mM, K 4,6 mM Klinische Chemie: Na 138 mM, K 4,6 mM

View File

@ -1,7 +1,7 @@
 
04.07.2015: Laborwerte vom 04.07.2015:
Klinische Chemie: Na 144 mM, K 4,3 mM Klinische Chemie: Na 144 mM, K 4,3 mM
06.07.2015: Laborwerte vom 06.07.2015:
Klinische Chemie: Na 138 mM, K 4,6 mM Klinische Chemie: Na 138 mM, K 4,6 mM

View File

@ -1,4 +1,4 @@
 
04.07.2015: Laborwerte vom 04.07.2015:
Klinische Chemie: Na 144 mM, K 4,3 mM Klinische Chemie: Na 144 mM, K 4,3 mM

View File

@ -1,4 +1,4 @@
 
06.07.2015: Laborwerte vom 06.07.2015:
Klinische Chemie: Na 138 mM, K 4,6 mM Klinische Chemie: Na 138 mM, K 4,6 mM

View File

@ -99,6 +99,25 @@ namespace Tests.Formatter
_document.Range().Text); _document.Range().Text);
} }
[Test]
public void FormatSpecialItems()
{
ZaaImporter importer = new ZaaImporter();
importer.Import(
"Klinische Chemie: glomerul. Filtrationsr. CKD-EP: 36 ml/min /1,73qm; " +
"Sammelmenge (U): 12300 ml; "
);
Document document = new Document();
f.Formatter formatter = new f.Formatter(document);
formatter.Laboratory = importer.Laboratory;
formatter.Settings = new zaaReloaded2.Controller.Settings(
new List<ElementBase>() { new Items("*") } );
formatter.Run();
Assert.AreEqual(
"eGFR (CKD-EPI) 36 ml/min/1,73 m², SU-Volumen 12300 ml\r\r",
document.Range().Text);
}
string GetResourceText(string resource) string GetResourceText(string resource)
{ {
try try

View File

@ -40,7 +40,7 @@ namespace Tests.Importer.ZaaImporter
[Test] [Test]
public void ParseInvalidLaurisTimePoints() public void ParseInvalidLaurisTimePoints()
{ {
LaurisTimePoint tp = new LaurisTimePoint("Aerobe Kultur: Enterokokken ;  Wachstum: 10 ;"); LaurisTimePoint tp = new LaurisTimePoint("Mit freundlichen Grüßen");
Assert.IsFalse(tp.IsValidTimePoint, Assert.IsFalse(tp.IsValidTimePoint,
"Bogus paragraph should be invalid LaurisTimePoint"); "Bogus paragraph should be invalid LaurisTimePoint");

View File

@ -41,5 +41,15 @@ namespace Tests.Importer.ZaaImporter
// Only 6 distinct time points (see method documentation above). // Only 6 distinct time points (see method documentation above).
Assert.AreEqual(6, importer.Laboratory.TimePoints.Count); Assert.AreEqual(6, importer.Laboratory.TimePoints.Count);
} }
[Test]
public void ParseInvalidInput()
{
zaa.ZaaImporter importer = new zaa.ZaaImporter();
importer.Import("some arbitrary text\r\nthat does not represent\r\na valid lab");
Assert.IsFalse(importer.Success);
importer.Import("(03.03.1930 13:30:00)\r\nKlinische Chemie: Natrium 135 [135 - 145] mmol/l;");
Assert.IsTrue(importer.Success);
}
} }
} }

169
Tests/SerializationTest.cs Executable file
View File

@ -0,0 +1,169 @@
/* SelectFirstDayTest.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using zaaReloaded2.Controller.Elements;
using NUnit.Framework;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using zaaReloaded2.Controller;
namespace Tests.Controller
{
[TestFixture]
class SerializationTest
{
[Test]
public void SerializeControlElement()
{
SelectFirstDay element = new SelectFirstDay(
new List<FormatElementBase>()
{
new Items("hello"),
new Items("world")
}
);
MemoryStream stream = new MemoryStream();
// XmlSerializer does not work with interface properties...
// XmlSerializer serializer = new XmlSerializer(typeof(SelectFirstDay));
// BinaryFormatter serializer = new BinaryFormatter();
SoapFormatter serializer = new SoapFormatter();
serializer.Serialize(stream, element);
stream.Position = 0;
StreamReader sr = new StreamReader(stream);
Console.WriteLine(sr.ReadToEnd());
stream.Position = 0;
SelectFirstDay deserialized = serializer.Deserialize(stream) as SelectFirstDay;
Assert.IsNotNull(deserialized);
Assert.AreEqual(element.Children.Count, deserialized.Children.Count);
Assert.AreEqual(element.Children[0].Content, deserialized.Children[0].Content);
Assert.AreEqual(element.Children[1].Content, deserialized.Children[1].Content);
}
[Test]
public void SerializeFormatElement()
{
string testString = "Hello World";
CustomText element = new CustomText();
element.Content = testString;
MemoryStream stream = new MemoryStream();
SoapFormatter serializer = new SoapFormatter();
serializer.Serialize(stream, element);
stream.Position = 0;
CustomText deserialized = serializer.Deserialize(stream) as CustomText;
Assert.IsNotNull(deserialized);
Assert.AreEqual(element.Content, deserialized.Content);
}
[Test]
public void SerializeSettings()
{
Settings settings = CreateTestSettings1();
MemoryStream stream = new MemoryStream();
SoapFormatter serializer = new SoapFormatter();
serializer.Serialize(stream, settings);
stream.Position = 0;
Settings deserialized = serializer.Deserialize(stream) as Settings;
Assert.IsNotNull(deserialized);
Assert.AreEqual(settings.Name, deserialized.Name);
Assert.AreEqual(settings.ReferenceStyle, deserialized.ReferenceStyle);
Assert.AreEqual(settings.Elements.Count, deserialized.Elements.Count);
Assert.AreEqual(settings.Elements[0].GetType(), deserialized.Elements[0].GetType());
Assert.AreEqual(settings.Elements[1].GetType(), deserialized.Elements[1].GetType());
}
[Test]
public void SerializeSettingsRepository()
{
SettingsRepository repository = new SettingsRepository();
repository.SettingsList.Add(CreateTestSettings1());
repository.SettingsList.Add(CreateTestSettings2());
MemoryStream stream = new MemoryStream();
SoapFormatter serializer = new SoapFormatter();
serializer.Serialize(stream, repository);
stream.Position = 0;
SettingsRepository deserialized = serializer.Deserialize(stream) as SettingsRepository;
Assert.IsNotNull(deserialized);
Assert.AreEqual(repository.SettingsList.Count, deserialized.SettingsList.Count);
Assert.AreEqual(
repository.SettingsList[1].Elements.Count,
deserialized.SettingsList[1].Elements.Count
);
Assert.AreEqual(
repository.SettingsList[0].Name,
deserialized.SettingsList[0].Name
);
Assert.AreEqual(
repository.SettingsList[0].ReferenceStyle,
deserialized.SettingsList[0].ReferenceStyle
);
}
Settings CreateTestSettings1()
{
string testName = "test name...";
string testString = "Hello World";
SelectFirstDay controlElement = new SelectFirstDay(
new List<FormatElementBase>()
{
new Items("hello"),
new Items("world")
}
);
CustomText formatElement = new CustomText();
formatElement.Content = testString;
Settings settings = new Settings(testName, new List<ElementBase>()
{
controlElement,
formatElement
}
);
settings.ReferenceStyle = zaaReloaded2.Formatter.ReferenceStyle.IfSpecialItem;
return settings;
}
Settings CreateTestSettings2()
{
string testName = "another test name";
SelectFirstDay controlElement1 = new SelectFirstDay(
new List<FormatElementBase>()
{
new CustomText(),
}
);
SelectLastDay controlElement2 = new SelectLastDay(
new List<FormatElementBase>()
{
new Items("Items content"),
}
);
Settings settings = new Settings(testName, new List<ElementBase>()
{
controlElement1,
controlElement2
}
);
settings.ReferenceStyle = zaaReloaded2.Formatter.ReferenceStyle.IfSpecialOrAbnormal;
return settings;
}
}
}

View File

@ -41,6 +41,10 @@
<AssemblyOriginatorKeyFile>zaaReloaded2.pfx</AssemblyOriginatorKeyFile> <AssemblyOriginatorKeyFile>zaaReloaded2.pfx</AssemblyOriginatorKeyFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Bovender, Version=0.2.0.0, Culture=neutral, PublicKeyToken=df1c15557d8b6df8, processorArchitecture=MSIL">
<HintPath>..\packages\Bovender.0.2.0.0\lib\net40\Bovender.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Office.Interop.Word, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL"> <Reference Include="Microsoft.Office.Interop.Word, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
<EmbedInteropTypes>True</EmbedInteropTypes> <EmbedInteropTypes>True</EmbedInteropTypes>
</Reference> </Reference>
@ -48,10 +52,20 @@
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\NUnit.2.6.4\lib\nunit.framework.dll</HintPath> <HintPath>..\packages\NUnit.2.6.4\lib\nunit.framework.dll</HintPath>
</Reference> </Reference>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core"> <Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Runtime.Serialization.Formatters.Soap" />
<Reference Include="System.Windows.Interactivity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Expression.Blend.Sdk.1.0.2\lib\net40-client\System.Windows.Interactivity.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Xaml" />
<Reference Include="System.XML" />
<Reference Include="WindowsBase" />
</ItemGroup> </ItemGroup>
<Choose> <Choose>
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'"> <When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
@ -66,7 +80,9 @@
</Otherwise> </Otherwise>
</Choose> </Choose>
<ItemGroup> <ItemGroup>
<Compile Include="SerializationTest.cs" />
<Compile Include="Controller\SettingsRepositoryTest.cs" /> <Compile Include="Controller\SettingsRepositoryTest.cs" />
<Compile Include="Controller\SettingsTest.cs" />
<Compile Include="Formatter\DocumentWriterTest.cs" /> <Compile Include="Formatter\DocumentWriterTest.cs" />
<Compile Include="Thesaurus\ThesaurusTest.cs" /> <Compile Include="Thesaurus\ThesaurusTest.cs" />
<Compile Include="Controller\Elements\ItemsTest.cs" /> <Compile Include="Controller\Elements\ItemsTest.cs" />
@ -79,6 +95,9 @@
<Compile Include="Thesaurus\TestThesaurus.cs" /> <Compile Include="Thesaurus\TestThesaurus.cs" />
<Compile Include="Importer\ZaaImporter\TimePointTest.cs" /> <Compile Include="Importer\ZaaImporter\TimePointTest.cs" />
<Compile Include="TestHelpers.cs" /> <Compile Include="TestHelpers.cs" />
<Compile Include="ViewModels\ElementPickerViewModelTest.cs" />
<Compile Include="ViewModels\SettingsRepositoryViewModelTest.cs" />
<Compile Include="ViewModels\SettingsViewModelTest.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />

View File

@ -0,0 +1,54 @@
/* ElementPickerViewModelTest.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Bovender.Mvvm.ViewModels;
using zaaReloaded2.ViewModels;
namespace Tests.ViewModels
{
[TestFixture]
class ElementPickerViewModelTest
{
[Test]
public void ChooseElement()
{
ElementPickerViewModel vm = new ElementPickerViewModel(true);
ViewModelBase elementVM = vm.Categories.First().Children.First();
elementVM.IsSelected = true;
string expectedLabel = elementVM.DisplayString;
Assert.IsTrue(vm.ChooseElementCommand.CanExecute(null),
"Cannot execute ChooseElementCommand");
bool messageSent = false;
vm.ElementChosenMessage.Sent += (sender, args) =>
{
messageSent = true;
ViewModelBase messageContentVM = args.Content.ViewModel as ViewModelBase;
Assert.AreEqual(expectedLabel, messageContentVM.DisplayString);
};
vm.ChooseElementCommand.Execute(null);
Assert.IsTrue(messageSent, "No message was sent when element was chosen");
}
}
}

View File

@ -0,0 +1,77 @@
/* SettingsRepositoryViewModel.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using zaaReloaded2.Controller;
using zaaReloaded2.ViewModels;
namespace Tests.ViewModels
{
[TestFixture]
class SettingsRepositoryViewModelTest
{
SettingsRepositoryViewModel _vm;
const string TESTNAME = "hello world";
[SetUp]
public void SetUp()
{
SettingsRepository rep = new SettingsRepository();
rep.SettingsList.Add(new Settings(TESTNAME));
_vm = new SettingsRepositoryViewModel(rep);
}
[Test]
public void CanDeleteNonDefaultSettings()
{
_vm.SettingsList[_vm.SettingsList.Count - 1].IsSelected = true;
Assert.IsTrue(_vm.DeleteSettingsCommand.CanExecute(null));
}
[Test]
public void CannotDeleteDefaultSettings()
{
_vm.SettingsList[0].IsSelected = true;
Assert.IsFalse(_vm.DeleteSettingsCommand.CanExecute(null));
}
[Test]
public void CopySettings()
{
SettingsViewModel orig = _vm.SettingsList[0];
orig.IsSelected = true;
_vm.CopySettingsCommand.Execute(null);
SettingsViewModel copy = _vm.SettingsList[_vm.SettingsList.Count-1];
// Make sure we have a new object
Assert.AreNotSame(orig, copy);
Assert.AreNotSame(orig.RevealModelObject(), copy.RevealModelObject());
Assert.AreEqual(
String.Format(
"Kopie von {0}",
orig.Name.Replace(" (eingebaut)", String.Empty)
),
copy.Name);
Assert.IsTrue(copy.IsSelected);
}
}
}

View File

@ -0,0 +1,188 @@
/* SettingsViewModelTest.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using zaaReloaded2.ViewModels;
using zaaReloaded2.Controller;
using zaaReloaded2.Controller.Elements;
namespace Tests.ViewModels
{
[TestFixture]
class SettingsViewModelTest
{
SettingsViewModel _settingsVM;
[SetUp]
public void SetUp()
{
_settingsVM = new SettingsViewModel();
}
[Test]
public void AddElement()
{
bool messageSent = false;
Settings model = _settingsVM.RevealModelObject() as Settings;
int oldViewModelElementCount = _settingsVM.Elements.Count;
int oldModelElementCount = model.Elements.Count;
_settingsVM.AddElementMessage.Sent += (sender, args) =>
{
messageSent = true;
ElementPickerViewModel picker = args.Content.ViewModel as ElementPickerViewModel;
Assert.IsNotNull(picker, "ViewModel in MessageContent is not an ElementPickerViewModel");
picker.Categories.First().Children.First().IsSelected = true;
picker.ChooseElementCommand.Execute(null);
};
_settingsVM.AddElementCommand.Execute(null);
Assert.IsTrue(messageSent, "Message was not sent");
Assert.AreEqual(oldViewModelElementCount + 1, _settingsVM.Elements.Count,
"Count of elements in ViewModel was not increased by 1");
Assert.AreEqual(oldModelElementCount + 1, model.Elements.Count,
"Count of elements in settings Model was not increased by 1");
}
[Test]
public void AddChildElement()
{
bool messageSent = false;
SelectEachDay model = new SelectEachDay();
ControlElementViewModel viewModel = new ControlElementViewModel(model);
_settingsVM.AddElementViewModel(viewModel);
viewModel.IsSelected = true;
int oldViewModelChildrenCount = viewModel.Elements.Count;
int oldModelChildrenCount = model.Children.Count;
_settingsVM.AddChildElementMessage.Sent += (sender, args) =>
{
messageSent = true;
ElementPickerViewModel picker = args.Content.ViewModel as ElementPickerViewModel;
Assert.IsNotNull(picker, "ViewModel in MessageContent is not an ElementPickerViewModel");
picker.Categories.First().Children.First().IsSelected = true;
Assert.IsTrue(picker.ChooseElementCommand.CanExecute(null),
"Cannot execute element picker's ChooseElementCommand.");
picker.ChooseElementCommand.Execute(null);
};
_settingsVM.AddChildElementCommand.Execute(null);
Assert.IsTrue(messageSent, "Message was not sent");
Assert.AreEqual(oldViewModelChildrenCount + 1, viewModel.Elements.Count,
"Count of children in ViewModel was not increased by 1");
Assert.AreEqual(oldModelChildrenCount + 1, model.Children.Count,
"Count of children in Model was not increased by 1");
}
[Test]
public void CannotAddChildElementToFormatElement()
{
ControlElementViewModel parent = new ControlElementViewModel(
new SelectFirstDay());
_settingsVM.AddElementViewModel(parent);
parent.IsSelected = true;
Assert.IsTrue(_settingsVM.AddChildElementCommand.CanExecute(null));
FormatElementViewModel child = new FormatElementViewModel(new Items());
_settingsVM.AddChildElementViewModel(parent, child);
parent.IsSelected = false;
child.IsSelected = true;
Assert.IsFalse(_settingsVM.AddChildElementCommand.CanExecute(null));
}
[Test]
public void DeleteElement()
{
Settings settings = new Settings();
settings.AddElement(new SelectFirstDay());
settings.AddElement(new SelectEachDay());
settings.AddElement(new SelectLastDay());
SettingsViewModel settingsVM = new SettingsViewModel(settings);
int oldCount = settingsVM.Elements.Count;
ElementViewModel elementVM = settingsVM.Elements.First();
ElementBase element = elementVM.RevealModelObject() as ElementBase;
Assert.IsTrue(settings.Elements.Contains(element),
"Settings object does not contain the model that the VM revealed?!");
elementVM.IsSelected = true;
Assert.IsTrue(settingsVM.DeleteElementCommand.CanExecute(null),
"DeleteElementCommand should be enabled.");
settingsVM.DeleteElementCommand.Execute(null);
Assert.AreEqual(oldCount - 1, settingsVM.Elements.Count);
Assert.IsFalse(settingsVM.Elements.Contains(elementVM),
"Elements collection still contains the deleted element view model.");
Assert.IsFalse(settings.Elements.Contains(element),
"Settings' Element collection still contains the element model.");
}
[Test]
public void DeleteChildElement()
{
Settings settings = new Settings();
settings.AddElement(new SelectFirstDay(new Items()));
settings.AddElement(new SelectEachDay());
settings.AddElement(new SelectLastDay());
SettingsViewModel settingsVM = new SettingsViewModel(settings);
ControlElementViewModel parent = ((ControlElementViewModel)settingsVM.Elements.First());
int oldCount = parent.Elements.Count;
ElementViewModel elementVM = ((ControlElementViewModel)settingsVM.Elements.First())
.Elements.First();
ElementBase element = elementVM.RevealModelObject() as ElementBase;
Assert.IsTrue(((ControlElementBase)settings.Elements[0]).Children.Contains(element),
"Settings object does not contain the model that the VM revealed?!");
elementVM.IsSelected = true;
Assert.IsTrue(settingsVM.DeleteElementCommand.CanExecute(null),
"DeleteElementCommand should be enabled.");
settingsVM.DeleteElementCommand.Execute(null);
Assert.AreEqual(oldCount - 1, parent.Elements.Count);
Assert.IsFalse(parent.Elements.Contains(elementVM),
"Elements collection still contains the deleted element view model.");
Assert.IsFalse(((ControlElementBase)settings.Elements[0]).Children.Contains(element),
"Settings' collection of FormatElement children still contains the element model.");
}
[Test]
public void CopyElement()
{
string testString = "this text should be duplicated";
_settingsVM.AddElementViewModel(
new ControlElementViewModel(new SelectEachDay(new Items(testString))));
int oldCount = _settingsVM.Elements.Count;
_settingsVM.Elements.First().IsSelected = true;
Assert.IsTrue(_settingsVM.CopyElementCommand.CanExecute(null),
"CopyElementCommand should be enabled.");
_settingsVM.CopyElementCommand.Execute(null);
Assert.AreEqual(oldCount + 1, _settingsVM.Elements.Count);
// Access the first element
ControlElementViewModel controlVM = _settingsVM.Elements.First() as ControlElementViewModel;
FormatElementViewModel formatVM = controlVM.Elements.First() as FormatElementViewModel;
Items items = formatVM.RevealModelObject() as Items;
Assert.IsNotNull(items,
"Child ViewModel of first ControlElementViewModel does not wrap Items object.");
Assert.AreEqual(testString, items.Content,
"First control element's child element has incorrect Content string.");
// Access the second element
controlVM = _settingsVM.Elements.Last() as ControlElementViewModel;
formatVM = controlVM.Elements.First() as FormatElementViewModel;
items = formatVM.RevealModelObject() as Items;
Assert.IsNotNull(items,
"Child ViewModel of last ControlElementViewModel does not wrap Items object.");
Assert.AreEqual(testString, items.Content,
"First control element's child element has incorrect Content string.");
}
}
}

View File

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Bovender" version="0.2.0.0" targetFramework="net40" />
<package id="Expression.Blend.Sdk" version="1.0.2" targetFramework="net40" />
<package id="NUnit" version="2.6.4" targetFramework="net40" /> <package id="NUnit" version="2.6.4" targetFramework="net40" />
</packages> </packages>

BIN
gimp/d.xcf Normal file

Binary file not shown.

BIN
gimp/dk.xcf Normal file

Binary file not shown.

BIN
gimp/down.xcf Normal file

Binary file not shown.

BIN
gimp/duplicate.xcf Normal file

Binary file not shown.

BIN
gimp/exit.xcf Normal file

Binary file not shown.

BIN
gimp/export.xcf Normal file

Binary file not shown.

BIN
gimp/fff.xcf Normal file

Binary file not shown.

BIN
gimp/gear.xcf Normal file

Binary file not shown.

BIN
gimp/icon.xcf Normal file

Binary file not shown.

BIN
gimp/import.xcf Normal file

Binary file not shown.

Binary file not shown.

BIN
gimp/installbanner.xcf Normal file

Binary file not shown.

BIN
gimp/minus.xcf Normal file

Binary file not shown.

BIN
gimp/pen.xcf Normal file

Binary file not shown.

BIN
gimp/plus-child.xcf Normal file

Binary file not shown.

BIN
gimp/plus.xcf Normal file

Binary file not shown.

BIN
gimp/reset.xcf Normal file

Binary file not shown.

BIN
gimp/up.xcf Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

View File

@ -1,345 +1,120 @@
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff41\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1031\deflangfe1031\themelang1031\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} {\rtf1\ansi\deff4\adeflang1025
{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f40\fbidi \fswiss\fcharset128\fprq2{\*\panose 00000000000000000000}Liberation Sans{\*\falt Arial};}{\f41\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0502040204020203}Segoe UI;} {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\fswiss\fprq2\fcharset128 Liberation Sans{\*\falt Arial};}{\f5\fswiss\fprq2\fcharset128 Segoe UI;}{\f6\fswiss\fprq2\fcharset128 Calibri;}{\f7\fnil\fprq2\fcharset0 Times New Roman;}{\f8\fswiss\fprq2\fcharset128 FreeSans;}{\f9\fnil\fprq2\fcharset0 Calibri;}}
{\f43\fbidi \fswiss\fcharset128\fprq2{\*\panose 00000000000000000000}@Liberation Sans;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} {\colortbl;\red0\green0\blue0;\red0\green0\blue128;\red128\green128\blue128;}
{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} {\stylesheet{\s0\snext0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031 Normal;}
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} {\*\cs15\snext15 Default Paragraph Font;}
{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} {\*\cs16\snext16\cf2\ul\ulc0\langfe255\lang255 Internet Link;}
{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f44\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f45\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} {\s17\sbasedon0\snext18\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb240\sa120\keepn\ltrpar\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs28\alang1081\loch\f4\fs28\lang1031 Heading;}
{\f47\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f48\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f49\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f50\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} {\s18\sbasedon0\snext18\sl288\slmult1\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa140\ltrpar\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031 Text Body;}
{\f51\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f52\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f44\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f45\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} {\s19\sbasedon18\snext19\sl288\slmult1\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa140\ltrpar\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f4\fs22\lang1031 List;}
{\f47\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f48\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f49\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f50\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} {\s20\sbasedon0\snext20\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb120\sa120\noline\ltrpar\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af8\afs24\alang1081\ai\loch\f4\fs20\lang1031 Caption;}
{\f51\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f52\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f414\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f415\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} {\s21\sbasedon0\snext21\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs20\alang1081\loch\f4\fs20\lang1031 Index;}
{\f417\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f418\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f421\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f422\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);} {\s22\snext22\sl276\slmult1\ql\widctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa200\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\dbch\af7\langfe1031\dbch\af9\afs22\alang1025\cf0\kerning1\loch\f6\fs22\lang1031 DocumentMap;}
{\f454\fbidi \fswiss\fcharset238\fprq2 Segoe UI CE;}{\f455\fbidi \fswiss\fcharset204\fprq2 Segoe UI Cyr;}{\f457\fbidi \fswiss\fcharset161\fprq2 Segoe UI Greek;}{\f458\fbidi \fswiss\fcharset162\fprq2 Segoe UI Tur;} {\s23\sbasedon0\snext23\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb120\sa120\ltrpar\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs20\alang1081\ai\loch\f4\fs20\lang1031 caption;}
{\f460\fbidi \fswiss\fcharset178\fprq2 Segoe UI (Arabic);}{\f461\fbidi \fswiss\fcharset186\fprq2 Segoe UI Baltic;}{\f462\fbidi \fswiss\fcharset163\fprq2 Segoe UI (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} }{\*\generator LibreOffice/4.4.2.2$Linux_X86_64 LibreOffice_project/40m0$Build-2}{\info{\author Daniel Kraus}{\creatim\yr2015\mo1\dy28\hr17\min3}{\author Daniel Kraus}{\revtim\yr2015\mo7\dy28\hr18\min16}{\printim\yr0\mo0\dy0\hr0\min0}}\deftab720\deftab720
{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} \viewscale150
{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} {\*\pgdsctbl
{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} {\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Default Style;}}
{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} \formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} {\*\ftnsep}\pgndec\pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs18\alang1081\ai\rtlch \ltrch\loch\fs18\lang1033
{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} zaaReloaded2 ist mit der \uc2 \u8220\'81\'67Apache 2.0 License\u8221\'81\'68 lizensiert.\uc1 }{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs18\alang1081\ai\rtlch \ltrch\loch\fs18\lang1033
{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} }{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs18\alang1081\ai\rtlch \ltrch\loch\fs18\lang1033
{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} Diese Lizenz erlaubt kostenfreie Nutzung und schlie\u223\'3ft jedwede Haftung aus. Bitte lesen Sie sich den unten stehenden Lizenztext vor der Nutzung genau durch und stimmen Sie den Bedingungen zu.}
{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} Diese Software enth\u228\'3flt Code von Dritten:}
{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} DLLs }{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} der}{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} Visual Studio Tools for Office }{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} Laufzeit und des }{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} Expression Blend }{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} S}{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} oftware }{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} D}{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; evelopment }{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp K}{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ it}{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\ql \li0\ri0\sa170\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af41\afs22\alang1081 \ltrch\fcs0 \fs22\cf1\lang1031\langfe1031\kerning1\loch\f41\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 \snext0 \sqformat \spriority0 Normal;}{\* s}{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* (SDK), \u169\'3f }{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 C}{\cf1\i\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1031\langfe1031\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1031\langfenp1031 \snext11 \ssemihidden \sunhideused opyright Microsoft Corporation.}
Normal Table;}{\*\cs15 \additive \ul\cf9\lang255\langfe255\langnp255\langfenp255\ulc1 Internet Link;}{\s16\ql \li0\ri0\sb240\sa120\keepn\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs28\alang1081 \ltrch\fcs0 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qc\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
\fs28\cf1\lang1031\langfe1031\kerning1\loch\f40\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext17 Heading;}{\s17\ql \li0\ri0\sa140\sl288\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af41\afs22\alang1081 \uc2 \u8212\'81\'5c\u8212\'81\'5c\u8212\'81\'5c\u8212\'81\'5c\u8212\'81\'5c\uc1 }
\ltrch\fcs0 \fs22\cf1\lang1031\langfe1031\kerning1\loch\f41\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext17 Text Body;}{\s18\ql \li0\ri0\sa140\sl288\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qc\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\af40\afs22\alang1081 \ltrch\fcs0 \fs22\cf1\lang1031\langfe1031\kerning1\loch\f40\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 \sbasedon17 \snext18 List;}{\s19\ql \li0\ri0\sb120\sa120\nowidctlpar\noline\wrapdefault\faauto\rin0\lin0\itap0 Apache License}{\rtlch \ltrch\loch
\rtlch\fcs1 \ai\af40\afs20\alang1081 \ltrch\fcs0 \i\fs20\cf1\lang1031\langfe1031\kerning1\loch\f40\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext19 \sqformat caption;}{ \line }{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\s20\ql \li0\ri0\sa170\nowidctlpar\noline\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af40\afs20\alang1081 \ltrch\fcs0 \fs20\cf1\lang1031\langfe1031\kerning1\loch\f40\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 \sbasedon0 \snext20 Index;}} Version 2.0, January 2004}
{\*\rsidtbl \rsid4605650\rsid15302586}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Daniel Kraus}{\operator Daniel Kraus}{\creatim\yr2015\mo1\dy28\hr17\min3} \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qc\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{{\field{\*\fldinst HYPERLINK "http://www.apache.org/licenses/" }{\fldrslt {\cf2\ul\ulc0\langfe255\lang255\cf2\ul\ulc0\kerning1\dbch\af7\langfe255\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang255
{\revtim\yr2015\mo1\dy28\hr17\min5}{\version2}{\edmins0}{\nofpages3}{\nofwords1381}{\nofchars8701}{\nofcharsws10062}{\vern49247}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} http://www.apache.org/licenses/}}}}
\paperw12240\paperh15840\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\formshade\horzdoc\dghspace120\dgvspace120 TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION}
\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale150\rsidroot4605650 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\af41\afs22\alang1081 \ltrch\fcs0 \fs22\cf1\lang1031\langfe1031\kerning1\loch\af41\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 {\rtlch\fcs1 \af31507\afs24\alang1025 \ltrch\fcs0 \fs24\cf0\kerning0\loch\af40\dbch\af40\insrsid15302586 1. Definitions}{\cf1\kerning1\dbch\af7\langfe1031\dbch\af7\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af41\afs22\alang1081 \ltrch\fcs0 \fs22\cf1\lang1031\langfe1031\kerning1\loch\af41\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 { .}
\rtlch\fcs1 \af41 \ltrch\fcs0 \insrsid15302586 \chftnsepc \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af41\afs22\alang1081 \ltrch\fcs0 \fs22\cf1\lang1031\langfe1031\kerning1\loch\af41\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 { \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\rtlch\fcs1 \af41 \ltrch\fcs0 \insrsid15302586 \chftnsep License\uc2 \u8221\'81\'68 shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\uc1 }
\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af41\afs22\alang1081 \ltrch\fcs0 \fs22\cf1\lang1031\langfe1031\kerning1\loch\af41\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 { \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
\rtlch\fcs1 \af41 \ltrch\fcs0 \insrsid15302586 \chftnsepc \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\par }}\ltrpar \sectd \ltrsect\sbknone\linex0\sectunlocked1\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang Licensor\uc2 \u8221\'81\'68 shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\uc1 }
{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\qj \li0\ri0\sa40\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid4605650 \rtlch\fcs1 \af41\afs22\alang1081 \ltrch\fcs0 \fs22\cf1\lang1031\langfe1031\kerning1\loch\af41\hich\af31506\dbch\af0\cgrid\langnp1031\langfenp1031 {\rtlch\fcs1 Legal Entity\uc2 \u8221\'81\'68 shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \u8220\'81\'67control\u8221\'81\'68 means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\uc1 }
\ai\af41\afs18 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Daniel}{\rtlch\fcs1 \ai\af41\afs18 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
\loch\af41\dbch\af0\hich\f31506 \rquote }{\rtlch\fcs1 \ai\af41\afs18 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 s XL Toolbox NG is distributed under the A \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\hich\af31506\dbch\af0\loch\f41 pache License, Version 2.0, which allows you to use this add-in free of charge in any environment (e.g., academic or commercial), but does not give any warranty. Please see the license text below for details.}{\rtlch\fcs1 You\uc2 \u8221\'81\'68 (or \u8220\'81\'67Your\u8221\'81\'68) shall mean an individual or Legal Entity exercising permissions granted by this License.\uc1 }
\af41 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 The add-in contains code whose copyright is own\hich\af31506\dbch\af0\loch\f41 ed by others:}{\rtlch\fcs1 \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 Source\uc2 \u8221\'81\'68 form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\uc1 }
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
DLLs from the Visual Studio Tools for Office runtime and the Expression Blend software development kit (SDK) are }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\loch\af41\dbch\af0\hich\f31506 \'a9}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 copyright Microsoft Corporation.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 Object\uc2 \u8221\'81\'68 form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\uc1 }
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 The FreeImage library is }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'a9}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Work\uc2 \u8221\'81\'68 shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\uc1 }
copyright Herv}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'e9}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
\i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Drolon and others and is used under the FreeImage P\hich\af31506\dbch\af0\loch\f41 \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
ublic License (FIPL). The source code of the FreeImage library is available at }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Derivative Works\uc2 \u8221\'81\'68 shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\uc1 }
HYPERLINK "http://freeimage.sf.net" }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \insrsid4605650 {\*\datafield \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b4a00000068007400740070003a002f002f00660072006500650069006d006100670065002e00730066002e006e00650074002f000000795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt { \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\ul\cf9\lang255\langfe255\langnp255\langfenp255\ulc1\insrsid15302586 \hich\af31506\dbch\af0\loch\f41 http://freeimage.sf.net}}}\sectd \ltrsect\sbknone\linex0\sectunlocked1\sectdefaultcl\sftnbj {\rtlch\fcs1 Contribution\uc2 \u8221\'81\'68 shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \u8220\'81\'67submitted\u8221\'81\'68 means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \u8220\'81\'67Not a Contribution.\u8221\'81\'68\uc1 }
\af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 and in the XL Toolbox code repository at }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1033
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 HYPERLINK "http://sf.net/p/xltoolbox/ng-code" }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \insrsid4605650 {\*\datafield \uc2 \u8220\'81\'67\uc1 }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5c00000068007400740070003a002f002f00730066002e006e00650074002f0070002f0078006c0074006f006f006c0062006f0078002f006e0067002d0063006f00640065000000795881f43b1d7f48af2c825dc485 Contributor\uc2 \u8221\'81\'68 shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\uc1 }
276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\ul\cf9\lang255\langfe255\langnp255\langfenp255\ulc1\insrsid15302586 \hich\af31506\dbch\af0\loch\f41 http://sf.net/p/xltoolbox/n\hich\af31506\dbch\af0\loch\f41 g-code}}} \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\sectd \ltrsect\sbknone\linex0\sectunlocked1\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 .}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 2. Grant of Copyright License}{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\i\fs18\lang1033\langfe1031\langnp1033\insrsid15302586 . Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.}
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid4605650 \hich\af31506\dbch\af0\loch\f41 The LittleCMS2 library is }{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\i\fs18\lang1033\langfe1031\langnp1033\insrsid4605650\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'a9}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid4605650\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 copyright 3. Grant of Patent License}{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid4605650 \hich\af31506\dbch\af0\loch\f41 }{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid4605650\charrsid4605650 . Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.}
\hich\af31506\dbch\af0\loch\f41 Marti Maria Saguer}{\rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \i\fs18\lang1033\langfe1031\langnp1033\insrsid4605650 \hich\af31506\dbch\af0\loch\f41 and is used under the MIT license.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\lang1033\langfe1031\langnp1033\insrsid4605650\charrsid4605650 4. Redistribution}{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\par }\pard \ltrpar\qc \li0\ri0\sa40\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid4605650 {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \emdash \emdash . You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:}
\emdash \emdash \emdash }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li360\ri0\lin360\rin0\fi-360\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Apache License}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 1.\tab You must give any other recipients of the Work or Derivative Works a copy of this License; and}
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \line }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Version 2.0, January 2004}{ \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li360\ri0\lin360\rin0\fi-360\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 2.\tab You must cause any modified files to carry prominent notices stating that You changed the files; and}
\par }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 HYPERLINK "http://www.apache.org/licenses/" }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li360\ri0\lin360\rin0\fi-360\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\insrsid4605650 {\*\datafield 3.\tab You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and}
00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5800000068007400740070003a002f002f007700770077002e006100700061006300680065002e006f00720067002f006c006900630065006e007300650073002f000000795881f43b1d7f48af2c825dc48527630000 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li360\ri0\lin360\rin0\fi-360\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
0000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\ul\cf9\lang255\langfe255\langnp255\langfenp255\ulc1\insrsid15302586 \hich\af31506\dbch\af0\loch\f41 http://www.apache.org/licenses/}}}\sectd \ltrsect 4.\tab If the Work includes a \uc2 \u8220\'81\'67NOTICE\u8221\'81\'68 text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\uc1 }{\rtlch \ltrch\loch
\sbknone\linex0\sectunlocked1\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \line \line }{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\par }\pard \ltrpar\qj \li0\ri0\sa40\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid4605650 {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.}
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 1. Definitions}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 5. Submission of Contributions}{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 .}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 . Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.}
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 License}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94} 6. Trademarks}{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 shall mean the terms and conditi\hich\af31506\dbch\af0\loch\f41 . This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.}
ons for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 7. Disclaimer of Warranty}{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Licensor}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94 . Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \uc2 \u8220\'81\'67AS IS\u8221\'81\'68 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. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\uc1 }
}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.}{ \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 8. Limitation of Liability}{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 . In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.}
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Legal Entity}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qj\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\b\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
\'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 shall mean the union of the \hich\af31506\dbch\af0\loch\f41 9. Accepting Warranty or Additional Liability}{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\loch\fs18\lang1033
acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 . While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.}
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 control} \par \pard\plain \s0\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa170\ltrpar{\*\hyphen2\hyphlead0\hyphtrail4\hyphmax0}\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs22\alang1081\loch\f5\fs22\lang1031\qc\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb0\sa40{\cf1\kerning1\dbch\af7\langfe1031\dbch\af9\afs24\alang1081\rtlch \ltrch\fs18\lang1031
{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \uc2 \u8212\'81\'5c\u8212\'81\'5c\u8212\'81\'5c\u8212\'81\'5c\u8212\'81\'5c\uc1 }
\hich\af31506\dbch\af0\loch\f41 means (i) the power, direct or indirect, to cause the direction or management of such entity,\hich\af31506\dbch\af0\loch\f41 \par }
whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 You}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94}{
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 (or }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Your}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
) shall mean an individual or Legal Entity exercising permissions granted by this L\hich\af31506\dbch\af0\loch\f41 icense.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Source}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94}{
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Object}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94}{
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 form shall mean any form resulting from mechanical transformation or tr\hich\af31506\dbch\af0\loch\f41
anslation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Work}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94}{
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).}{\rtlch\fcs1
\af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Derivative Works}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\loch\af41\dbch\af0\hich\f31506 \'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 shall \hich\af31506\dbch\af0\loch\f41
mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes o
\hich\af31506\dbch\af0\loch\f41 f\hich\af31506\dbch\af0\loch\f41 this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.}{
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Contribution}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506
\'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 shall mean any work of authorship, including the original versi\hich\af31506\dbch\af0\loch\f41
on of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of
\hich\af31506\dbch\af0\loch\f41 t\hich\af31506\dbch\af0\loch\f41 he copyright owner. For the purposes of this definition, }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 submitted}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source \hich\af31506\dbch\af0\loch\f41
code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the co
\hich\af31506\dbch\af0\loch\f41 p\hich\af31506\dbch\af0\loch\f41 yright owner as }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1
\af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Not a Contribution.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 Contributor}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506
\'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 2. Grant of Copyright License}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicl
\hich\af31506\dbch\af0\loch\f41 y\hich\af31506\dbch\af0\loch\f41 perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 3. Grant of Patent License}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 . Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
\hich\af31506\dbch\af0\loch\f41
no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contrib
\hich\af31506\dbch\af0\loch\f41 u\hich\af31506\dbch\af0\loch\f41
tor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or count
\hich\af31506\dbch\af0\loch\f41 e\hich\af31506\dbch\af0\loch\f41
rclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such
\hich\af31506\dbch\af0\loch\f41 \hich\af31506\dbch\af0\loch\f41 litigation is filed.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 4. Redistribution}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }\pard \ltrpar\qj \fi-360\li360\ri0\sa40\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0\pararsid4605650 {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 1.\tab
You must\hich\af31506\dbch\af0\loch\f41 give any other recipients of the Work or Derivative Works a copy of this License; and}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 2.\tab You must cause any modified files to carry prominent notices stating that You changed the files; and}{
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 3.\tab You must retain, in the Source form of any Derivative Works th\hich\af31506\dbch\af0\loch\f41
at You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 4.\tab If the Work includes a }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 NOTICE}{
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\hich\af31506\dbch\af0\loch\f41 text file as part of its \hich\af31506\dbch\af0\loch\f41
distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the
\hich\af31506\dbch\af0\loch\f41 f\hich\af31506\dbch\af0\loch\f41
ollowing places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such thir
\hich\af31506\dbch\af0\loch\f41 d\hich\af31506\dbch\af0\loch\f41
-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOT
\hich\af31506\dbch\af0\loch\f41 I\hich\af31506\dbch\af0\loch\f41 CE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\line \line
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions fo\hich\af31506\dbch\af0\loch\f41 r\hich\af31506\dbch\af0\loch\f41
use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.}{\rtlch\fcs1
\af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }\pard \ltrpar\qj \li0\ri0\sa40\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid4605650 {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
5. Submission of Contributi\hich\af31506\dbch\af0\loch\f41 ons}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the a
\hich\af31506\dbch\af0\loch\f41 bove, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 6. Trademarks}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 . This License does not grant permission to use the trade names, trademarks, service m\hich\af31506\dbch\af0\loch\f41
arks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 7. Disclaimer of Warranty}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 . Unless required by applicable law or agreed to in wr\hich\af31506\dbch\af0\loch\f41
iting, Licensor provides the Work (and each Contributor provides its Contributions) on an }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \loch\af41\dbch\af0\hich\f31506 \'93}{\rtlch\fcs1
\af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 AS IS}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\loch\af41\dbch\af0\hich\f31506 \'94}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFR\hich\af31506\dbch\af0\loch\f41
INGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.}{
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 8. Limi\hich\af31506\dbch\af0\loch\f41 tation of Liability}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41
. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be
\hich\af31506\dbch\af0\loch\f41
liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of
\hich\af31506\dbch\af0\loch\f41 g\hich\af31506\dbch\af0\loch\f41 oodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.}{
\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \b\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 9. Accepting Warranty or Additional Liability}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0
\fs18\lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650 \hich\af31506\dbch\af0\loch\f41 . While redistributing t\hich\af31506\dbch\af0\loch\f41
he Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act
\hich\af31506\dbch\af0\loch\f41 o\hich\af31506\dbch\af0\loch\f41
nly on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by r
\hich\af31506\dbch\af0\loch\f41 e\hich\af31506\dbch\af0\loch\f41 ason of your accepting any such warranty or additional liability.}{\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \lang1033\langfe1031\langnp1033\insrsid15302586\charrsid4605650
\par }\pard \ltrpar\qc \li0\ri0\sa40\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid4605650 {\rtlch\fcs1 \af31507\afs24 \ltrch\fcs0 \fs18\insrsid15302586 \loch\af41\dbch\af0\hich\f31506 \emdash \emdash \emdash \emdash \emdash }{\rtlch\fcs1
\af31507\afs24 \ltrch\fcs0 \insrsid15302586
\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210060ffbff5a4060000a21b0000160000007468656d652f7468656d652f
7468656d65312e786d6cec594f6f1b4514bf23f11d467b6f6327761a4775aad8b11b6852a2d82dea71bc3bde9d66766735334eea1b6a8f484888823850891b07
04546a252ee5d3048aa048fd0abc99d95defc46b92b411ada039b4f6ec6fdefff79b37ebabd7eec50c1d1221294fda5efd72cd4324f1794093b0eddd1af62fad
79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607f22d771db8b944ad79796a40fcb585ee62949e0d9988b182bf82ac2a540e023901bb3a5e55a6d
7529c634f150826310bb830595127b1bb9dc1e03e189927ac16762a0a5920a707050d71039955d26d021666d0f7404fc6848ee290f312c153c687b35f3e72d6d
5c5dc2ebd926a616ec2dedeb9bbf6c5fb6213858363a45382a94d6fb8dd695ad42be0130358febf57add5ebd906700d8f7c1556b4b5966a3bf56efe4324b20fb
715e76b7d6ac355c7c49feca9ccdad4ea7d36c65b658a106643f36e6f06bb5d5c6e6b28337208b6fcee11b9dcd6e77d5c11b90c5afcee1fb575aab0d176f4011
a3c9c11c5a27b4dfcfa417903167db95f03580afd532f80c05d55094975631e6895a586c31becb451f101ac9b0a20952d3948cb10f25dcc5f14850ac35e07582
4b4fec922fe796b432247d4153d5f63e4c31b4c34cdecb673fbc7cf6041ddf7f7a7cffe7e3070f8eefff640539bbb671129677bdf8eef3bf1e7d82fe7cf2ed8b
875f56e36519ffdb8f9ffefacb17d540e89f9939cfbf7afcfbd3c7cfbffeec8fef1f56c037051e95e1431a13896e9223b4cf6370cc44c5b59c8cc4f9760c234c
cb3b369350e2046b2d15f27b2a72d037a79865d971ece8103782b705f04715f0fae4ae63f0201213452b34df886207b8cb39eb705119851b5a5729ccc3491256
2b1793326e1fe3c32add5d9c38f9ed4d5260cebc2c1dc7bb1171ccdc63385138240951483fe30784547877875227aebbd4175cf2b1427728ea605a1992211d39
d534dbb44d63c8cbb4ca67c8b7139bdddba8c35995d75be4d0454257605661fc9030278cd7f144e1b84ae410c7ac1cf01daca22a230753e197713da920d32161
1cf502a2cfb4f9d2ff4880bfa5a4dfc040599569df65d3d8450a450faa64ee60cecbc82d7ed08d709c5661073489cad80fe4019428467b5c55c177b9db21fa3b
e401270bd37d9b1227dda7b3c12d1a3a26cd0a443f99888a285e27dca9dfc1948d31315403acee70754c937f226e4681b9ad868b236ea0cae7df3caab0fb6da5
ec4d38bdaa7a66fb04512fc29da4e72e17017dfbd9790b4f923d020d31dfa7efc8f91d397bff79725ed4cf174fc933160682d6b3889db4cddc1d2f1ebbc794b1
819a32b223cde42de1f009fab0a8379afb2629ee6169041f752b830607170a6cf620c1d5c754458308a730b5d73d2d249499e850a2944bb82e9ae54ad91a0f93
bfb297cda6be8658ea9058edf2c02eafe8e5fcb65188315685e64e9b2b5ad102ceaa6ce54a26147c7b1565756dd499b5d58d6986151d6d85cb3ac4e65e0e212f
5c83c5229a30d520988520caab70e3d7aae1b683190974dc6d8ef2b4982c5c648a64840392e548fb3d9fa3ba49525e2b738e683f6c31e8abe329512b696b69b1
afa1ed2c492aab6b2c509767ef75b29457f02c4b20ed643bb2a4dc9c2c41476dafd55c6e7ac8c769db1bc345193ec629645dea4112b3105e35f94ad8b23fb599
4d97cfb2d9ca1d739ba00e2f3f6cdce71c76782015526d6119d9d2308fb2126089d664ed5f6e42582fca810a363a9b152b6b500c6fcc0a88a39b5a321e135f95
935d5ad1b1b35f332ae51345c4200a8ed0884dc43e86f4eb52057f022ae17d876104fd05decee9689b472e39674d577e276670761db334c219ddea16cd3bd9c2
0d211536986f25f3c0b74adb8d73e777c5b4fc05b9522ee3ff992bfa3c81d70f2b81ce800f2f860546ba53da1e172ae2c0426944fdbe80c9c17007540bbce185
c75054f07adafc2fc8a1fedff69c9561da1a6e916a9f864850388f542408d9035a32d5778ab07a767659912c13642aaa64ae4cadd9237248d85073e0aa3edb3d
1441a91b36c968c0e04ed69ffb3deba051a8879c72bf394c569cbdb607feedc9c7363338e5f2b01968f2f8172616e3c1ec54b5fbcdf6fcec2d3ba21fccc6ac46
de15a0ac7414b4b2b67f4513ce79d45ac69af378b9991b07599cf718168b812885974848ff03e71f153e23a68cf5813ae4fbc0ad087ebed0c2a06ca0aa2fd9c1
036982b48b23189ceca22d262dca86361b9d74d4f2c3fa8227dd42ef89606bcbce92ef7306bb18ce5c754e2f5e64b0b3083bb1b66b0b430d993dd9a2b034ce6f
322631e647b2f28f597c741712bd053f1a4c9892a698e0972a8161861e983e80e6b71acdd68dbf010000ffff0300504b0304140006000800000021000dd1909f
b60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f
6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b0
60828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509a
ffb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000
001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c000
0000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c
00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210060ffbf
f5a4060000a21b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021
000dd1909fb60000001b0100002700000000000000000000000000ae0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000a90a00000000}
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;
\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;
\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7;
\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdlocked0 caption;\lsdunhideused0 \lsdlocked0 List;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;
\lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;
\lsdunhideused0 \lsdlocked0 Revision;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;
\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;
\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;
\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e500000000000000000000000010db
9f3f143bd001feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000105000000000000}}

View File

@ -67,9 +67,9 @@ AppSupportURL=http://zaa.nephrowiki.de
AppUpdatesURL=http://zaa.nephrowiki.de AppUpdatesURL=http://zaa.nephrowiki.de
; Setup wizard ; Setup wizard
;SetupIconFile=setup-files\xltoolbox.ico SetupIconFile=setup-files\icon.ico
;WizardImageFile=setup-files\installbanner.bmp WizardImageFile=setup-files\installbanner.bmp
;WizardSmallImageFile=setup-files\icon-48.bmp WizardSmallImageFile=setup-files\installbanner-small.bmp
ArchitecturesAllowed=x86 x64 ArchitecturesAllowed=x86 x64
ArchitecturesInstallIn64BitMode=x64 ArchitecturesInstallIn64BitMode=x64
DisableProgramGroupPage=true DisableProgramGroupPage=true

1
www/PHPMailer Submodule

Submodule www/PHPMailer added at 1193eb9d28

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
www/img/elementpicker.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
www/img/nachher.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
www/img/ribbon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
www/img/stilauswahl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
www/img/stilbearbeiten.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
www/img/vorher.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@ -1,20 +1,186 @@
<html> <html>
<head> <head>
<title>zaaReloaded2 by Daniel Kraus</title> <title>zaaReloaded2 by Daniel Kraus</title>
<meta charset="utf-8">
<meta name="author" content="Daniel Kraus">
<style type="text/css"><!--
* {
font-family: Arial; font-size: 16px; line-height: 125%;
color: #333;
}
body { margin: 16px 24px; max-width: 800px; }
h1, h2 { color: #5e2750; }
h1 { font-size: 300%; margin: 48px 0 24px 0; }
h2 { font-size: 200%; margin: 32px 0 16px 0; }
p { text-align: justify; }
img {
box-shadow: 2px 2px 8px #444;
}
.download {
width: 500px; margin: 16px auto;
padding: 8px; border: 1px solid #888;
box-shadow: 2px 2px 8px #444;
background-color: #eef;
}
.float-right {
float: right;
margin: 8px 0 8px 16px;
}
.center {
text-align: center;
}
.clear {
clear: both;
}
--></style>
</head> </head>
<body> <body>
<h1>zaaReloaded2</h1> <h1>zaaReloaded2</h1>
<p> <p style="font-weight: bold;">
Erweiterung für Microsoft&reg; Word 2010-2013, das die <a Erweiterung für Microsoft&reg; Word 2010-2013, das die <a
href="http://www.smi.ukw.de/sap-klinische-verfahren/archivsysteme/zentrale-arztbriefablage.html"> href="http://www.smi.ukw.de/sap-klinische-verfahren/archivsysteme/zentrale-arztbriefablage.html">
Zentrale Arztbriefablage (ZAA)</a> um Funktionen für das Formatieren Zentrale Arztbriefablage (ZAA)</a> um Funktionen für das Formatieren
von Laborwerten erweitert. von Laborwerten erweitert.
</p> </p>
<div class="download">
<h2 style="margin-top:0">Download</h2>
<p><a href="downloads/">zaa.nephrowiki.de/downloads</a></p>
</div>
<h2>Vorher</h2>
<p class="center"><img src="img/vorher.png" alt="Vorher" /></p>
<h2>Nachher</h2>
<p>Am Beispiel des Ambulanz-Stils:</p>
<p class="center"><img src="img/nachher.png" alt="Nachher" /></p>
<h2>Anleitung</h2>
<p class="center">
<img src="img/ribbon.png" alt="zaaReloaded2-Ribbon" />
</p>
<ol>
<li>Laborwerte auf üblichem Wege in einen Arztbrief einfügen
(alternativ kann der Befehl "Demo" ausgeführt werden, dann wird
ein Beispieldokument mit Laborwerten geöffnet).</li>
<li>Im zaaReloaded-Tab (s.o.) den linken Knopf "Formatieren"
klicken.</li>
<p class="center">
<img src="img/stilauswahl.png" alt="Stil auswählen" />
</p>
<li>
Beim ersten Mal erscheint eine Liste mit Stilen, aus der man den
gewünschten Stil auswählt (siehe Abbildung). Beim nächsten Mal,
wenn man auf diesen Knopf drückt, wird der zuletzt verwendete Stil
genommen.</li>
<li>Einen Moment warten... Voilà.</li>
</ol>
<h2 class="clear">Anpassen</h2>
<p>
Das Addin enthält einen Stil-Editor, mit dem die eingebauten Stile
bearbeitet und neue Stile entworfen werden können:
</p>
<p class="center">
<img src="img/stilbearbeiten.png" alt="Stil bearbeiten" />
</p>
<p class="clear">
<img src="img/elementpicker.png" alt="Elemente" class="float-right" />
Jeder Stil setzt sich aus sog. <i>Elementen</i> zusammen. Es gibt
<i>Steuerelemente</i>, die zum Beispiel für die Auswahl eines Tages
(erster Tag/letzter Tag) zuständig sind, und es gibt
<i>Ausgabeelemente</i>, die die eigentliche Formatierung und Ausgabe
der Laborwerte übernehmen.
</p>
<p>
Steuerelemente:
</p>
<ul>
<li>Ersten Tag auswählen</li>
<li>Letzten Tag auswählen</li>
<li>Jeden Tag nacheinander auswählen</li>
<li>Zwei Spalten einfügen/zur nächsten Spalte wechseln</li>
</ul>
<p>
Ausgabeelemente:
</p>
<ul>
<li>Laborparameter</li>
<li>Beliebiger Text</li>
</ul>
<p>
"Beliebiger Text" kann, wie der Name schon sagt, beliebigen Text
enthalten, der nicht weiter bearbeitet wird. Auf diese Weise kann
man z.B. Platzhalter für Urinsedimente ausgeben lassen, die dann
noch händisch vervollständigt werden.
</p>
<p>
"Laborparameter" enthalten eine durch Kommata getrennte Auflistung
von Parametern, die ausgegeben werden sollen. Jedes Element
"Laborparameter" kann optional einen Titel enthalten:
</p>
<p>
Beispiel:
</p>
<blockquote>
<p>
<img src="img/elementbearbeiten.png" alt="Element bearbeiten" />
</p>
<p>
Klinische Chemie: Na, K, Cl, (usw.)
</p>
</blockquote>
<p>
In diesem Fall ist "Klinische Chemie:" der optionale Titel.
</p>
<p>
Die Bezeichnungen der einzelnen Parameter sind fest einprogrammiert.
Teils decken sie sich mit den Bezeichnungen, wie sie in der
Zentralen Arztbriefablage erscheinen; teils sind sie aber auch
Surrogate (z.B. "eGFR (CKD-EPI)" anstatt "glomerul. Filtrationsr.
CKD-EP").
</p>
<p>
Die Platzhalter "SU-*", "U-*" und "*" geben die noch nicht
verwendeten Werte für Sammelurin, Spontanurin und alles weitere aus.
"*" sollte daher als letztes verwendet werden.
<p>
Die Liste der möglichen Parameternamen ist momentan fest
einprogrammiert und kann auch noch nicht angezeigt werden. Man kann
beim Entwickeln eines Stils aber probehalber den Platzhalter "*"
verwenden und sieht dann, welche Parameternamen noch verwendet
werden könnten.
</p>
<h2>Updates</h2>
<p>
Das Addin sucht täglich nach Updates und lädt und installiert diese
bei Bedarf im Hintergrund.
</p>
<h2>Weitere Informationen</h2> <h2>Weitere Informationen</h2>
<p><a href="doc/md_history.html">Versionsgeschichte</a></p> <p><a href="doc/md_HISTORY.html">Versionsgeschichte</a></p>
<p><a href="doc/index.html">Quellcode-Dokumentation</a></p> <p><a href="doc/index.html">Quellcode-Dokumentation</a></p>
<hr /> <hr />
<p>&copy; 2015 Daniel Kraus</p> <p>&copy; 2015 <a href="http://www.bovender.de">Daniel Kraus</a></p>
</body> </body>
<!-- vim: set tw=72 ai sts=2 ts=2 sw=2 : --> <!-- vim: set tw=72 ai sts=2 ts=2 sw=2 : -->
</html> </html>

53
www/postreport.php Normal file
View File

@ -0,0 +1,53 @@
<?php
require(__DIR__ . '/PHPMailer/PHPMailerAutoload.php');
$reportId = $_POST['report_id'];
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->Host = 'nephrowiki.de';
$mail->Username = 'zaareloaded@nephrowiki.de';
$mail->Password = 'ooZ1eiJa';
// $mail->SMTPSecure = 'tls';
$mail->Port = 25;
$mail->From = 'zaareloaded@nephrowiki.de';
$mail->FromName = 'zaaReloaded';
$mail->addAddress('dk@doktorkraus.de');
$mail->Subject = "[zaaReloaded] Exception $reportId";
if ( $_POST['ccUser'] ) {
$validMail = filter_var( $_POST['usersMail'], FILTER_VALIDATE_EMAIL );
$validUser = filter_var( $_POST['usersName'], FILTER_SANITIZE_STRING );
if ( $validUser ) {
$validUser = "\"$validUser\" "; // space character deliberately placed
};
if ( $validMail ) {
$mail->addCC($validMail, $validUser);
};
};
$info = print_r( $_POST, true );
$mail->Body = <<<EOF
zaaReloaded exception
User's comment on submission:
{$_POST['comment']}
***
Technical details: $info
--
http://zaa.nephrowiki.de
EOF;
if ($mail->send())
{
// Must return the report ID to indicate success
echo($reportId);
}
else
{
echo($mail->ErrorInfo);
}

View File

@ -1,4 +1,4 @@
2.0.0-alpha.1 2.0.0-beta.2
0e0620c09c28cc494352dd3901245e7402ea5b64 publish/release/zaaReloaded-2.0.0-alpha.1.exe http://zaa.nephrowiki.de/downloads/zaaReloaded-2.0.0-beta.2.exe
http://zaa.nephrowiki.de/downloads/zaaReloaded-2.0.0-alpha.1.exe 437bda34980828ab85f2dd3abb1991eef3cf17f3 publish/release/zaaReloaded-2.0.0-beta.2.exe

View File

@ -1,4 +1,5 @@
/* ControlElementBase.cs using System;
/* ControlElementBase.cs
* part of zaaReloaded2 * part of zaaReloaded2
* *
* Copyright 2015 Daniel Kraus * Copyright 2015 Daniel Kraus
@ -16,6 +17,8 @@
* limitations under the License. * limitations under the License.
*/ */
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace zaaReloaded2.Controller.Elements namespace zaaReloaded2.Controller.Elements
{ {
@ -23,23 +26,90 @@ namespace zaaReloaded2.Controller.Elements
/// Base class for control elements that control e.g. the working /// Base class for control elements that control e.g. the working
/// set of time points in a Formatter object. /// set of time points in a Formatter object.
/// </summary> /// </summary>
public abstract class ControlElementBase : ElementBase [Serializable]
public abstract class ControlElementBase : ElementBase, ISerializable
{ {
#region Properties
/// <summary> /// <summary>
/// Gets a list of child elements, all of which must be derived /// Gets a list of child elements, all of which must be derived
/// from FormatElementBase. /// from FormatElementBase.
/// </summary> /// </summary>
public IList<FormatElementBase> FormatElements { get; private set; } public IList<FormatElementBase> Children { get; internal set; }
public ControlElementBase() { } /// <summary>
/// Informs whether this control element can have child elements.
/// </summary>
public virtual bool CanHaveChildren { get { return true; } }
public ControlElementBase(IList<FormatElementBase> formatElements) #endregion
#region Constructors
public ControlElementBase()
: this(new List<FormatElementBase>())
{ }
public ControlElementBase(IList<FormatElementBase> children)
{ {
FormatElements = formatElements; Children = children;
} }
public ControlElementBase(FormatElementBase formatElement) public ControlElementBase(FormatElementBase children)
: this(new List<FormatElementBase>() { formatElement }) : this(new List<FormatElementBase>() { children })
{ } { }
#endregion
#region Serialization
/// <summary>
/// Deserialization constructor.
/// </summary>
protected ControlElementBase(SerializationInfo info, StreamingContext context)
{
int version = info.GetInt32("Version");
int childrenCount = info.GetInt32("ChildrenCount");
Children = new List<FormatElementBase>();
for (int i = 0; i < childrenCount; i++)
{
Type typeOfChild = info.GetValue(SerializedChildName(i, "Type"), typeof(Type)) as Type;
Children.Add(info.GetValue(SerializedChildName(i, "Object"), typeOfChild) as FormatElementBase);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Version", Properties.Settings.Default.SerializationVersion);
info.AddValue("ChildrenCount", Children.Count);
int i = 0;
foreach (FormatElementBase child in Children)
{
info.AddValue(SerializedChildName(i, "Type"), child.GetType());
info.AddValue(SerializedChildName(i, "Object"), child);
i++;
}
}
private string SerializedChildName(int index, string info)
{
return String.Format("Child{0}{1}", index, info);
}
#endregion
#region Protected methods
/// <summary>
/// Creates a clone of the Children list (for use in cloning
/// derived classes).
/// </summary>
/// <returns>Clone of the Children list.</returns>
protected IList<FormatElementBase> CloneChildren()
{
return Children.Select(child => child.Clone() as FormatElementBase).ToList();
}
#endregion
} }
} }

View File

@ -18,6 +18,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization;
using System.Text; using System.Text;
namespace zaaReloaded2.Controller.Elements namespace zaaReloaded2.Controller.Elements
@ -25,22 +26,49 @@ namespace zaaReloaded2.Controller.Elements
/// <summary> /// <summary>
/// Controller element that writes arbitrary text to the document. /// Controller element that writes arbitrary text to the document.
/// </summary> /// </summary>
class CustomText : ElementBase [Serializable]
public class CustomText : FormatElementBase, ISerializable
{ {
public override string Label public override string Label
{ {
get { return String.Format("\"{0}\"", Text); } get
{
if (String.IsNullOrEmpty(Content))
{
return "Beliebiger Text";
}
else
{
return String.Format("\"{0}\"", Content);
}
}
} }
public override void Run(Formatter.Formatter formatter) public override void Run(Formatter.Formatter formatter)
{ {
formatter.Write(Text); formatter.WriteParagraph(Content);
} }
protected override ElementBase CreateInstance()
{
CustomText clone = new CustomText();
clone.Content = Content;
return clone;
}
#region Constructors
public CustomText () { }
/// <summary> /// <summary>
/// Gets or sets the arbitrary text that will be written /// Deserialization constructor.
/// to the document.
/// </summary> /// </summary>
public string Text { get; set; } protected CustomText(SerializationInfo info, StreamingContext context)
{
int version = info.GetInt32("Version");
Content = info.GetString("Content");
}
#endregion
} }
} }

View File

@ -21,14 +21,14 @@ using System.Linq;
using System.Text; using System.Text;
using Microsoft.Office.Interop.Word; using Microsoft.Office.Interop.Word;
using zaaReloaded2.LabModel; using zaaReloaded2.LabModel;
using System.Runtime.Serialization;
namespace zaaReloaded2.Controller.Elements namespace zaaReloaded2.Controller.Elements
{ {
/// <summary> /// <summary>
/// Base class for formatting elements. /// Base class for formatting elements.
/// </summary> /// </summary>
[Serializable] public abstract class ElementBase : ICloneable
public abstract class ElementBase
{ {
/// <summary> /// <summary>
/// Returns the label for this formatting element. /// Returns the label for this formatting element.
@ -44,5 +44,16 @@ namespace zaaReloaded2.Controller.Elements
/// Element belongs to. The Formatter object provides access /// Element belongs to. The Formatter object provides access
/// to the current Word document etc.</param> /// to the current Word document etc.</param>
abstract public void Run(zaaReloaded2.Formatter.Formatter formatter); abstract public void Run(zaaReloaded2.Formatter.Formatter formatter);
public object Clone()
{
return CreateInstance();
}
/// <summary>
/// Creates a new instance that can be used for cloning.
/// </summary>
/// <returns>New instance of a derived class.</returns>
protected abstract ElementBase CreateInstance();
} }
} }

View File

@ -16,12 +16,42 @@
* limitations under the License. * limitations under the License.
*/ */
using System;
using System.Runtime.Serialization;
namespace zaaReloaded2.Controller.Elements namespace zaaReloaded2.Controller.Elements
{ {
/// <summary> /// <summary>
/// Base class for elements that perform actual formatting. /// Base class for elements that perform actual formatting.
/// </summary> /// </summary>
public abstract class FormatElementBase : ElementBase public abstract class FormatElementBase : ElementBase, ISerializable
{ {
/// <summary>
/// Gets or sets the content of this format element.
/// </summary>
public string Content
{
get { return _content; }
set
{
_content = value;
}
}
/// <summary>
/// Is called whenever the Content is changed.
/// </summary>
protected virtual void OnContentChanged() {}
private string _content;
#region Serialization
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Version", Properties.Settings.Default.SerializationVersion);
info.AddValue("Content", Content);
}
#endregion
} }
} }

View File

@ -23,6 +23,7 @@ using System.Diagnostics;
using Microsoft.Office.Interop.Word; using Microsoft.Office.Interop.Word;
using zaaReloaded2.LabModel; using zaaReloaded2.LabModel;
using zaaReloaded2.Formatter; using zaaReloaded2.Formatter;
using System.Runtime.Serialization;
namespace zaaReloaded2.Controller.Elements namespace zaaReloaded2.Controller.Elements
{ {
@ -31,17 +32,28 @@ namespace zaaReloaded2.Controller.Elements
/// to a Word document. /// to a Word document.
/// </summary> /// </summary>
[Serializable] [Serializable]
class Items : FormatElementBase public class Items : CustomText
{ {
#region ElementBase implementation #region ElementBase implementation
public override string Label public override string Label
{ {
get { return Line; } get
{
if (String.IsNullOrEmpty(Content))
{
return "Laborparameter";
}
else
{
return Content;
}
}
} }
public override void Run(zaaReloaded2.Formatter.Formatter formatter) public override void Run(zaaReloaded2.Formatter.Formatter formatter)
{ {
ParseLine();
if (_items == null || _items.Count == 0) return; if (_items == null || _items.Count == 0) return;
bool _needComma = false; bool _needComma = false;
@ -73,27 +85,11 @@ namespace zaaReloaded2.Controller.Elements
} }
} }
#endregion protected override ElementBase CreateInstance()
#region Properties
/// <summary>
/// Gets or sets a text line that contains a comma-separated list of
/// parsable laboratory item names. The list may optionally be preceded
/// with a caption followed by a colon.
/// </summary>
public string Line
{ {
[DebuggerStepThrough] Items clone = new Items();
get clone.Content = Content;
{ return clone;
return _line;
}
set
{
_line = value;
ParseLine();
}
} }
#endregion #endregion
@ -102,12 +98,19 @@ namespace zaaReloaded2.Controller.Elements
public Items() : base() { } public Items() : base() { }
public Items(string line) public Items(string content)
: this() : this()
{ {
Line = line; Content = content;
} }
/// <summary>
/// Deserialization constructor.
/// </summary>
protected Items(SerializationInfo info, StreamingContext context)
: base(info, context)
{ }
#endregion #endregion
#region Private methods #region Private methods
@ -121,7 +124,7 @@ namespace zaaReloaded2.Controller.Elements
_items = null; _items = null;
_caption = null; _caption = null;
Regex r = new Regex(@"((?<caption>[^:]+):\s*)?((?<items>[^,]+),\s*)*(?<items>[^,]+)"); Regex r = new Regex(@"((?<caption>[^:]+):\s*)?((?<items>[^,]+),\s*)*(?<items>[^,]+)");
Match m = r.Match(Line); Match m = r.Match(Content);
if (m.Success) if (m.Success)
{ {
if (m.Groups["caption"].Success) if (m.Groups["caption"].Success)
@ -154,7 +157,6 @@ namespace zaaReloaded2.Controller.Elements
{ {
items.AddRange(CollectByName(formatter, itemName)); items.AddRange(CollectByName(formatter, itemName));
} }
} }
return items; return items;
} }
@ -170,9 +172,12 @@ namespace zaaReloaded2.Controller.Elements
foreach (TimePointFormatter tpf in formatter.WorkingTimePoints.Values) foreach (TimePointFormatter tpf in formatter.WorkingTimePoints.Values)
{ {
List<ItemFormatter> newItems = tpf.ItemFormatters.Values List<ItemFormatter> newItems = tpf.ItemFormatters.Values
.Where(i => !i.HasBeenUsed && i.LabItem.QualifiedName.StartsWith(material)) .Where(i => !i.HasBeenUsed && !i.IsBlacklisted && i.LabItem.QualifiedName.StartsWith(material))
.ToList(); .ToList();
newItems.ForEach(i => i.HasBeenUsed = true); newItems.ForEach(i => i.HasBeenUsed = true);
// Include the material prefix only if this item was collected by a
// general wildcard ("*" rather than "SU-*" etc.).
newItems.ForEach(i => i.IncludeMaterial = String.IsNullOrEmpty(material));
items.AddRange(newItems); items.AddRange(newItems);
} }
return items; return items;
@ -194,6 +199,7 @@ namespace zaaReloaded2.Controller.Elements
// item with itemName. // item with itemName.
ItemFormatter i = tpf.ItemFormatters[name]; ItemFormatter i = tpf.ItemFormatters[name];
i.HasBeenUsed = true; i.HasBeenUsed = true;
i.IncludeMaterial = false;
items.Add(i); items.Add(i);
} }
return items; return items;
@ -203,7 +209,6 @@ namespace zaaReloaded2.Controller.Elements
#region Fields #region Fields
string _line;
string _caption; string _caption;
List<string> _items; List<string> _items;
static Regex _wildcard = new Regex(@"(?<material>[^-]+-)?\*"); static Regex _wildcard = new Regex(@"(?<material>[^-]+-)?\*");

View File

@ -0,0 +1,69 @@
/* NextColumn.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace zaaReloaded2.Controller.Elements
{
/// <summary>
/// Format element that causes a Formatter object to move the
/// insertion point to the next colum in a layout table.
/// </summary>
[Serializable]
public class NextColumn : ControlElementBase, ISerializable
{
public override string Label
{
get { return "Nächste Spalte"; }
}
public override bool CanHaveChildren
{
get
{
return false;
}
}
public override void Run(Formatter.Formatter formatter)
{
formatter.NextColumn();
}
protected override ElementBase CreateInstance()
{
return new NextColumn();
}
#region Constructors
public NextColumn() : base() { }
/// <summary>
/// Deserialization constructor.
/// </summary>
protected NextColumn(SerializationInfo info, StreamingContext context)
: base(info, context)
{ }
#endregion
}
}

View File

@ -18,15 +18,17 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization;
using System.Text; using System.Text;
namespace zaaReloaded2.Controller.Elements namespace zaaReloaded2.Controller.Elements
{ {
class SelectEachDay : ControlElementBase [Serializable]
public class SelectEachDay : ControlElementBase
{ {
public override string Label public override string Label
{ {
get { return "Jeden Tag auswählen"; } get { return "Jeder Tag"; }
} }
public override void Run(Formatter.Formatter formatter) public override void Run(Formatter.Formatter formatter)
@ -34,10 +36,30 @@ namespace zaaReloaded2.Controller.Elements
formatter.ProcessEachDay(this); formatter.ProcessEachDay(this);
} }
protected override ElementBase CreateInstance()
{
return new SelectEachDay(CloneChildren());
}
#region Constructors
public SelectEachDay() : base() { } public SelectEachDay() : base() { }
public SelectEachDay(FormatElementBase formatElement) public SelectEachDay(FormatElementBase formatElement)
: base(formatElement) : base(formatElement)
{ } { }
public SelectEachDay(IList<FormatElementBase> formatElements)
: base(formatElements)
{ }
/// <summary>
/// Deserialization constructor.
/// </summary>
protected SelectEachDay(SerializationInfo info, StreamingContext context)
: base(info, context)
{ }
#endregion
} }
} }

View File

@ -18,6 +18,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization;
using System.Text; using System.Text;
namespace zaaReloaded2.Controller.Elements namespace zaaReloaded2.Controller.Elements
@ -26,11 +27,12 @@ namespace zaaReloaded2.Controller.Elements
/// Selects the time points of the first day in a given Formatter /// Selects the time points of the first day in a given Formatter
/// object. /// object.
/// </summary> /// </summary>
class SelectFirstDay : ControlElementBase [Serializable]
public class SelectFirstDay : ControlElementBase, ISerializable
{ {
public override string Label public override string Label
{ {
get { return "Ersten Tag auswählen"; } get { return "Erster Tag"; }
} }
public override void Run(Formatter.Formatter formatter) public override void Run(Formatter.Formatter formatter)
@ -38,10 +40,30 @@ namespace zaaReloaded2.Controller.Elements
formatter.ProcessFirstDay(this); formatter.ProcessFirstDay(this);
} }
protected override ElementBase CreateInstance()
{
return new SelectFirstDay(CloneChildren());
}
#region Constructors
public SelectFirstDay() : base() { } public SelectFirstDay() : base() { }
public SelectFirstDay(FormatElementBase formatElement) public SelectFirstDay(FormatElementBase formatElement)
: base(formatElement) : base(formatElement)
{ } { }
public SelectFirstDay(IList<FormatElementBase> formatElements)
: base(formatElements)
{ }
/// <summary>
/// Deserialization constructor.
/// </summary>
protected SelectFirstDay(SerializationInfo info, StreamingContext context)
: base(info, context)
{ }
#endregion
} }
} }

View File

@ -19,6 +19,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Serialization;
using System.Text; using System.Text;
namespace zaaReloaded2.Controller.Elements namespace zaaReloaded2.Controller.Elements
@ -27,11 +28,12 @@ namespace zaaReloaded2.Controller.Elements
/// Selects the time points of the last day in a given Formatter /// Selects the time points of the last day in a given Formatter
/// object. /// object.
/// </summary> /// </summary>
class SelectLastDay : ControlElementBase [Serializable]
public class SelectLastDay : ControlElementBase, ISerializable
{ {
public override string Label public override string Label
{ {
get { return "Letzten Tag auswählen"; } get { return "Letzter Tag"; }
} }
public override void Run(Formatter.Formatter formatter) public override void Run(Formatter.Formatter formatter)
@ -39,10 +41,30 @@ namespace zaaReloaded2.Controller.Elements
formatter.ProcessLastDay(this); formatter.ProcessLastDay(this);
} }
protected override ElementBase CreateInstance()
{
return new SelectLastDay(CloneChildren());
}
#region Constructors
public SelectLastDay() : base() { } public SelectLastDay() : base() { }
public SelectLastDay(FormatElementBase formatElement) public SelectLastDay(FormatElementBase formatElement)
: base(formatElement) : base(formatElement)
{ } { }
public SelectLastDay(IList<FormatElementBase> formatElements)
: base(formatElements)
{ }
/// <summary>
/// Deserialization constructor.
/// </summary>
protected SelectLastDay(SerializationInfo info, StreamingContext context)
: base(info, context)
{ }
#endregion
} }
} }

View File

@ -0,0 +1,69 @@
/* TwoColumns.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace zaaReloaded2.Controller.Elements
{
/// <summary>
/// Format element that causes a Formatter object to insert a table with
/// two columns and one row into the documents.
/// </summary>
[Serializable]
public class TwoColumns : ControlElementBase, ISerializable
{
public override string Label
{
get { return "Zwei Spalten einfügen"; }
}
public override bool CanHaveChildren
{
get
{
return false;
}
}
public override void Run(Formatter.Formatter formatter)
{
formatter.InsertTwoColumns();
}
protected override ElementBase CreateInstance()
{
return new TwoColumns();
}
#region Constructors
public TwoColumns() : base() { }
/// <summary>
/// Deserialization constructor.
/// </summary>
protected TwoColumns(SerializationInfo info, StreamingContext context)
: base(info, context)
{ }
#endregion
}
}

View File

@ -21,6 +21,10 @@ using System.Linq;
using System.Text; using System.Text;
using zaaReloaded2.Formatter; using zaaReloaded2.Formatter;
using zaaReloaded2.Controller.Elements; using zaaReloaded2.Controller.Elements;
using System.IO;
using System.Text.RegularExpressions;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;
namespace zaaReloaded2.Controller namespace zaaReloaded2.Controller
{ {
@ -28,8 +32,43 @@ namespace zaaReloaded2.Controller
/// Holds settings related to controlling laboratory output. /// Holds settings related to controlling laboratory output.
/// </summary> /// </summary>
[Serializable] [Serializable]
public class Settings public class Settings : ICloneable, ISerializable
{ {
#region Persistence
/// <summary>
/// Deserializes a Settings object from SOAP XML that is read from a file.
/// </summary>
/// <param name="fileName">File to read.</param>
/// <returns>Deserialized Settings object with new unique ID.</returns>
/// <exception cref="InvalidDataException">if the file does not contain
/// SOAP XML that can be deserialized to a Settings object.</exception>
public static Settings LoadFromFile(string fileName)
{
StreamReader reader = new StreamReader(fileName);
SoapFormatter formatter = new SoapFormatter();
Settings settings = formatter.Deserialize(reader.BaseStream) as Settings;
if (settings == null)
{
throw new InvalidDataException("Datei enthält keine Stil-Daten oder ist beschädigt.");
}
settings.Uid = Guid.NewGuid();
return settings;
}
/// <summary>
/// Serializes a Settings object to SOAP XML that is written to a file.
/// </summary>
/// <param name="fileName">File to write to.</param>
public void SaveToFile(string fileName)
{
StreamWriter writer = new StreamWriter(fileName);
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(writer.BaseStream, this);
}
#endregion
#region Properties #region Properties
/// <summary> /// <summary>
@ -47,14 +86,144 @@ namespace zaaReloaded2.Controller
/// </summary> /// </summary>
public IList<ElementBase> Elements { get; private set; } public IList<ElementBase> Elements { get; private set; }
/// <summary>
/// Gets the unique ID of this Settings object. The unique
/// ID is not included in deep-copying (cloning).
/// </summary>
public Guid Uid { get; internal set; }
#endregion #endregion
#region Constructor #region Constructors
public Settings() public Settings()
: this(string.Empty, null)
{ }
public Settings(string name)
: this(name, null)
{ }
/// <summary>
/// Creates a new Settings object with an initial
/// set of elements.
/// </summary>
/// <param name="initialElements">Set of ElementBase
/// object (or derived ones).</param>
public Settings(IList<ElementBase> initialElements)
: this(String.Empty, initialElements)
{ }
/// <summary>
/// Creates a new Settings object with an initial
/// set of elements and a name.
/// </summary>
/// <param name="initialElements">Set of ElementBase
/// object (or derived ones).</param>
/// <param name="name">Name of these settings.</param>
public Settings(string name, IList<ElementBase> initialElements)
{
Uid = Guid.NewGuid();
Name = name;
Elements = initialElements;
ReferenceStyle = Properties.Settings.Default.ReferenceStyle;
if (Elements == null)
{ {
Elements = new List<ElementBase>(); Elements = new List<ElementBase>();
} }
}
/// <summary>
/// Creates a new Settings object with an initial
/// set of elements, a name, and a unique ID.
/// </summary>
/// <param name="initialElements">Set of ElementBase
/// object (or derived ones).</param>
/// <param name="name">Name of these settings.</param>
/// <param name="Uid">Unique ID for this Settings object.</param>
public Settings(string name, IList<ElementBase> initialElements, Guid uid)
: this(name, initialElements)
{
Uid = uid;
}
/// <summary>
/// Deserialization constructor.
/// </summary>
protected Settings(SerializationInfo info, StreamingContext context)
{
int version = info.GetInt32("Version");
Uid = (Guid)info.GetValue("Uid", typeof(Guid));
Name = info.GetString("Name");
ReferenceStyle = (ReferenceStyle)info.GetValue("ReferenceStyle", typeof(ReferenceStyle));
int elementsCount = info.GetInt32("ElementsCount");
Elements = new List<ElementBase>();
for (int i = 0; i < elementsCount; i++)
{
Type type = info.GetValue(SerializationElementName(i, "Type"), typeof(Type)) as Type;
ElementBase element = info.GetValue(SerializationElementName(i, "Object"), type) as ElementBase;
Elements.Add(element);
}
}
#endregion
#region Public methods
/// <summary>
/// Adds an element to the list of Elements.
/// </summary>
/// <param name="element">Element to add.</param>
public void AddElement(ElementBase element)
{
Elements.Add(element);
}
#endregion
#region Implementation of ICloneable
public object Clone()
{
Settings clone = new Settings(
String.Format("Kopie von {0}", Name),
Elements.Select(e => e.Clone() as ElementBase).ToList()
);
clone.ReferenceStyle = ReferenceStyle;
return clone;
}
#endregion
#region Implementation of ISerializable
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Version", Properties.Settings.Default.SerializationVersion);
info.AddValue("Uid", Uid);
info.AddValue("Name", Name);
info.AddValue("ReferenceStyle", ReferenceStyle);
info.AddValue("ElementsCount", Elements.Count);
int i = 0;
foreach (ElementBase e in Elements)
{
info.AddValue(SerializationElementName(i, "Type"), e.GetType());
info.AddValue(SerializationElementName(i, "Object"), e);
i++;
}
}
string SerializationElementName(int index, string info)
{
return String.Format("Element{0}{1}", index, info);
}
#endregion
#region Fields
// Defines header lines for the persistence file: "[My name]" and so on.
static readonly Regex _persistenceHeaderRegex = new Regex(@"^\[(?<name>.+?)]$");
#endregion #endregion
} }

View File

@ -18,47 +18,207 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Configuration; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Xml.Serialization;
using System.Reflection;
using zaaReloaded2.Controller.Elements;
using System.Runtime.Serialization.Formatters.Soap;
using System.Web;
using System.Runtime.Serialization;
namespace zaaReloaded2.Controller namespace zaaReloaded2.Controller
{ {
/// <summary>
/// A repository for zaaReloaded2.Controller.Settings.
/// </summary>
/// <remarks>
/// This class is derived from ApplicationSettingsBase to be able
/// to simply store it in the assembly's properties. However, this
/// causes some confusion because .NET's ApplicationSettings are
/// different from zaaReloaded's Settings.
/// </remarks>
[Serializable] [Serializable]
public class SettingsRepository : ApplicationSettingsBase public class SettingsRepository : ISerializable
{ {
#region Persistence #region Properties persistence
/// <summary>
/// Loads the SettingsRepository instance that was persisted in
/// the assembly properties.
/// </summary>
/// <returns>SettingsRepository that was last stored in the
/// assembly properties, or a newly created SettingsRepository
/// if no previously stored exists.</returns>
/// <remarks>
/// The SettingsRepository is serialized using a SoapFormatter, which
/// creates SOAP XML. Since the assembly properties are stored as
/// XML as well, the serialized SettingsRepository is converted to
/// a base-64 string, which does not mess with the properties XML.
/// </remarks>
public static SettingsRepository Load() public static SettingsRepository Load()
{ {
return string s = Properties.Settings.Default.SettingsRepository;
zaaReloaded2.Properties.Settings.Default.SettingsRepository ?? if (String.IsNullOrEmpty(s))
new SettingsRepository(); {
return new SettingsRepository();
}
else
{
MemoryStream stream = new MemoryStream();
string encoded = Properties.Settings.Default.SettingsRepository;
byte[] bytes = Convert.FromBase64String(encoded);
stream.Write(bytes, 0, bytes.Length);
stream.Position = 0;
SoapFormatter serializer = new SoapFormatter();
return serializer.Deserialize(stream) as SettingsRepository;
}
} }
/// <summary>
/// Stores the SettingsRepository in the assembly properties.
/// </summary>
/// <remarks>
/// The SettingsRepository is serialized using a SoapFormatter, which
/// creates SOAP XML. Since the assembly properties are stored as
/// XML as well, the serialized SettingsRepository is converted to
/// a base-64 string, which does not mess with the properties XML.
/// </remarks>
public void Store() public void Store()
{ {
zaaReloaded2.Properties.Settings.Default.SettingsRepository = this; MemoryStream stream = new MemoryStream();
zaaReloaded2.Properties.Settings.Default.Save(); SoapFormatter serializer = new SoapFormatter();
serializer.Serialize(stream, this);
stream.Position = 0;
string encoded = Convert.ToBase64String(stream.ToArray());
Properties.Settings.Default.SettingsRepository = encoded;
Properties.Settings.Default.Save();
} }
#endregion #endregion
#region Properties #region Properties
[UserScopedSetting()] public IList<Settings> SettingsList { get; protected set; }
[SettingsSerializeAs(SettingsSerializeAs.Xml)]
public IList<Settings> Settings { get; private set; }
#endregion #endregion
#region Constructor #region Constructors
/// <summary>
/// Creates a new instance of a settings repository that will
/// contain a default set of settings.
/// </summary>
public SettingsRepository() public SettingsRepository()
{ {
Settings = new List<Settings>(); SettingsList = new List<Settings>();
CreateDefault();
} }
#endregion #endregion
#region Serialization
protected SettingsRepository(SerializationInfo info, StreamingContext context)
{
int version = info.GetInt32("Version");
int settingsCount = info.GetInt32("SettingsCount");
SettingsList = new List<Settings>();
for (int i = 0; i < settingsCount; i++)
{
Type type = info.GetValue(SerializationSettingsName(i, "Type"), typeof(Type)) as Type;
Settings s = info.GetValue(SerializationSettingsName(i, "Object"), typeof(Settings)) as Settings;
SettingsList.Add(s);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Version", Properties.Settings.Default.SerializationVersion);
info.AddValue("SettingsCount", SettingsList.Count);
int i = 0;
foreach (Settings s in SettingsList)
{
info.AddValue(SerializationSettingsName(i, "Type"), s.GetType());
info.AddValue(SerializationSettingsName(i, "Object"), s);
i++;
}
}
string SerializationSettingsName(int index, string info)
{
return String.Format("Settings{0}{1}", index, info);
}
#endregion
#region Public methods
/// <summary>
/// Looks up a Settings object contained in this repository
/// by unique ID.
/// </summary>
/// <param name="uid">GUID to look for.</param>
/// <returns>Settings object with this GUID, or null if the
/// GUID was not found.</returns>
public Settings FindByGuid(Guid uid)
{
return SettingsList.FirstOrDefault(s => s.Uid == uid);
}
public static bool IsDefaultSettings(Settings settings)
{
return (settings.Name == Properties.Settings.Default.SettingsNameClinic + BUILTIN_LABEL ||
settings.Name == Properties.Settings.Default.SettingsNameWard + BUILTIN_LABEL);
}
#endregion
#region Private methods
/// <summary>
/// Resets the Settings contained in this SettingsRepository
/// to the default set of settings.
/// </summary>
private void CreateDefault()
{
SettingsList.Clear();
Assembly myAssembly = this.GetType().Assembly;
SoapFormatter deserializer = new SoapFormatter();
Stream stream = myAssembly.GetManifestResourceStream("zaaReloaded2.Defaults.ward.zaaReloaded");
Settings settings = deserializer.Deserialize(stream) as Settings;
settings.Name = Properties.Settings.Default.SettingsNameWard + BUILTIN_LABEL;
settings.Uid = Guid.Parse(DEFAULT_SETTINGS_1_UID);
SettingsList.Add(settings);
stream = myAssembly.GetManifestResourceStream("zaaReloaded2.Defaults.clinic.zaaReloaded");
settings = deserializer.Deserialize(stream) as Settings;
settings.Name = Properties.Settings.Default.SettingsNameClinic + BUILTIN_LABEL;
settings.Uid = Guid.Parse(DEFAULT_SETTINGS_2_UID);
SettingsList.Add(settings);
}
#endregion
#region Constants
/// <summary>
/// Label that is appended to the default Settings' names.
/// </summary>
public const string BUILTIN_LABEL = " (eingebaut)";
/// <summary>
/// Constant GUID for the first default Settings.
/// </summary>
const string DEFAULT_SETTINGS_1_UID = "EA79DE6C-E999-44F1-9122-929A8AA404CB";
/// <summary>
/// Constant GUID for the second default Settings.
/// </summary>
const string DEFAULT_SETTINGS_2_UID = "783C63B5-A964-4368-B2D0-D4595DCCB952";
#endregion
} }
} }

View File

@ -0,0 +1,158 @@
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:Settings id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Uid xsi:type="a2:Guid" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<_a>-97947944</_a>
<_b>-28017</_b>
<_c>17434</_c>
<_d>191</_d>
<_e>72</_e>
<_f>82</_f>
<_g>56</_g>
<_h>48</_h>
<_i>158</_i>
<_j>105</_j>
<_k>95</_k>
</Uid>
<Name id="ref-3">NepA neu</Name>
<ReferenceStyle xsi:type="a3:ReferenceStyle" xmlns:a3="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Formatter/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">IfSpecialItem</ReferenceStyle>
<ElementsCount>1</ElementsCount>
<Element0Type href="#ref-4"/>
<Element0Object href="#ref-5"/>
</a1:Settings>
<a2:UnitySerializationHolder id="ref-4" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<Data id="ref-6">zaaReloaded2.Controller.Elements.SelectEachDay</Data>
<UnityType>4</UnityType>
<AssemblyName id="ref-7">zaaReloaded2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6ec8d075a1ab1383</AssemblyName>
</a2:UnitySerializationHolder>
<a4:SelectEachDay id="ref-5" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<ChildrenCount>19</ChildrenCount>
<Child0Type href="#ref-8"/>
<Child0Object href="#ref-9"/>
<Child1Type href="#ref-8"/>
<Child1Object href="#ref-10"/>
<Child2Type href="#ref-8"/>
<Child2Object href="#ref-11"/>
<Child3Type href="#ref-8"/>
<Child3Object href="#ref-12"/>
<Child4Type href="#ref-8"/>
<Child4Object href="#ref-13"/>
<Child5Type href="#ref-8"/>
<Child5Object href="#ref-14"/>
<Child6Type href="#ref-8"/>
<Child6Object href="#ref-15"/>
<Child7Type href="#ref-8"/>
<Child7Object href="#ref-16"/>
<Child8Type href="#ref-8"/>
<Child8Object href="#ref-17"/>
<Child9Type href="#ref-8"/>
<Child9Object href="#ref-18"/>
<Child10Type href="#ref-8"/>
<Child10Object href="#ref-19"/>
<Child11Type href="#ref-8"/>
<Child11Object href="#ref-20"/>
<Child12Type href="#ref-8"/>
<Child12Object href="#ref-21"/>
<Child13Type href="#ref-8"/>
<Child13Object href="#ref-22"/>
<Child14Type href="#ref-8"/>
<Child14Object href="#ref-23"/>
<Child15Type href="#ref-24"/>
<Child15Object href="#ref-25"/>
<Child16Type href="#ref-24"/>
<Child16Object href="#ref-26"/>
<Child17Type href="#ref-24"/>
<Child17Object href="#ref-27"/>
<Child18Type href="#ref-8"/>
<Child18Object href="#ref-28"/>
</a4:SelectEachDay>
<a2:UnitySerializationHolder id="ref-8" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<Data id="ref-29">zaaReloaded2.Controller.Elements.Items</Data>
<UnityType>4</UnityType>
<AssemblyName href="#ref-7"/>
</a2:UnitySerializationHolder>
<a4:Items id="ref-9" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-30">Klinische Chemie: Na, K, Cl, Mg, Ca, P, CaxP, Alb, Prot, Haptoglobin, LDH, Glukose, Harnsäure</Content>
</a4:Items>
<a4:Items id="ref-10" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-31">Entzündung/Immunsystem: CRP, Pct, C3c, C4, Anti-DNAse B, ASL</Content>
</a4:Items>
<a4:Items id="ref-11" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-32">Kardiale Marker: CK, CKMB, Trop, NTproBNP</Content>
</a4:Items>
<a4:Items id="ref-12" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-33">Niere: Krea, Hst, eGFR (CKD-EPI)</Content>
</a4:Items>
<a4:Items id="ref-13" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-34">Sammelurin: SU-Proteinurie, SU-Alb, SU-CrCl, SU-HstCl, SU-GFR, SU-Natrium, SU-Zeit, SU-Volumen</Content>
</a4:Items>
<a4:Items id="ref-14" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-35">Spot-Urin: U-*</Content>
</a4:Items>
<a4:Items id="ref-15" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-36">Leber: GOT, GGT, GPT, AP, Bilirubin, CHE</Content>
</a4:Items>
<a4:Items id="ref-16" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-37">Blutfette: TG, Chol, LDL, HDL, Lp(a)</Content>
</a4:Items>
<a4:Items id="ref-17" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-38">Hämatologie: Hb, Hkt, Reti, Leu, Thr, MCV, HbA1c, Retikulozyten, Fragmentozyten</Content>
</a4:Items>
<a4:Items id="ref-18" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-39">Gerinnung: Quick, INR, PTT, Fibrinogen, ATIII, Anti-Xa</Content>
</a4:Items>
<a4:Items id="ref-19" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-40">Diff.-BB: Ery, Neu, Lym, Mon, Baso, Eos</Content>
</a4:Items>
<a4:Items id="ref-20" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-41">Hormone: iPTH, TSH</Content>
</a4:Items>
<a4:Items id="ref-21" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-42">Medikamente: TAC, CSA, SIR, Vancomycin, Gentamicin, Tobramicin</Content>
</a4:Items>
<a4:Items id="ref-22" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-43">Eisenhaushalt: Eisen, Ferritin, Transferrin, Tf.-Sätt.</Content>
</a4:Items>
<a4:Items id="ref-23" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-44">BGA: pH, Std.-Bic., BE</Content>
</a4:Items>
<a2:UnitySerializationHolder id="ref-24" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<Data id="ref-45">zaaReloaded2.Controller.Elements.CustomText</Data>
<UnityType>4</UnityType>
<AssemblyName href="#ref-7"/>
</a2:UnitySerializationHolder>
<a4:CustomText id="ref-25" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-46">Virologie (EDTA-Blut): CMV-PCR, BKV-PCR</Content>
</a4:CustomText>
<a4:CustomText id="ref-26" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-47">Nephrolog. Sediment: pH, Proteinurie, Ery /µl, Leu /µl, Plattenep. /µl, Bakt., Schleimfäden</Content>
</a4:CustomText>
<a4:CustomText id="ref-27" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-48">Autoantikörper: ANCA (IF), MPO-ANCA (ELISA), PR3-ANCA (ELISA), ANA (IF), AnDNA (ELISA), AnDNA (RIA)</Content>
</a4:CustomText>
<a4:Items id="ref-28" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-49">Hepatitis-Serologie: Anti-HBs, Anti-HBc</Content>
</a4:Items>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

View File

@ -0,0 +1,117 @@
# LAURIS-NAME "KANONISCHER NAME" MATERIAL "IMMER REFERENZBEREICH" "BLACKLIST"
# =========== ================== ======== ======================= ===========
"Übergangsepithelien (U)" Übergangsep. U
"a1-Microglobulin (SU)" a1-Microglobulin SU
"a1-Microglobulin (SU)/die" a1-Microglobulin SU
"aktuelles Bicarbonat" Bic BGA
"Albumin (PU)" Alb U
"Albumin (SU)" Alb SU
"Albumin (SU)/die" Alb SU
Albumin Alb S
Albumin/Creatinin (PU)" ACR U
"Alk. Phosphatase" AP S
Amylase Amylase S
"anorg. Phosphat" P S
"Bakterien (U)" Bakt U
Basenabweichung BE BGA
Basophile Baso E
"Bilirubin (U)" Bilirubin U
"C-reaktives Protein" CRP S
"Calcium (SU)" Ca SU
"Calcium (SU)/die" Ca SU
Calcium Ca S
Calcium-Phosphat-Produkt CaxP S
Cholesterin Chol S
CK gesamt" CK S
"CK MB" CK-MB S
"Creatinin (PU)" Krea U
"Creatinin (SU)" Krea SU
Creatinin Krea S
"Creatinin-Clearance (SU)/min" CrCl SU
"Cyclosporin-A vor Gabe" "CsA (C0)" S X
"Cystatin C (N Latex)" "Cystatin C" S X
Eisen Fe S
Eosinophile Eos E
"Erythrozyten (U)" Ery U
Erythrozyten Ery E
Ferritin Ferr S
Gesamt-Bilirubin Bilirubin S
"Gesamt-Eiweiss (PU)" Protein U
"Gesamt-Eiweiss (SU)" Protein SU
"Gesamt-Eiweiss (SU)/die" Proteinurie SU
Gesamt-Eiweiss Protein S
"Gesamt-Eiweiss/Creatinin (PU)" TPCR U
GGT GGT S
"glomeruläre Filtrationsrate" GFR SU
"glomerul. Filtrationsr. (MDRD)" "eGFR (MDRD)" S --- X
"glomerul. Filtrationsr. CKD-EP" "eGFR (CKD-EPI)" S
"Glucose (U)" Glukose U
Glucose Glukose S
"GOT (ASAT)" GOT S
"GPT (ALAT)" GPT S
Hämatokrit Hkt E
Hämoglobin Hb E
Haptoglobin Haptoglobin S X
Harnsäure Harnsäure S
"Harnstoff (SU)" Hst SU
"Harnstoff (SU)/die" Hst/Tag SU
Harnstoff" Hst S
"Harnstoff-Clearance (SU)/min" HstCl SU
"HbA1c (NGSP)" HbA1c E
"HDL - Cholesterin" HDL S
"hyaline Zylinder (U)" "hyal. Zyl." U
"Kalium (SU)" K U
"Kalium (SU)/die" K SU
Kalium K S
"Ketonkörper (U)" KK U
"Lactat Dehydrogenase" LDH S
"LDL - Cholesterin" LDL S
"Leukozyten (U)" Leu U
Leukozyten Leu E
Lymphozyten Lym E
Magnesium Mg S X
"MCH (HbE)" MCH E
MCHC MCHC E
MCV MCV E
"Mittleres Plättchenvolumen" MPV E
Monozyten Mon E
"Natrium (SU)" Na SU
"Natrium (SU)/die" Na SU
Natrium Na S
Neutrophile Neu E
"Nitrit (U)" Nitrit U
NT-proBNP NT-proBNP S
"PCO2 (art.)" pCO2 BGA
"pH (U)" pH U
pH pH BGA
"Plattenepithelien (U)" Plattenep U
"PO2 (art.)" pO2 BGA
"Protein (U)" Protein U
"Sammelmenge (U)" Volumen SU
"Sammelzeit (U)" Zeit SU
"Sauerstoffsättigung (art.)" SO2 BGA
Sirolimus SIR S
"spezifisches Gewicht (U)" "spez. Gew." U
"Standard Bicarbonat" "Std.-Bic." BGA
"Tacrolimus (FK506)" TAC S
Thrombozyten Thr E
Transferrin Transferrin S
"Transferrinsättigung" Tf.-Sätt. S
"Triglyceride" TG S
"Troponin T (high sensitive)" hsTnT S
Unreife Granulozyten" Gran E
"Urobilinogen (U)" Urobilinogen U
"Niedermol. Heparin (Anti-Xa)" Anti-Xa Z
"Thromboplastinzeit n. Quick" Quick Z
PTT PTT Z
"Ratio int. norm." INR Z
"Komplementfaktor C3c" C3c S X
"Komplementfaktor C4" C4 S X
"Anti-DNAse B" "Anti-DNAse B" S
Anti-Streptolysin ASL S
"PTH intakt" iPTH S
TSH TSH S
HAPTOGLOBIN Haptoglobin S
FRAGMENTOZYTEN Fragmentozyten E
"HBc-Antikörper (gesamt)" Anti-HBc S
HBs-Antikörper Anti-HBs S

View File

@ -2,6 +2,9 @@
# ============== ==================== # ============== ====================
# WICHTIG: Nur direkt austauschbare Einheiten verwenden, # WICHTIG: Nur direkt austauschbare Einheiten verwenden,
# weil (bislang) keine Umrechnung der Werte vorgesehen ist! # weil (bislang) keine Umrechnung der Werte vorgesehen ist!
"ml/min/ 1,73qm" "ml/min/1,73 m²" "ml/min /1,73qm" "ml/min/1,73 m²"
ng/ml µg/l ng/ml µg/l
mmol/l mM mmol/l mM
n*1000/µl /nl
n*10E6/µl /fl
Bak/µl /µl

View File

@ -0,0 +1,200 @@
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:Settings id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Uid xsi:type="a2:Guid" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<_a>1443045381</_a>
<_b>29162</_b>
<_c>17774</_c>
<_d>182</_d>
<_e>243</_e>
<_f>111</_f>
<_g>227</_g>
<_h>16</_h>
<_i>47</_i>
<_j>142</_j>
<_k>57</_k>
</Uid>
<Name id="ref-3">Kopie von Standard für Station</Name>
<ReferenceStyle xsi:type="a3:ReferenceStyle" xmlns:a3="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Formatter/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">IfSpecialOrAbnormal</ReferenceStyle>
<ElementsCount>4</ElementsCount>
<Element0Type href="#ref-4"/>
<Element0Object href="#ref-5"/>
<Element1Type href="#ref-6"/>
<Element1Object href="#ref-7"/>
<Element2Type href="#ref-8"/>
<Element2Object href="#ref-9"/>
<Element3Type href="#ref-10"/>
<Element3Object href="#ref-11"/>
</a1:Settings>
<a2:UnitySerializationHolder id="ref-4" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<Data id="ref-12">zaaReloaded2.Controller.Elements.TwoColumns</Data>
<UnityType>4</UnityType>
<AssemblyName id="ref-13">zaaReloaded2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6ec8d075a1ab1383</AssemblyName>
</a2:UnitySerializationHolder>
<a4:TwoColumns id="ref-5" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<ChildrenCount>0</ChildrenCount>
</a4:TwoColumns>
<a2:UnitySerializationHolder id="ref-6" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<Data id="ref-14">zaaReloaded2.Controller.Elements.SelectFirstDay</Data>
<UnityType>4</UnityType>
<AssemblyName href="#ref-13"/>
</a2:UnitySerializationHolder>
<a4:SelectFirstDay id="ref-7" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<ChildrenCount>16</ChildrenCount>
<Child0Type href="#ref-15"/>
<Child0Object href="#ref-16"/>
<Child1Type href="#ref-15"/>
<Child1Object href="#ref-17"/>
<Child2Type href="#ref-15"/>
<Child2Object href="#ref-18"/>
<Child3Type href="#ref-15"/>
<Child3Object href="#ref-19"/>
<Child4Type href="#ref-15"/>
<Child4Object href="#ref-20"/>
<Child5Type href="#ref-15"/>
<Child5Object href="#ref-21"/>
<Child6Type href="#ref-15"/>
<Child6Object href="#ref-22"/>
<Child7Type href="#ref-15"/>
<Child7Object href="#ref-23"/>
<Child8Type href="#ref-15"/>
<Child8Object href="#ref-24"/>
<Child9Type href="#ref-15"/>
<Child9Object href="#ref-25"/>
<Child10Type href="#ref-15"/>
<Child10Object href="#ref-26"/>
<Child11Type href="#ref-15"/>
<Child11Object href="#ref-27"/>
<Child12Type href="#ref-15"/>
<Child12Object href="#ref-28"/>
<Child13Type href="#ref-15"/>
<Child13Object href="#ref-29"/>
<Child14Type href="#ref-15"/>
<Child14Object href="#ref-30"/>
<Child15Type href="#ref-15"/>
<Child15Object href="#ref-31"/>
</a4:SelectFirstDay>
<a2:UnitySerializationHolder id="ref-8" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<Data id="ref-32">zaaReloaded2.Controller.Elements.NextColumn</Data>
<UnityType>4</UnityType>
<AssemblyName href="#ref-13"/>
</a2:UnitySerializationHolder>
<a4:NextColumn id="ref-9" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<ChildrenCount>0</ChildrenCount>
</a4:NextColumn>
<a2:UnitySerializationHolder id="ref-10" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<Data id="ref-33">zaaReloaded2.Controller.Elements.SelectLastDay</Data>
<UnityType>4</UnityType>
<AssemblyName href="#ref-13"/>
</a2:UnitySerializationHolder>
<a4:SelectLastDay id="ref-11" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<ChildrenCount>16</ChildrenCount>
<Child0Type href="#ref-15"/>
<Child0Object href="#ref-16"/>
<Child1Type href="#ref-15"/>
<Child1Object href="#ref-17"/>
<Child2Type href="#ref-15"/>
<Child2Object href="#ref-18"/>
<Child3Type href="#ref-15"/>
<Child3Object href="#ref-19"/>
<Child4Type href="#ref-15"/>
<Child4Object href="#ref-20"/>
<Child5Type href="#ref-15"/>
<Child5Object href="#ref-21"/>
<Child6Type href="#ref-15"/>
<Child6Object href="#ref-22"/>
<Child7Type href="#ref-15"/>
<Child7Object href="#ref-23"/>
<Child8Type href="#ref-15"/>
<Child8Object href="#ref-24"/>
<Child9Type href="#ref-15"/>
<Child9Object href="#ref-25"/>
<Child10Type href="#ref-15"/>
<Child10Object href="#ref-26"/>
<Child11Type href="#ref-15"/>
<Child11Object href="#ref-27"/>
<Child12Type href="#ref-15"/>
<Child12Object href="#ref-28"/>
<Child13Type href="#ref-15"/>
<Child13Object href="#ref-29"/>
<Child14Type href="#ref-15"/>
<Child14Object href="#ref-30"/>
<Child15Type href="#ref-15"/>
<Child15Object href="#ref-31"/>
</a4:SelectLastDay>
<a2:UnitySerializationHolder id="ref-15" xmlns:a2="http://schemas.microsoft.com/clr/ns/System">
<Data id="ref-34">zaaReloaded2.Controller.Elements.Items</Data>
<UnityType>4</UnityType>
<AssemblyName href="#ref-13"/>
</a2:UnitySerializationHolder>
<a4:Items id="ref-16" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-35">Klinische Chemie: Na, K, Cl, Mg, Ca, P, CaxP, Alb, Prot, Haptoglobin, LDH, Glukose, Harnsäure</Content>
</a4:Items>
<a4:Items id="ref-17" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-36">Entzündung/Immunsystem: CRP, Pct, C3c, C4, Anti-DNAse B, ASL</Content>
</a4:Items>
<a4:Items id="ref-18" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-37">Kardiale Marker: CK, CKMB, Trop, NTproBNP</Content>
</a4:Items>
<a4:Items id="ref-19" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-38">Niere: Krea, Hst, eGFR (CKD-EPI)</Content>
</a4:Items>
<a4:Items id="ref-20" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-39">Sammelurin: SU-Proteinurie, SU-Alb, SU-CrCl, SU-HstCl, SU-GFR, SU-Natrium, SU-Zeit, SU-Volumen</Content>
</a4:Items>
<a4:Items id="ref-21" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-40">Spot-Urin: U-*</Content>
</a4:Items>
<a4:Items id="ref-22" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-41">Leber: GOT, GGT, GPT, AP, Bilirubin, CHE</Content>
</a4:Items>
<a4:Items id="ref-23" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-42">Blutfette: TG, Chol, LDL, HDL, Lp(a)</Content>
</a4:Items>
<a4:Items id="ref-24" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-43">Hämatologie: Hb, Hkt, Reti, Leu, Thr, Ery, Neu, Lym, Mon, Baso, Eos, MCV, HbA1c, Retikulozyten, Fragmentozyten</Content>
</a4:Items>
<a4:Items id="ref-25" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-44">Gerinnung: Quick, INR, PTT, Fibrinogen, ATIII, Anti-Xa</Content>
</a4:Items>
<a4:Items id="ref-26" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-45">Hormone: iPTH, TSH</Content>
</a4:Items>
<a4:Items id="ref-27" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-46">Medikamente: TAC, CSA, SIR, Vancomycin, Gentamicin, Tobramicin</Content>
</a4:Items>
<a4:Items id="ref-28" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-47">Eisenhaushalt: Eisen, Ferritin, Transferrin, Tf.-Sätt.</Content>
</a4:Items>
<a4:Items id="ref-29" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-48">BGA: pH, Std.-Bic., BE</Content>
</a4:Items>
<a4:Items id="ref-30" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-49">Hepatitis-Serologie: Anti-HBs, Anti-HBc</Content>
</a4:Items>
<a4:Items id="ref-31" xmlns:a4="http://schemas.microsoft.com/clr/nsassem/zaaReloaded2.Controller.Elements/zaaReloaded2%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3D6ec8d075a1ab1383">
<Version>1</Version>
<Content id="ref-50">Weitere Werte: *</Content>
</a4:Items>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

75
zaaReloaded2/Demo/Demo.cs Executable file
View File

@ -0,0 +1,75 @@
/* Demo.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Word;
namespace zaaReloaded2.Demo
{
/// <summary>
/// Static class that serves to load an embedded Word document
/// into a temporary file and open that temporary file in Word.
/// </summary>
static class Demo
{
#region Public methods
/// <summary>
/// Opens a demo document. The document's Saved property is set to
/// false so that a user who wants to save changes will be prompted
/// for a file name.
/// </summary>
public static void OpenDemoDocument()
{
string tempFile = CreateTempFileFromResource();
Document demoDoc = Globals.ThisAddIn.Application.Documents
.Add(Template: tempFile);
File.Delete(tempFile);
}
#endregion
#region Private methods
/// <summary>
/// Copies the built-in demo file from a resource stream to a
/// temporary file and returns the path to that file.
/// </summary>
/// <returns>Path to the newly created temporary file.</returns>
static string CreateTempFileFromResource()
{
string resourceName = "zaaReloaded2.Demo.Demo.docx";
Stream resourceStream = typeof(Demo).Assembly
.GetManifestResourceStream(resourceName);
if (resourceStream == null)
{
throw new IOException("Unable to open stream " + resourceName);
}
string fileName = Path.GetTempFileName() + ".docx";
Stream tempStream = File.Create(fileName);
resourceStream.CopyTo(tempStream);
tempStream.Close();
return fileName;
}
#endregion
}
}

BIN
zaaReloaded2/Demo/Demo.docx Executable file

Binary file not shown.

View File

@ -25,7 +25,8 @@
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:settings="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender" xmlns:settings="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender"
xmlns:converter="clr-namespace:Bovender.Mvvm.Converters;assembly=Bovender" xmlns:converter="clr-namespace:Bovender.Mvvm.Converters;assembly=Bovender"
SizeToContent="Height" Width="700" SizeToContent="Height" Width="700" ShowInTaskbar="False"
WindowStyle="ToolWindow" Topmost="True" ResizeMode="CanResizeWithGrip"
x:Name="exceptionDetailView" x:Name="exceptionDetailView"
Title="Technische Fehlerdetails" Title="Technische Fehlerdetails"
settings:WindowState.Save="True" settings:WindowState.Save="True"

View File

@ -27,6 +27,7 @@
xmlns:actions="clr-namespace:Bovender.Mvvm.Actions;assembly=Bovender" xmlns:actions="clr-namespace:Bovender.Mvvm.Actions;assembly=Bovender"
xmlns:settings="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender" xmlns:settings="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender"
SizeToContent="WidthAndHeight" ResizeMode="CanResizeWithGrip" SizeToContent="WidthAndHeight" ResizeMode="CanResizeWithGrip"
WindowStyle="ToolWindow" ShowInTaskbar="False" Topmost="True"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Title="zaaReloaded2: Fehler!" Title="zaaReloaded2: Fehler!"
settings:WindowState.Save="True" settings:WindowState.Save="True"
@ -34,7 +35,7 @@
<i:Interaction.Triggers> <i:Interaction.Triggers>
<i:EventTrigger SourceObject="{Binding ViewDetailsMessage}" EventName="Sent"> <i:EventTrigger SourceObject="{Binding ViewDetailsMessage}" EventName="Sent">
<i:EventTrigger.Actions> <i:EventTrigger.Actions>
<actions:ShowViewAction Assembly="zaaReloaded2" View="XLToolbox.ExceptionHandler.ExceptionDetailView" /> <actions:ShowViewAction Assembly="zaaReloaded2" View="zaaReloaded2.ExceptionHandler.ExceptionDetailView" />
</i:EventTrigger.Actions> </i:EventTrigger.Actions>
</i:EventTrigger> </i:EventTrigger>
<i:EventTrigger SourceObject="{Binding SubmitReportMessage}" EventName="Sent"> <i:EventTrigger SourceObject="{Binding SubmitReportMessage}" EventName="Sent">

View File

@ -32,8 +32,7 @@ namespace zaaReloaded2.ExceptionHandler
{ {
get get
{ {
// TODO: Get Word version return Globals.ThisAddIn.Application.Build;
return "n/a";
} }
} }
@ -84,7 +83,7 @@ namespace zaaReloaded2.ExceptionHandler
protected override string DevPath() protected override string DevPath()
{ {
return @"x:\Code\zaaReloaded2\"; return @"x:\Code\zaaReloaded2\zaaReloaded2\";
} }
#endregion #endregion

View File

@ -0,0 +1,91 @@
/* DanielsStyle.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Word;
using System.Text.RegularExpressions;
namespace zaaReloaded2.Formatter
{
/// <summary>
/// Makes design changes and edits especially for Daniel Kraus.
/// </summary>
static class DanielsStyle
{
public static void Apply(Document document, Selection selection)
{
FixWords(document);
FormatDiagnoses(selection);
FixSalutation(document);
}
static void FormatDiagnoses(Selection selection)
{
Range r = selection.Range;
r.ListFormat.RemoveNumbers();
r.Bold = 0;
r.Italic = 0;
r.Underline = WdUnderline.wdUnderlineNone;
r.Font.Size = 10;
Paragraphs p = r.Paragraphs;
p.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
p.FirstLineIndent = -45;
p.LeftIndent = 45;
p.LineSpacingRule = WdLineSpacing.wdLineSpaceSingle;
p.SpaceAfter = 0;
p.SpaceBefore = 0;
if (p[p.Count].Range.Text.StartsWith("Aktuell"))
{
p[p.Count].Range.Bold = 1;
}
}
static void FixWords(Document document)
{
Find find = document.Range().Find;
find.Execute2007(FindText: "Körperlicher Untersuchungsbefund", ReplaceWith: "Körperl. Untersuchung", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "Dr.D.Kraus", ReplaceWith: "Dr. D. Kraus", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "Z. n.", ReplaceWith: "Z.n.", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "Zust. n.", ReplaceWith: "Z.n.", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "Zust.n.", ReplaceWith: "Z.n.", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "Assistent der Klinik", ReplaceWith: "Internist/Nephrologe", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "Professor Dr.", ReplaceWith: "Prof. Dr.", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "mmHg", ReplaceWith: "mm Hg", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "RR ", ReplaceWith: "", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "HF ", ReplaceWith: "", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "TAC-Spiegel", ReplaceWith: "Tacrolimus-Talspiegel", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "4-7", ReplaceWith: "4 bis 7", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "5-8", ReplaceWith: "5 bis 8", Replace: WdReplace.wdReplaceAll);
find.Execute2007(FindText: "8-10", ReplaceWith: "8 bis 10", Replace: WdReplace.wdReplaceAll);
}
static void FixSalutation(Document document)
{
Regex sal = new Regex(@"^Mit.*?Grüßen\r");
Regex med = new Regex(@"^((Häusl|Empf).*?Medikat)|Therapieempf");
foreach (Paragraph p in document.Paragraphs)
{
if (sal.IsMatch(p.Range.Text)) p.Range.Text = "Mit freundlichen, kollegialen Grüßen,\r";
if (med.IsMatch(p.Range.Text)) p.Range.Text = "Aktuelle Medikation:\r";
}
}
}
}

View File

@ -20,6 +20,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Microsoft.Office.Interop.Word; using Microsoft.Office.Interop.Word;
using System.Text.RegularExpressions;
namespace zaaReloaded2.Formatter namespace zaaReloaded2.Formatter
{ {
@ -30,8 +31,19 @@ namespace zaaReloaded2.Formatter
/// depending on whether there is text in the buffer or not. /// depending on whether there is text in the buffer or not.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// <para>
/// Linking several DocumentWriters permits a cascading work flow /// Linking several DocumentWriters permits a cascading work flow
/// with several buffers. /// with several buffers.
/// </para>
/// <para>
/// Markup support: The DocumentWriter supports basic markup to control
/// the text styles in the Word document.
/// </para>
/// <list type="unordered">
/// <item>&lt;b&gt; and &lt;/b&gt; - bold/unbold</item>
/// <item>&lt;style:NAME&gt; - set the paragraph or character style</item>
/// <item>&lt;/style&gt; - remove *character* style</item>
/// </list>
/// </remarks> /// </remarks>
class DocumentWriter class DocumentWriter
{ {
@ -53,6 +65,20 @@ namespace zaaReloaded2.Formatter
/// </summary> /// </summary>
public bool HasBufferedText { get { return _buffer.Length > 0; } } public bool HasBufferedText { get { return _buffer.Length > 0; } }
/// <summary>
/// Returns text without markup from the buffer.
/// </summary>
public string Text
{
get
{
if (!HasBufferedText)
throw new InvalidOperationException("This DocumentWriter does not have any text.");
return _markupRegex.Replace(_buffer.ToString(), String.Empty);
}
}
#endregion #endregion
#region Constructors #region Constructors
@ -113,7 +139,10 @@ namespace zaaReloaded2.Formatter
if (Document != null) if (Document != null)
{ {
Document.Range().Text = _buffer.ToString(); Selection s = Document.ActiveWindow.Selection;
s.ClearCharacterDirectFormatting();
s.ClearParagraphDirectFormatting();
MarkupToDocument(_buffer.ToString());
} }
if (Parent != null) if (Parent != null)
{ {
@ -153,9 +182,54 @@ namespace zaaReloaded2.Formatter
#endregion #endregion
#region Private methods
/// <summary>
/// Parses a string containing markup (e.g., "&lt;b&gt;", "&lt;/b&gt;")
/// and writes formatted text to the current Document.
/// </summary>
void MarkupToDocument(string text)
{
string[] substrings = _markupRegex.Split(text);
Selection sel = Document.ActiveWindow.Selection;
foreach (string substring in substrings)
{
switch (substring)
{
case "<b>":
sel.Font.Bold = 1;
break;
case "</b>":
sel.Font.Bold = 0;
break;
case "</style>":
sel.ClearCharacterStyle();
break;
default:
Match styleMatch = _styleRegex.Match(substring);
if (styleMatch.Success)
{
sel.set_Style(styleMatch.Groups["style"].Value);
}
else
{
sel.TypeText(substring);
}
break;
}
}
}
#endregion
#region Fields #region Fields
StringBuilder _buffer; StringBuilder _buffer;
// Put pattern in parentheses so they will not be discarded by Regex.Split
// The splitting pattern must not contain subgroups!
static readonly Regex _markupRegex = new Regex(@"(<[^ >]+>)");
static readonly Regex _styleRegex = new Regex(@"<style:(?<style>[^>]+)>");
#endregion #endregion
} }

View File

@ -64,6 +64,12 @@ namespace zaaReloaded2.Formatter
/// </summary> /// </summary>
public Dictionary<DateTime, TimePointFormatter> WorkingTimePoints { get; private set; } public Dictionary<DateTime, TimePointFormatter> WorkingTimePoints { get; private set; }
/// <summary>
/// Is true if this Formatter object carries a Laboratory with
/// at least one time point.
/// </summary>
public bool CanRun { get { return Laboratory.TimePoints.Count > 0; } }
#endregion #endregion
#region Constructors #region Constructors
@ -113,6 +119,9 @@ namespace zaaReloaded2.Formatter
/// current position of the cursor).</param> /// current position of the cursor).</param>
public void Run() public void Run()
{ {
if (!CanRun) throw new NoLaboratoryDataException("No laboratory data to format.");
CreateStyles();
int current = 0; int current = 0;
while (current < Settings.Elements.Count) while (current < Settings.Elements.Count)
{ {
@ -195,7 +204,106 @@ namespace zaaReloaded2.Formatter
/// FormatElementBase children to process.</param> /// FormatElementBase children to process.</param>
public void ProcessAllTimePoints(ControlElementBase controlElement) public void ProcessAllTimePoints(ControlElementBase controlElement)
{ {
ProcessAllTimePoints(controlElement.FormatElements); ProcessAllTimePoints(controlElement.Children);
}
/// <summary>
/// Inserts a table with two columns into the document.
/// </summary>
public void InsertTwoColumns()
{
_secondaryBuffer.Flush();
if (Document != null)
{
Range r = Document.ActiveWindow.Selection.Range;
_table = Document.Tables.Add(r, NumRows: 1, NumColumns: 2);
_table.AllowAutoFit = true;
_table.AutoFitBehavior(WdAutoFitBehavior.wdAutoFitWindow);
_table.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthPercent;
_table.PreferredWidth = 100;
_table.Borders.Enable = 0;
}
}
/// <summary>
/// Moves the insertion point to the next column in a layout
/// table.
/// </summary>
public void NextColumn()
{
if (_table == null)
{
throw new InvalidOperationException(
"Kann nicht zur nächsten Spalte wechseln, da bislang keine Tabelle eingefügt wurde.");
}
_secondaryBuffer.Flush();
Document.ActiveWindow.Selection.MoveRight(WdUnits.wdCell);
}
/// <summary>
/// Creates a paragraph and character styles in the document.
/// </summary>
public void CreateStyles()
{
if (Document != null)
{
Style style;
// Don't see a better way to check for the existence of a particular
// paragraph style than by using a try...catch construction.
try
{
style = Document.Styles[Properties.Settings.Default.StyleParagraph];
}
catch
{
// Add default paragraph style for laboratory
style = Document.Styles.Add(Properties.Settings.Default.StyleParagraph);
style.Font.Size = 10; // pt
style.Font.Bold = 0;
style.Font.Italic = 0;
style.Font.Underline = 0;
style.ParagraphFormat.SpaceAfter = 0;
style.ParagraphFormat.SpaceBefore = 0;
style.ParagraphFormat.LeftIndent = 36; // pt
style.ParagraphFormat.FirstLineIndent = -36; // pt
style.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphJustify;
}
try
{
style = Document.Styles[Properties.Settings.Default.StyleHeader];
}
catch
{
// Add header paragraph style for laboratory
style = Document.Styles.Add(Properties.Settings.Default.StyleHeader);
style.Font.Size = 10; // pt
style.Font.Bold = 1;
style.Font.Italic = 0;
style.Font.Underline = WdUnderline.wdUnderlineSingle;
style.ParagraphFormat.SpaceAfter = 0;
style.ParagraphFormat.SpaceBefore = 12;
style.ParagraphFormat.LeftIndent = 36; // pt
style.ParagraphFormat.FirstLineIndent = -36; // pt
style.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphJustify;
style.set_NextParagraphStyle(Document.Styles[Properties.Settings.Default.StyleParagraph]);
}
/*
try
{
style = Document.Styles[Properties.Settings.Default.StyleAbnormal];
}
catch
{
// Add character style for abnormal parameters
style = Document.Styles.Add(
Properties.Settings.Default.StyleAbnormal,
WdStyleType.wdStyleTypeCharacter);
style.Font.Bold = 1;
}
*/
}
} }
#endregion #endregion
@ -259,7 +367,7 @@ namespace zaaReloaded2.Formatter
throw new ArgumentNullException("workingTimePoints"); throw new ArgumentNullException("workingTimePoints");
WorkingTimePoints = workingTimePoints; WorkingTimePoints = workingTimePoints;
ProcessElements(controlElement.FormatElements); ProcessElements(controlElement.Children);
if (_primaryBuffer.HasBufferedText) if (_primaryBuffer.HasBufferedText)
{ {
_primaryBuffer.Prepend( _primaryBuffer.Prepend(
@ -286,6 +394,7 @@ namespace zaaReloaded2.Formatter
Laboratory _laboratory; Laboratory _laboratory;
DocumentWriter _primaryBuffer; DocumentWriter _primaryBuffer;
DocumentWriter _secondaryBuffer; DocumentWriter _secondaryBuffer;
Table _table;
#endregion #endregion
} }

View File

@ -48,6 +48,23 @@ namespace zaaReloaded2.Formatter
/// </summary> /// </summary>
public bool HasBeenUsed { get; set; } public bool HasBeenUsed { get; set; }
/// <summary>
/// Gets or sets a flag that tells the formatter to include or
/// not include the material indicator in the formatted output.
/// Default is true.
/// </summary>
/// <remarks>
/// For example, items that are selected with a wildcard may
/// contain the material info, while expressly chosen items
/// may not.
/// </remarks>
public bool IncludeMaterial { get; set; }
/// <summary>
/// Gets whether the Item is marked as blacklisted in the thesaurus.
/// </summary>
public bool IsBlacklisted { get { return LabItem.IsBlacklisted; } }
#endregion #endregion
#region Constructor #region Constructor
@ -58,6 +75,7 @@ namespace zaaReloaded2.Formatter
/// <param name="labItem">LabItem to wrap in this ItemFormatter.</param> /// <param name="labItem">LabItem to wrap in this ItemFormatter.</param>
public ItemFormatter(LabItem labItem, ReferenceStyle referenceStyle) public ItemFormatter(LabItem labItem, ReferenceStyle referenceStyle)
{ {
IncludeMaterial = true;
LabItem = labItem; LabItem = labItem;
ReferenceStyle = referenceStyle; ReferenceStyle = referenceStyle;
} }
@ -114,7 +132,8 @@ namespace zaaReloaded2.Formatter
string unit; string unit;
if (LabItem.HasUnit) if (LabItem.HasUnit)
{ {
unit = String.Format(" {0}", LabItem.Unit); string space = LabItem.Unit.StartsWith("/") ? String.Empty : " ";
unit = String.Format("{0}{1}", space, LabItem.Unit);
} }
else else
{ {
@ -133,15 +152,24 @@ namespace zaaReloaded2.Formatter
value = LabItem.Value; value = LabItem.Value;
} }
// Insert the formatted text into the document. string name = IncludeMaterial ? LabItem.QualifiedName : LabItem.Name;
formatter.Write(
string output =
String.Format( String.Format(
"{0} {1}{2}{3}", "{0} {1}{2}{3}",
LabItem.QualifiedName, name,
value, value,
unit, unit,
reference reference
)); );
if (!LabItem.IsNormal)
{
output = String.Format(
"<b>{0}</b>",
output);
}
formatter.Write(output);
HasBeenUsed = true; HasBeenUsed = true;
} }

View File

@ -0,0 +1,35 @@
/* NoLaboratoryDataException.cs
* part of zaaReloaded2
*
* Copyright 2015 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Runtime.Serialization;
namespace zaaReloaded2.Formatter
{
[Serializable]
class NoLaboratoryDataException : Exception
{
public NoLaboratoryDataException() { }
public NoLaboratoryDataException(string message) : base(message) { }
public NoLaboratoryDataException(string message,
Exception innerException)
: base(message, innerException) { }
public NoLaboratoryDataException(SerializationInfo info,
StreamingContext context)
: base(info, context) { }
}
}

View File

@ -26,37 +26,36 @@ namespace zaaReloaded2.Formatter
/// <summary> /// <summary>
/// Describes the style of normal range references. /// Describes the style of normal range references.
/// </summary> /// </summary>
[Serializable]
public enum ReferenceStyle public enum ReferenceStyle
{ {
/// <summary> /// <summary>
/// Never write normal ranges /// Never write normal ranges
/// </summary> /// </summary>
[Description("Referenzbereich nie ausgeben")] [Description("Niemals")]
Never, Never,
/// <summary> /// <summary>
/// Write normal range if item is marked in dictionary /// Write normal range if item is marked in dictionary
/// </summary> /// </summary>
[Description("Referenzbereich ausgeben, falls Parameter so markiert ist")] [Description("Bei speziellen Parametern immer")]
IfSpecialItem, IfSpecialItem,
/// <summary> /// <summary>
/// Write normal range if value is abnormal /// Write normal range if value is abnormal
/// </summary> /// </summary>
[Description("Referenzbereich ausgeben, falls Wert nicht normal ist")] [Description("Bei pathologischem Wert")]
IfAbnormal, IfAbnormal,
/// <summary> /// <summary>
/// Write normal range if item is marked in dictionary, or if value is abnormal /// Write normal range if item is marked in dictionary, or if value is abnormal
/// </summary> /// </summary>
[Description("Referenzbereich ausgeben, falls Parameter so markiert ist oder falls Wert nicht normal ist")] [Description("Bei pathologischem Wert oder speziellem Parameter")]
IfSpecialOrAbnormal, IfSpecialOrAbnormal,
/// <summary> /// <summary>
/// Always write normal range reference /// Always write normal range reference
/// </summary> /// </summary>
[Description("Referenzbereich immer ausgeben")] [Description("Immer")]
Always Always
} }
} }

View File

@ -28,6 +28,57 @@ namespace zaaReloaded2.Formatter
/// </summary> /// </summary>
public class TimePointFormatter public class TimePointFormatter
{ {
#region Static methods
/// <summary>
/// Builds a header paragraph from a Date,
/// but only if the Date structure has a value.
/// </summary>
public static string DateHeader(DateTime date)
{
if (date != _nullTimeStamp.Date)
{
return FormatHeader(date.ToShortDateString());
}
else
{
return String.Empty;
}
}
/// <summary>
/// Builds a header paragraph from a DateTime structure,
/// but only if the DateTime structure has a value.
/// </summary>
public static string DateAndTimeHeader(DateTime dateTime)
{
if (dateTime != _nullTimeStamp)
{
return FormatHeader(dateTime.ToString());
}
else
{
return String.Empty;
}
}
#endregion
#region Private static methods
static string FormatHeader(string text)
{
return String.Format("<style:{0}>Laborwerte vom {1}:{2}<style:{3}>",
// Environment.NewLine,
Properties.Settings.Default.StyleHeader,
text,
Environment.NewLine,
Properties.Settings.Default.StyleParagraph
);
}
#endregion
#region Properties #region Properties
/// <summary> /// <summary>
@ -77,7 +128,7 @@ namespace zaaReloaded2.Formatter
/// <returns></returns> /// <returns></returns>
public string GetDateHeader() public string GetDateHeader()
{ {
return FormatHeader(TimeStamp.ToShortDateString()); return DateHeader(TimeStamp);
} }
@ -88,21 +139,14 @@ namespace zaaReloaded2.Formatter
/// <returns></returns> /// <returns></returns>
public string GetDateAndTimeHeader() public string GetDateAndTimeHeader()
{ {
return FormatHeader(TimeStamp.ToString()); return DateAndTimeHeader(TimeStamp);
} }
#endregion #endregion
#region Private methods #region Fields
string FormatHeader(string text) static readonly DateTime _nullTimeStamp = new DateTime();
{
return String.Format("{0}{1}:{2}",
Environment.NewLine,
text,
Environment.NewLine
);
}
#endregion #endregion
} }

BIN
zaaReloaded2/Icons/d.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1012 B

BIN
zaaReloaded2/Icons/dk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
zaaReloaded2/Icons/down.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

BIN
zaaReloaded2/Icons/exit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

BIN
zaaReloaded2/Icons/fff.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
zaaReloaded2/Icons/gear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
zaaReloaded2/Icons/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

BIN
zaaReloaded2/Icons/pen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 739 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

BIN
zaaReloaded2/Icons/plus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

BIN
zaaReloaded2/Icons/up.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 B

View File

@ -30,6 +30,11 @@ namespace zaaReloaded2.Importer
/// </summary> /// </summary>
Laboratory Laboratory { get; set; } Laboratory Laboratory { get; set; }
/// <summary>
/// Indicates whether the import was successful.
/// </summary>
bool Success { get; }
/// <summary> /// <summary>
/// Imports laboratory data contained in a string. /// Imports laboratory data contained in a string.
/// </summary> /// </summary>

Some files were not shown because too many files have changed in this diff Show More