Merge branch 'controller-upgrade'

This commit is contained in:
Micke Prag 2013-05-29 12:23:50 +02:00
commit b45ee3aba3
21 changed files with 8277 additions and 7 deletions

View file

@ -10,6 +10,7 @@ SET( Plugin_SRCS
controller.cpp controller.cpp
controllerlist.cpp controllerlist.cpp
controllersplugin.cpp controllersplugin.cpp
tellstick.cpp
) )
SET( Plugin_HDRS SET( Plugin_HDRS
@ -19,12 +20,19 @@ SET( Plugin_HDRS
SET( Plugin_MOC_HDRS SET( Plugin_MOC_HDRS
controller.h controller.h
controllerlist.h controllerlist.h
tellstick.h
)
SET( Plugin_RESOURCES
controllers.qrc
) )
SET( Plugin_PATH "com.telldus.controllers" ) SET( Plugin_PATH "com.telldus.controllers" )
SET( Plugin_EXTRA SET( Plugin_EXTRA
btn_action_remove.png btn_action_remove.png
btn_action_upgrade.png
ControllerUpgradeDialog.qml
ControllerView.qml ControllerView.qml
header_bg.png header_bg.png
HeaderTitle.qml HeaderTitle.qml
@ -32,11 +40,13 @@ SET( Plugin_EXTRA
main.qml main.qml
qmldir qmldir
row_bg.png row_bg.png
StateLabel.qml
tellstick.png tellstick.png
tellstick_duo.png tellstick_duo.png
) )
FIND_LIBRARY(FTD2XX_LIBRARY ftd2xx)
FIND_PACKAGE(TelldusCore REQUIRED) FIND_PACKAGE(TelldusCore REQUIRED)
SET( Plugin_LIBRARIES ${TELLDUSCORE_LIBRARY} ) SET( Plugin_LIBRARIES ${TELLDUSCORE_LIBRARY} ${FTD2XX_LIBRARY} )
INCLUDE( ../TelldusCenterPlugin.cmake NO_POLICY_SCOPE ) INCLUDE( ../TelldusCenterPlugin.cmake NO_POLICY_SCOPE )

View file

@ -0,0 +1,124 @@
import QtQuick 1.1
import QtDesktop 0.1
Window {
id: controllerUpgradeDialog
width: 400
height: 200
modal: true
title: "Upgrade TellStick"
visible: false
deleteOnClose: false
property int step: controller.upgradeStep
property variant controller: undefined
Connections {
target: controller
onUpgradeDone: state = 'upgradeDone'
}
Item {
id: confirm
anchors.top: parent.top
anchors.left: parent.left
width: parent.width
height: parent.height
clip: true
Item {
anchors.fill: parent
anchors.margins: 16
Column {
Text { text: "This will upgrade your TellStick to the latest version.\n\n" }
Text { text: "Please do not unplug the TellStick or end the application during upgrade." }
Text { text: "Doing so might render the TellStick unusable." }
}
Row {
anchors.bottom: parent.bottom
anchors.right: parent.right
spacing: 8
Button {
text: "Upgrade"
onClicked: controllerUpgradeDialog.state = 'upgrade'
}
Button {
text: "Close"
onClicked: controllerUpgradeDialog.visible = false
}
}
}
}
Item {
id: content
anchors.topMargin:16
anchors.margins: 16
anchors.top: parent.top
anchors.left: parent.right
width: parent.width - 32
height: parent.height - 32
anchors.right: undefined
clip: true
Column {
StateLabel { text: "1. Disconnecting TellStick"; currentState: controllerUpgradeDialog.step; state: 0 }
StateLabel { text: "2. Aquiring TellStick"; currentState: controllerUpgradeDialog.step; state: 1 }
StateLabel { text: "3. Entering bootloader"; currentState: controllerUpgradeDialog.step; state: 2 }
StateLabel { text: "4. Uploading firmware"; currentState: controllerUpgradeDialog.step; state: 3 }
StateLabel { text: "5. Rebooting TellStick"; currentState: controllerUpgradeDialog.step; state: 4 }
StateLabel { text: "6. Connecting TellStick"; currentState: controllerUpgradeDialog.step; state: 5 }
}
ProgressBar {
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
minimumValue: 0
maximumValue: 100
value: controller.upgradeProgress
}
}
Item {
id: done
anchors.top: parent.top
anchors.left: parent.right
width: parent.width
height: parent.height
clip: true
Item {
anchors.fill: parent
anchors.margins: 16
Column {
Text { text: "Upgrade done.\n\n" }
Text { text: "Your TellStick has now been flashed with the latest firmware." }
}
Button {
anchors.bottom: parent.bottom
anchors.right: parent.right
text: "Close"
onClicked: controllerUpgradeDialog.visible = false
}
}
}
states: [
State {
name: 'upgrade'
AnchorChanges { target: confirm; anchors.left: undefined; anchors.right: controllerUpgradeDialog.left }
AnchorChanges { target: content; anchors.left: controllerUpgradeDialog.left; anchors.right: undefined }
StateChangeScript { script: controller.upgrade() }
},
State {
name: 'upgradeDone'
AnchorChanges { target: confirm; anchors.left: undefined; anchors.right: controllerUpgradeDialog.left }
AnchorChanges { target: content; anchors.left: undefined; anchors.right: controllerUpgradeDialog.left }
AnchorChanges { target: done; anchors.left: controllerUpgradeDialog.left; anchors.right: undefined }
}
]
transitions: [
Transition {
AnchorAnimation { duration: 500; easing.type: Easing.InOutQuad }
}
]
}

View file

@ -2,12 +2,38 @@ import QtQuick 1.1
import QtDesktop 0.1 import QtDesktop 0.1
BorderImage { BorderImage {
id: view
source: "row_bg.png" source: "row_bg.png"
border.left: 5; border.top: 5 border.left: 5; border.top: 5
border.right: 5; border.bottom: 5 border.right: 5; border.bottom: 5
width: parent.width width: parent.width
height: content.height + content.anchors.margins*2 height: content.height + content.anchors.margins*2
property variant c: controller //Needed for upgradeDialogComponent
Component {
id: upgradeDialogComponent
ControllerUpgradeDialog {
controller: c
}
}
Loader {
id: upgradeDialog
visible: false
onVisibleChanged: {
if (visible) {
upgradeDialog.sourceComponent = upgradeDialogComponent
upgradeDialog.item.visible = true
} else {
upgradeDialog.sourceComponent = undefined
}
}
Connections {
target: upgradeDialog.item
onVisibleChanged: upgradeDialog.visible = upgradeDialog.item.visible
}
}
Item { Item {
id: content id: content
anchors.top: parent.top anchors.top: parent.top
@ -50,6 +76,14 @@ BorderImage {
onClicked: controller.tryRemove(); onClicked: controller.tryRemove();
} }
} }
Image {
source: "btn_action_upgrade.png"
visible: controller.upgradable
MouseArea {
anchors.fill: parent
onClicked: upgradeDialog.visible = true
}
}
} }
} }

View file

@ -0,0 +1,10 @@
import QtQuick 1.1
import QtDesktop 0.1
Text {
property int currentState: -1
property int state: 0
id: stateLabel;
text: ""
font.bold: state == currentState
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -6,8 +6,9 @@
class Controller::PrivateData { class Controller::PrivateData {
public: public:
bool available, nameChanged; bool available, nameChanged;
int id, type; int id, type, upgradeStep;
QString name, serial, firmware; QString name, serial, firmware;
qreal upgradeProgress;
}; };
Controller::Controller(int id, int type, const QString &name, QObject *parent) : Controller::Controller(int id, int type, const QString &name, QObject *parent) :
@ -19,6 +20,8 @@ Controller::Controller(int id, int type, const QString &name, QObject *parent) :
d->available = false; d->available = false;
d->nameChanged = false; d->nameChanged = false;
d->name = name; d->name = name;
d->upgradeStep = -1;
d->upgradeProgress = 0;
const int DATA_LENGTH = 255; const int DATA_LENGTH = 255;
char buff[DATA_LENGTH]; char buff[DATA_LENGTH];
@ -42,6 +45,7 @@ void Controller::setAvailable(bool available) {
d->available = available; d->available = available;
emit availableChanged(); emit availableChanged();
emit firmwareChanged(); emit firmwareChanged();
emit upgradableChanged();
} }
QString Controller::firmware() const { QString Controller::firmware() const {
@ -100,3 +104,39 @@ int Controller::type() const {
return d->type; return d->type;
} }
bool Controller::upgradable() const {
if (!this->available()) {
return false;
}
return isUpgradable();
}
void Controller::upgrade() {
//Do nothing
}
qreal Controller::upgradeProgress() {
return d->upgradeProgress;
}
int Controller::upgradeStep() const {
return d->upgradeStep;
}
void Controller::setUpgradeStep(int newStep) {
d->upgradeStep = newStep;
if (newStep = -1) {
setUpgradeProgress(0);
}
emit upgradeStepChanged();
}
void Controller::setUpgradeProgress(qreal completed) {
d->upgradeProgress = completed;
emit upgradeProgressChanged();
}
bool Controller::isUpgradable() const {
return false;
}

View file

@ -12,14 +12,17 @@ class Controller : public QObject
Q_PROPERTY(int id READ id NOTIFY idChanged) Q_PROPERTY(int id READ id NOTIFY idChanged)
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString serial READ serial NOTIFY serialChanged) Q_PROPERTY(QString serial READ serial NOTIFY serialChanged)
Q_PROPERTY(int type READ type NOTIFY typeChanged()) Q_PROPERTY(int type READ type NOTIFY typeChanged)
Q_PROPERTY(bool upgradable READ upgradable NOTIFY upgradableChanged)
Q_PROPERTY(qreal upgradeProgress READ upgradeProgress NOTIFY upgradeProgressChanged)
Q_PROPERTY(int upgradeStep READ upgradeStep NOTIFY upgradeStepChanged)
public: public:
explicit Controller(int id = 0, int type = 1, const QString &name = "", QObject *parent = 0); explicit Controller(int id = 0, int type = 1, const QString &name = "", QObject *parent = 0);
~Controller(); virtual ~Controller();
bool available() const; bool available() const;
void setAvailable(bool available); virtual void setAvailable(bool available);
QString firmware() const; QString firmware() const;
void setFirmware(const QString &version); void setFirmware(const QString &version);
@ -37,6 +40,11 @@ public:
int type() const; int type() const;
bool upgradable() const;
Q_INVOKABLE virtual void upgrade();
qreal upgradeProgress();
int upgradeStep() const;
signals: signals:
void availableChanged(); void availableChanged();
void firmwareChanged(); void firmwareChanged();
@ -44,6 +52,15 @@ signals:
void nameChanged(); void nameChanged();
void serialChanged(); void serialChanged();
void typeChanged(); void typeChanged();
void upgradableChanged();
void upgradeProgressChanged();
void upgradeStepChanged();
void upgradeDone();
protected:
virtual bool isUpgradable() const;
void setUpgradeStep(int newStep);
void setUpgradeProgress(qreal completed);
private: private:
class PrivateData; class PrivateData;

View file

@ -1,5 +1,6 @@
#include "controllerlist.h" #include "controllerlist.h"
#include "controller.h" #include "controller.h"
#include "tellstick.h"
#include <QDebug> #include <QDebug>
@ -25,7 +26,7 @@ ControllerList::ControllerList(QObject *parent) :
char name[DATA_LENGTH]; char name[DATA_LENGTH];
int available, controllerId, type; int available, controllerId, type;
while(tdController(&controllerId, &type, name, DATA_LENGTH, &available) == TELLSTICK_SUCCESS) { while(tdController(&controllerId, &type, name, DATA_LENGTH, &available) == TELLSTICK_SUCCESS) {
Controller *controller = new Controller(controllerId, type, QString::fromUtf8(name), this); Controller *controller = loadController(controllerId, type, QString::fromUtf8(name), this);
controller->setAvailable(available); controller->setAvailable(available);
connect(controller, SIGNAL(nameChanged()), this, SIGNAL(changed())); connect(controller, SIGNAL(nameChanged()), this, SIGNAL(changed()));
d->list.append(controller); d->list.append(controller);
@ -72,7 +73,7 @@ void ControllerList::controllerEventSlot(int controllerId, int changeEvent, int
if (changeEvent == TELLSTICK_DEVICE_ADDED) { if (changeEvent == TELLSTICK_DEVICE_ADDED) {
beginInsertRows( QModelIndex(), d->list.size(), d->list.size() ); beginInsertRows( QModelIndex(), d->list.size(), d->list.size() );
Controller *controller = new Controller(controllerId, changeType, "", this); Controller *controller = loadController(controllerId, changeType, "", this);
controller->setAvailable(true); controller->setAvailable(true);
connect(controller, SIGNAL(nameChanged()), this, SIGNAL(changed())); connect(controller, SIGNAL(nameChanged()), this, SIGNAL(changed()));
d->list.append(controller); d->list.append(controller);
@ -93,6 +94,13 @@ void ControllerList::controllerEventSlot(int controllerId, int changeEvent, int
} }
} }
Controller *ControllerList::loadController(int id, int type, const QString &name, QObject *parent) {
if (type == 1 || type == 2) {
return new TellStick(id, type, "", parent);
}
return new Controller(id, type, "", parent);
}
void WINAPI ControllerList::controllerEvent( int controllerId, int changeEvent, int changeType, const char *newValue, int callbackId, void *context) { void WINAPI ControllerList::controllerEvent( int controllerId, int changeEvent, int changeType, const char *newValue, int callbackId, void *context) {
ControllerList *controllerList = reinterpret_cast<ControllerList *>(context); ControllerList *controllerList = reinterpret_cast<ControllerList *>(context);
if (!controllerList) { if (!controllerList) {

View file

@ -5,6 +5,8 @@
#include <QScriptValue> #include <QScriptValue>
#include <telldus-core.h> #include <telldus-core.h>
class Controller;
class ControllerList : public QAbstractListModel class ControllerList : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
@ -27,6 +29,7 @@ private slots:
void controllerEventSlot(int controllerId, int changeEvent, int changeType, const QString &newValue); void controllerEventSlot(int controllerId, int changeEvent, int changeType, const QString &newValue);
private: private:
static Controller *loadController(int id, int type, const QString &name, QObject *parent);
static void WINAPI controllerEvent( int controllerId, int changeEvent, int changeType, const char *newValue, int callbackId, void *context); static void WINAPI controllerEvent( int controllerId, int changeEvent, int changeType, const char *newValue, int callbackId, void *context);
class PrivateData; class PrivateData;
PrivateData *d; PrivateData *d;

View file

@ -0,0 +1,7 @@
<RCC>
<qresource prefix="/">
<file>firmware/TellStick.hex</file>
<file>firmware/TellStickDuo.hex</file>
<file>firmware/TellStickNet.hex</file>
</qresource>
</RCC>

View file

@ -0,0 +1,114 @@
:100000001728FF3FFF3FFF3FFF00030E83018316CA
:10001000AA000408A9000A08AB008A012B088A007C
:10002000290884002A0E8300FF0E7F0E09000D3080
:1000300003138316AC000A30AD002B30AE005630EF
:10004000AF00B0010D30B1000A30B200B30154303E
:10005000B4005330B5003030B6003030B700313026
:10006000B800B9010B30BC000A30BD00BE017223DC
:100070008501860187018312850186018701871426
:1000800035237823AC308316C0001C233630C800DB
:100090006A23B1308316C0001C2303138316031395
:1000A00083166123700803194D2845237008A800A2
:1000B00067289028BE144D289028BC30C800A6227E
:1000C0004D28BD30C800A6224D2890284D2828086C
:1000D000423A031959282808443A03195A2828088B
:1000E000483A03195C2828084D3A03195C28280867
:1000F0004E3A03195C282808503A03195D2828084D
:10010000523A031961282808533A03196528280828
:10011000543A031965282808563A031965286628B1
:10012000F822700803194D282B30C8006A23831663
:100130002808C8006A2383162808533A031DCC28D0
:10014000BA01BB0180303B06F00080307002031D15
:10015000AB283D083A020318CB28831287102D22C2
:1001600087148316BF013C083F020318C7280330D9
:10017000FB00FF30FA00FB0BBE28C128FA0BBE289B
:10018000BB289630FA00FA0BC328BF0AB328BA0A74
:100190000319BB0AA22815292808543A031DFC2874
:1001A000BA01BB0180303B06F00080307002031DB5
:1001B000DB283D083A020318FB28831287102C2104
:1001C00087148316BF013C083F020318F728033049
:1001D000FB00FF30FA00FB0BEE28F128FA0BEE28AB
:1001E000EB289630FA00FA0BF328BF0AE328BA0A84
:1001F0000319BB0AD22815292808563A031D0429D9
:100200003630C8006A23152983162808483A031D8A
:100210000D293330C8006A231529831628084D3A62
:10022000031D1529B430C0001C23031383160313C8
:100230008316BE1C1E292030C0001C23BE100B30AC
:10024000BC000A30BD000D30C8006A230A30831696
:10025000C8006A234D282B2903138316C4012030BC
:10026000C000C101043041020318B42940088400D1
:100270000008F2007208013A031D53290130F4000E
:100280004108F000740803194929F00D7010FF3F70
:100290004329A030F00770088400FF308000FF3051
:1002A000840A8000B1290130F4004108F00074088C
:1002B00003195E29F00D7010FF3F58297008A03F08
:1002C000F200400884000008F00072088400700802
:1002D0008000840A80010130F4004108F0007408B5
:1002E00003197629F00D7010FF3F70297008A03FA8
:1002F000C700470884000008F000840A0008F100E5
:100300000A30F4000030F500CD228316470884003F
:10031000700880007108840A80000130F4004108F0
:10032000F000740803199829F00D7010FF3F92290E
:100330007008A03FF200720884000008F000840AF0
:100340000008F1007008FF3CF0007108031C013F39
:10035000FF3CF10072088400700880007108840A74
:100360008000C00AC10A3229400884000008C20087
:10037000C00A831210100C1483164208003C0318A4
:10038000282A400884000008C300C101043041024B
:100390000318262AC0304305F4000630F200740822
:1003A000F00072080319D829F00CF013FF3FD2298E
:1003B0000130F40074080319E129F00D7010FF3FBB
:1003C000DB297008A03F84000008F200840A0008BE
:1003D000F3007208C5007308C600C30D4310C30DB7
:1003E00043107308FF3A031DF729FF307206031DFF
:1003F000FB29C4091E2A83120C1CFB2910100C10A7
:10040000003083164505F4004608FF39F5007508ED
:10041000F000F101700883128F00831645088312E3
:100420008E0083164409F0007008C4000030701874
:100430002030831206062039860610148316C20364
:1004400001304202031C262AC10AC629C00ABC295F
:1004500083120C1C282A8612080003138316C3017A
:10046000831210100C1420308316C200420884003E
:100470000008F2007208003A0319A12A4208840019
:100480000008F2007208013A031D482AC3099E2A97
:10049000420884000008C000C1010030C1004008CB
:1004A000F2004108F300F20DF30D7210F20DF30D9E
:1004B0007210F20DF30D72107208C0007308C100C3
:1004C000420884000008F0007008F007F1010318EA
:1004D000F10A7208F00773080318013FF10770086A
:1004E000C0007108C1007008FF3CC0007108031C07
:1004F000013FFF3CC10083120C1C7B2A10100C1022
:10050000003083164005F4004108FF39F5007508F6
:10051000F000F101700883128F00831640088312E7
:100520008E0083164309F0007008C3000030701875
:100530002030831206062039860610148316C20A5C
:10054000362A83120C1CA12A861208000313831674
:10055000C901831210100C108F018E0110140313A7
:1005600083128C1AC32A0C1CBB2A8316C90A831255
:100570008F018E010C10053083164902031CC22A1C
:10058000F0010800AF2A03138316532348088400A0
:10059000700880000130F000080003138312FB0193
:1005A000FA01F9018030F800F10CF00C031CE12A8B
:1005B0007408F90775080318750FFA070318FB0A82
:1005C0000310F01FE92A7408FA0775080318750F5D
:1005D000FB07FB0CFA0CF90CF80C031CD42A7B0863
:1005E000F3007A08F2007908F1007808F0000800BA
:1005F00003138316C0012030C1005030400203189D
:100600001A2B4108C800A6227008031D092BF0010F
:100610000800410884000008F10071082B3A031D0E
:10062000172B4108840080010130F0000800C10A46
:10063000C00AFD2AF001080003138316C101C2019C
:100640004108400784000008F1007108003A0319CE
:10065000342B4108400784000008C8006A23831631
:10066000C10A0319C20A202B08006730031383163E
:100670009900181398161812181583129817181342
:1006800018168316861406110800031383121A081D
:100690008316C0008312981C4F2B1812181683164D
:1006A0004008F0000800031383121A088316CA00DA
:1006B0008312981C5D2B1812181683164A08F00036
:1006C00008000030031383128C1A0130F100710806
:1006D000F000080003138316981C6A2B4808831245
:1006E00099000800031383160F178F160F160800C2
:1006F00003138312901210160800FF3FFF3FFF3FC5
:04400E00F42FFFFF8D
:00000001FF

View file

@ -0,0 +1,967 @@
:0400000014EF00F009
:10000800FACFB6F4FBCFB7F4E9CFB8F4BCED19F0EA
:10001800D8CFA4F4E8CFA5F4E0CFA6F48CEF18F07D
:1000280004EE33F07C0EF66E000EF76E10EE27F03D
:1000380035EC00F000EE00F014EE33F02EEC00F09A
:1000480005EE00F011EE00F02EEC00F0000EF86E58
:100058004CEF1CF0EE6AE550E150FCE1E250FAE1A9
:1000680012000900F5CFEEFFE550E150FAE1E25049
:10007800F8E1120074656D70657261747572656877
:10008800756D696469747900010000000001000061
:100098000100FFFFF3FFFFFF80FFFF0085D1040190
:1000A80004015F51D8B401D001D014D04C0E040122
:1000B8000401606501D001D00DD0520E0401040185
:1000C800606101D001D006D00401716F010E0F6E7E
:1000D800040171517DD1190E04010401606501D03C
:1000E80001D00ED01E0E04010401606101D001D0C0
:1000F80007D00401716F030E0F6E0401715168D1AE
:10010800270E04010401606501D001D00ED02C0E29
:1001180004010401606101D001D007D00401716FAE
:10012800040E0F6E0401715153D1FFEC1AF050D137
:10013800180E04010401606501D001D0F6D71D0E28
:1001480004010401606101D001D0EFD70401716F8F
:10015800050E0F6E040171513BD1030E0401040119
:10016800606501D001D0E1D7090E04010401606186
:1001780001D001D0DAD70401716F070E0F6E0401A8
:10018800715126D10E6601D001D02DD0010E040187
:100198000401606501D001D00ED0050E04010401F0
:1001A800606101D001D007D00401716F010E0E6E9D
:1001B800040171510DD1040E04010401606501D0E0
:1001C80001D00ED0080E04010401606101D001D0F5
:1001D80007D00401716F020E0E6E04017151F8D040
:1001E800FFEC1AF0F5D00E04D8A401D001D023D02A
:1001F800040E04010401606501D001D096D7080EF1
:1002080004010401606101D001D08FD70401716F2E
:10021800000E0E6E04017151040104012D4B2E2BAA
:100228000401D890040147370401483704014937CD
:1002380004014A37CDD00E50020AD8A401D001D00B
:1002480027D0010E04010401606501D001D06DD7EB
:10025800050E04010401606101D001D066D70401D4
:10026800716F000E0E6E04017151040104012D4BD3
:100278002E2B04010401475109120401D8900401EE
:100288004737040148370401493704014A37A0D0E9
:10029800FFEC1AF09DD00E6601D001D02DD0030ED0
:1002A80004010401606501D001D00ED0090E0401DB
:1002B8000401606101D001D007D00401716F010E03
:1002C8000E6E0401715184D0080E040104016065AA
:1002D80001D001D00ED0100E04010401606101D0DC
:1002E80001D007D00401716F020E0E6E0401715126
:1002F8006FD0FFEC1AF06CD00E04D8A401D001D056
:1003080023D0080E04010401606501D001D00DD787
:10031800100E04010401606101D001D006D7040168
:10032800716F000E0E6E04017151040104012D4B12
:100338002E2B0401D89004014737040148370401E3
:10034800493704014A3744D00E50020AD8A401D0D4
:1003580001D027D0030E04010401606501D001D04B
:10036800E4D6090E04010401606101D001D0DDD694
:100378000401716F000E0E6E040171510401040135
:100388002D4B2E2B04010401475109120401D8906A
:1003980004014737040148370401493704014A3743
:1003A80017D0FFEC1AF014D00F50000A01E177D6ED
:1003B800010A01E190D6020A01E1E4D6070A01E147
:1003C800B7D6010A01E1C9D6020A01E164D700D013
:1003D800040104012D51080A2E11D8A401D001D01E
:1003E8004DD0032A050E036001D001D033D0095047
:1003F8001324136E000E1420146E000E1520156EB3
:10040800000E1620166E040E036001D001D010D025
:1004180013C072F414C073F415C074F40401716B42
:1004280071C413F072C414F073C415F074C416F0D8
:1004380009501724176E000E1820186E000E192088
:10044800196E000E1A201A6E0401716F000E096EE3
:1004580004017151000E040104012D6F000E040106
:100468002E6F010E04010401476F000E0401486F4E
:10047800000E0401496F000E04014A6F0F50030A71
:10048800D8A401D001D04ED00350040AD8A401D07A
:1004980001D048D013C061F414C062F415C063F4ED
:1004A80016C064F4FFEC1AF051EC1DF0BB0E040109
:1004B8000401806F790E0401816F7E0E040104012E
:1004C8007E6F790E04017F6F22EC1DF0330E04015C
:1004D8000401806F790E0401816FC70E04010401C5
:1004E8007E6F790E04017F6F22EC1DF061C480F4E9
:1004F80062C481F463C482F464C483F4DD0E04012D
:1005080004017E6F790E04017F6F79EC13F004010A
:10051800716F010E040104017E6F0401715143ECF7
:100528001DF0A4D00F50070AD8A401D001D09DD047
:100538000350050AD8A401D001D097D0095004016E
:100548000401656F0401666B0401676B0401686B45
:1005580017C069F418C06AF419C06BF41AC06CF4B7
:1005680013C06DF414C06EF415C06FF416C070F4A7
:10057800FFEC1AF004010401655104010401692526
:100588000401716F040104016651040104016A2128
:100598000401726F040104016751040104016B2115
:1005A8000401736F040104016851040104016C2102
:1005B8000401746FFF0E040171150401756F000EBC
:1005C800040172150401766F000E0401731504010D
:1005D800776F000E040174150401786F0401750526
:1005E800761177117811D8B401D001D001D03ED05E
:1005F80051EC1DF0BB0E04010401806F790E04015B
:10060800816F7E0E040104017E6F790E04017F6FF5
:1006180022EC1DF0240E04010401806F790E040100
:10062800816FC70E040104017E6F790E04017F6F8C
:1006380022EC1DF06DC480F46EC481F46FC482F4A2
:1006480070C483F4DD0E040104017E6F790E040189
:100658007F6F79EC13F00401716F010E040104013E
:100668007E6F0401715143EC1DF000D012000401AB
:100678008D0E04010401946F0401040E0401956FAA
:10068800DFD1040104019351250AD8B401D001D067
:1006980005D093C49CF4AEEC1CF0D2D104019A6F3F
:1006A800000E04010401926F04019A5161D0DBD15C
:1006B8007ED004010401928F7AD0040194C4E9FF2A
:1006C800040195C4EAFF0401020E04019427000EF8
:1006D800040195230401EECF96F40401EDCF97F4BD
:1006E8000401040197519611D8A401D001D007D074
:1006F8009F0E04010401966F790E0401976F1BD0B9
:10070800040104019651F66EE96E050EEA6E0401C5
:1007180004019751EA6403D0EA6EEF5003D0F76EF4
:100728000800F550040104019C6FAEEC1CF00401B4
:100738000401964B972B040104019651F66EE96E5D
:10074800050EEA6E040104019751EA6403D0EA6ECB
:10075800EF5003D0F76E0800F5500009D8A401D077
:1007680001D0CED76DD1C00E0401040192131FD061
:1007780004018BC4F6FF04018CC4F7FF04010401D3
:100788008B4B8C2B08000401F5CF93F40401935193
:10079800000A8DE0580A8DE03C0A8AE00D0A88E0DC
:1007A8001A0A8BE0060ADFE00D0A83E0DBD70401B2
:1007B80004019251C00BD8A401D001D025D0040166
:1007C80094C4E9FF040195C4EAFF0401020E040180
:1007D8009427000E040195230401EECF96F404013A
:1007E800EDCF97F40401040197AF01D001D00BD0ED
:1007F800030E04010401921304010401966D04011F
:10080800971FD8B0972B13D0040194C4E9FF0401B3
:1008180095C4EAFF0401020E04019427000E0401A6
:1008280095230401EECF96F40401EDCF97F478D028
:1008380004019A6F010E04010401936F04019A5197
:10084800040104019351050AD8A401D001D001D0B4
:100858002AD0040104019351020DEA0EF324F66E26
:10086800F76A780EF7220900F5CF9AF40900F5CF58
:100878009BF404019A5104010401965D04019B5103
:10088800040104019759D8B001D001D001D00BD090
:1008980004010401932B040104019351050AD8A40F
:1008A80001D001D0D6D748D004019A6F010E0401B7
:1008B8000401936F04019A51040104019351040A3D
:1008C800D8A401D001D001D0EED70401040193517E
:1008D800020DF40EF324F66EF76A780EF72209007B
:1008E800F5CF9AF40900F5CF9BF404019A5104015D
:1008F8000401965D04019B51040104019759D8B085
:1009080001D001D001D0CFD704010401932B0401F9
:1009180004019351040AD8A401D001D0D6D70CD031
:10092800040104019251C00B000A82E0800ABCE075
:10093800400A01E17DD700D0040104019251030B64
:10094800D8B401D001D00AD004019A6F2D0E040149
:1009580004019C6F04019A51AEEC1CF093C491F40D
:1009680066D056D0040104019151020DEA0EF32419
:10097800F66EF76A780EF72209000401F5CF9EF4A7
:100988000A000401F5CF9FF496C49CF497C49DF423
:1009980026EC16F09CC49CF49DC49DF40A0E040138
:1009A80004019E6F000E04019F6FDAEC18F0040139
:1009B80004019C51300F04010401936F34D00401E9
:1009C80004019151020DF40EF324F66EF76A780EC5
:1009D800F72209000401F5CF9EF40A000401F5CFBF
:1009E8009FF496C49CF497C49DF426EC16F00F0E61
:1009F800040104019C17130E040104019C25F66EE2
:100A0800F76A790EF72208000401F5CF93F40BD0AA
:100A1800040104019251C00B000AA4E0800ACFE04F
:100A2800400AA0E000D093C49CF4AEEC1CF0040192
:100A38000401910704019129D8A401D001D091D7CC
:100A480004018BC4F6FF04018CC4F7FF0401040100
:100A58008B4B8C2B08000401F5CF93F404019367AA
:100A680001D001D00ED600D01200000E04010401FE
:100A7800666F000E0401676F000E0401686F000EB8
:100A88000401696F0401610E04010401876F040108
:100A9800040E0401886F04015F0E04010401856FD0
:100AA8000401040E0401866FA5EC1BF00401610E1D
:100AB80004010401806F0401040E0401816F040124
:100AC8005F0E040104017E6F0401040E04017F6FB0
:100AD800C4EC15F0010E04010401626F000E04015C
:100AE800636F000E0401646F000E0401656F000E51
:100AF800040104016A6F000E04016B6F0401040114
:100B08006B51800A800F200ED8B46A5DD8A001D03E
:100B180001D001D070D00401610E04010401806F7E
:100B28000401040E0401816F04015F0E0401040135
:100B38007E6F0401040E04017F6FC4EC15F00401FC
:100B480004016C6F0401610E04010401806F04014B
:100B5800040E0401816F04015F0E040104017E6F1D
:100B68000401040E04017F6FC4EC15F004010401B4
:100B78006D6F1CD026D004010401625104010401E8
:100B8800661304010401635104010401671304019D
:100B9800040164510401040168130401040165514E
:100BA8000401040169130DD0000E2CD16DC47FF42B
:100BB8006CC47EF429EC1CF0000ADCE0010ADBE0DE
:100BC800F3D70401D89004016237040163370401A4
:100BD800643704016537040104016A4B6B2B040177
:100BE80004016B51800A800F200ED8B46A5DD8A02A
:100BF80001D001D090D7040166C46EF4040167C423
:100C08006FF4040168C470F4040169C471F4040148
:100C18006E1F6F1F701F711F110E06D0D890040130
:100C2800713370336F336E33E82EF8D7FF0E04013B
:100C38006E150401726F000E04016F150401736FC5
:100C4800000E040170150401746F000E0401711583
:100C58000401756F040166C476F4040167C477F46F
:100C6800040168C478F4040169C479F4190E06D043
:100C7800D89004017933783377337633E82EF8D770
:100C8800FF0E0401761504017A6F000E0401771532
:100C980004017B6F000E0401781504017C6F000EBF
:100CA8000401791504017D6F0401755104017D1952
:100CB8000EE10401745104017C1909E10401735126
:100CC80004017B1904E10401725104017A19D8B4B2
:100CD80001D001D002D0000E95D0FF0E040166C4E9
:100CE8006EF4040167C46FF4040168C470F404016D
:100CF80069C471F404016E1F6F1F701F711F040116
:100D08006E150401726F000E04016F150401736FF4
:100D1800000E040170150401746F000E04017115B2
:100D28000401756FFF0E040166C476F4040167C4FC
:100D380077F4040168C478F4040169C479F477C4C9
:100D480076F478C477F479C478F40401796B0401F3
:100D5800761504017A6F000E0401771504017B6F84
:100D6800000E0401781504017C6F000E040179154A
:100D780004017D6F0401755104017D190EE1040120
:100D8800745104017C1909E10401735104017B19B0
:100D980004E10401725104017A19D8B401D001D0D8
:100DA80002D0000E2FD051EC1DF0F00E040104010A
:100DB800806F790E0401816F7E0E040104017E6F3D
:100DC800790E04017F6F22EC1DF066C480F467C4BD
:100DD80081F468C482F469C483F4DD0E040104015B
:100DE8007E6F790E04017F6F79EC13F004016E6F4A
:100DF800020E040104017E6F04016E5143EC1DF0E4
:100E0800010E00D01200000E040104016A6F000EEA
:100E180004016B6F000E04016C6F000E04016D6F0E
:100E2800010E04010401666F000E0401676F000ED5
:100E38000401686F000E0401696F000E04010401CB
:100E4800626F000E0401636F000E04010401646FF9
:100E5800000E0401656F0401610E04010401876F2F
:100E68000401040E0401886F04015F0E04010401EB
:100E7800856F0401040E0401866FA5EC1BF00401C4
:100E8800610E04010401806F0401040E0401816FE6
:100E980004015F0E040104017E6F0401040E0401C5
:100EA8007F6FC4EC15F0040104016551800A800FBE
:100EB800240ED8B4645DD8A001D001D001D018D1D7
:100EC8000401610E04010401806F0401040E040191
:100ED800816F04015F0E040104017E6F0401040E9A
:100EE80004017F6FC4EC15F0040104016E6F040166
:100EF800610E04010401806F0401040E0401816F76
:100F080004015F0E040104017E6F0401040E040154
:100F18007F6FC4EC15F0040104016F6F0401610ECA
:100F280004010401806F0401040E0401816F0401AF
:100F38005F0E040104017E6F0401040E04017F6F3B
:100F4800C4EC15F004010401706F0401610E040182
:100F58000401806F0401040E0401816F04015F0E17
:100F6800040104017E6F0401040E04017F6FC4ECC8
:100F780015F004010401716F7CD00401040165516E
:100F8800800A800F200ED8B4645DD8A001D001D0AB
:100F98001AD004016AC472F404016BC473F4040126
:100FA8006CC474F404016DC475F4D89004017533ED
:100FB80074337333723372C46AF473C46BF474C4D5
:100FC8006CF475C46DF465D0040104016551800AA0
:100FD800800F200ED8B4645DD8A001D001D01AD0FB
:100FE80004016AC472F404016BC473F404016CC490
:100FF80074F404016DC475F4D89004017533743326
:101008007333723372C46AF473C46BF474C46CF4CB
:1010180075C46DF4040104016651040104016A13E6
:10102800040104016751040104016B130401040164
:101038006851040104016C1304010401695104019D
:1010480004016D1326D0040104016551800A800F44
:101058001F0ED8B4645DD8A001D001D008D0010E0D
:1010680004010401626F000E0401636F12D0000EC8
:101078007ED071C479F470C478F46FC477F46EC408
:1010880076F405EC1AF0000A01E177D7010A9CE032
:10109800DAD70401040163516211D8B401D001D038
:1010A80001D026D0040104016551800A800F1F0E6B
:1010B800D8B4645DD8B001D001D00AD00401D8906A
:1010C800040166370401673704016837040169378A
:1010D80004010401644B652B040104016551800A75
:1010E800800F240ED8B4645DD8A001D001D0E8D612
:1010F80051EC1DF0970E04010401806F790E040174
:10110800816F7E0E040104017E6F790E04017F6FEA
:1011180022EC1DF0330E04010401806F790E0401E6
:10112800816FC70E040104017E6F790E04017F6F81
:1011380022EC1DF06AC480F46BC481F46CC482F4A0
:101148006DC483F4DD0E040104017E6F790E040181
:101158007F6F79EC13F00401726F020E0401040131
:101168007E6F0401725143EC1DF0010E00D0120095
:1011780004015E6F000E040104015A6F04015E5100
:10118800C4D057C487F41DC085F41EC086F401EC92
:101198001CF0D8A001D001D03CD0960E0401040167
:1011A8002B6501D001D006D01DC053F41EC054F4E5
:1011B80057C458F4040104012B51D8B401D001D00C
:1011C80018D02BC460F404015E6F000E0401040102
:1011D8005F6F04015E511FEC0DF02BC460F4040135
:1011E8005E6F000E040104015F6F04015E5152EC52
:1011F80000F0122A04015E6F000E040104012B6F37
:1012080004015E5104015E6F000E066E04015E511A
:1012180032D0040104012B6701D001D006D01DC0D3
:1012280051F41EC052F457C42CF41250D8B401D053
:1012380001D018D012C060F404015E6F010E0401E1
:1012480004015F6F04015E511FEC0DF012C060F4E1
:1012580004015E6F010E040104015F6F04015E5119
:1012680052EC00F0040104012B2B04015E6F000E08
:10127800126E04015E510401D89057330401040131
:10128800576701D001D015D004015E6F800E0401AC
:101298000401576F04015E511D4A1E2A1E50020A9E
:1012A8001D10D8A401D001D004D0000E1D6E000E70
:1012B8001E6E1E5004010401541904E11D5004015E
:1012C80004015319D8A401D001D00ED0040104019F
:1012D800575104010401586301D001D005D004011D
:1012E8000401536904015469040104012B51960A4D
:1012F800D8A401D001D009D004015E6F010E040109
:1013080004015A6F04015E510DD0040104013051EB
:101318001E1804E1040104012F511D18D8A401D09E
:1013280001D02FD7040104015A6701D001D001D0A0
:10133800A2D00650D8B401D001D001D09CD051C45D
:1013480061F452C462F453C45FF454C460F48CEC86
:1013580017F05FC45CF460C45DF4040104015DBF70
:1013680001D001D00DD0040104015D51800A800F25
:10137800320ED8B45C5DD8B001D001D001D07BD09A
:10138800040104015D51800A800F9E0ED8B45C5D93
:10139800D8A001D001D00CD0040104015D51800A0D
:1013A800800FA30ED8B45C5DD8A001D001D000D0C6
:1013B80004015E6F000E040104015B6F04015E51BD
:1013C8002CC461F451C45FF452C460F407EC07F014
:1013D800040104015B272CC461F451C45FF452C4B6
:1013E80060F4A8EC0FF0040104015B272CC461F43D
:1013F80051C45FF452C460F4BEEC0BF00401040164
:101408005B272CC461F451C45FF452C460F4CDEC82
:1014180010F0040104015B272CC461F451C45FF48B
:1014280052C460F440EC0AF0040104015B272CC4A8
:1014380061F451C45FF452C460F439EC05F004015E
:1014480004015B2704015E6F010E066E04015E5104
:10145800040104015B51D8B401D001D00BD0000EB7
:101468001D6E000E1E6E000E040104012F6F000E8B
:101478000401306F00D012000401756F000E0401E2
:101488000401626F04017551000E04010401676FC5
:10149800000E0401686F000E0401696F000E04015C
:1014A8006A6F010E040104016B6F000E04016C6F7A
:1014B800000E04016D6F000E04016E6F0401610ED1
:1014C80004010401876F0401040E0401886F0401FC
:1014D8005F0E04010401856F0401040E0401866F88
:1014E800A5EC1BF00401610E04010401806F0401E6
:1014F800040E0401816F04015F0E040104017E6F74
:101508000401040E04017F6FC4EC15F05FC465F498
:1015180060C466F40401040161C463F404010401B5
:10152800646B000E040104016F6F000E0401706FFC
:10153800040104017051800A800F200ED8B46F5D39
:10154800D8A001D001D001D05AD00401610E040105
:101558000401796F0401040E04017A6F04015F0E1F
:1015680004010401776F0401040E0401786F71EC23
:1015780019F004010401736F040104017351020A94
:10158800D8A401D001D002D0000EF3D00401040188
:101598007351D8B401D001D018D0040104016B51A3
:1015A800040104016713040104016C5104010401DE
:1015B8006813040104016D51040104016913040155
:1015C80004016E51040104016A130401D890040156
:1015D8006B3704016C3704016D3704016E37040161
:1015E80004016F4B702B040104017051800A800FB5
:1015F800200ED8B46F5DD8A001D001D0A6D7000EB8
:1016080004010401716F000E0401726F04010401EA
:101618007251800A800F040ED8B4715DD8A001D031
:1016280001D001D04BD00401610E04010401796F8F
:101638000401040E04017A6F04015F0E0401040121
:10164800776F0401040E0401786F71EC19F004013E
:101658000401746F040104017451020AD8A401D072
:1016680001D002D0000E85D0040104017451D8B411
:1016780001D001D013D071C475F4010E0401766F46
:101688000401752B03D0D890040176370401752F17
:10169800FAD704017651040104016213040104011C
:1016A800714B722B040104017251800A800F040EE1
:1016B800D8B4715DD8A001D001D0B5D70401040118
:1016C80062510C0AD8B401D001D002D0000E51D01A
:1016D80051EC1DF0A60E04010401806F790E04017F
:1016E800816FCD0E040104017E6F790E04017F6FB6
:1016F80022EC1DF0750E04010401806F790E0401BF
:10170800816F7E0E040104017E6F790E04017F6FE4
:1017180022EC1DF00401330E04010401806F040162
:10172800040E0401816FC70E040104017E6F790E57
:1017380004017F6F22EC1DF067C480F468C481F453
:1017480069C482F46AC483F4DD0E040104017E6F67
:10175800790E04017F6F79EC13F00401756F010EA7
:10176800040104017E6F0401755143EC1DF0010E64
:1017780000D012000401610E04010401876F040106
:10178800040E0401886F04015F0E04010401856FD3
:101798000401040E0401866FA5EC1BF00401726FAE
:1017A800000E04010401626F04017251040E040169
:1017B80004016A6F000E04016B6F040104016BAF32
:1017C80001D001D001D08AD00401726F000E04014B
:1017D80004016E6F04017251000E040104016F6F61
:1017E800000E0401706F040104017051800A800F1B
:1017F800080ED8B46F5DD8A001D001D001D04BD06D
:101808000401610E04010401766F0401040E040151
:10181800776F04015F0E04010401746F0401040E64
:101828000401756FC2EC1AF004010401716F040120
:1018380004017151020AD8A401D001D002D0000ECF
:10184800F9D0040104017151D8B401D001D013D0EA
:101858006FC472F4010E0401736F0401722B03D07C
:10186800D890040173370401722FFAD70401735119
:10187800040104016E13040104016F4B702B040171
:1018880004017051800A800F080ED8B46F5DD8A08B
:1018980001D001D0B5D7040104016A51040A6B11C3
:1018A800D8A401D001D002D06EC462F40401650E40
:1018B800040104016A25E96EEA6A0401040EEA22B9
:1018C80004016EC4EFFF040104016A07D8A06B0786
:1018D800040104016BAF01D001D076D7000E0401DA
:1018E8000401636F000E0401646F000E040104011B
:1018F8006C6F000E04016D6F040104016D51800AC4
:10190800800F040ED8B46C5DD8A001D001D001D0EE
:1019180033D00401726F310E04010401766F0401A3
:1019280072510401650E040104016C25E96EEA6A2E
:101938000401040EEA22EF5004010401756F63C428
:1019480074F437EC18F00401736F04017351040147
:101958000401636F0401646B040104016C4B6D2B7B
:10196800040104016D51800A800F040ED8B46C5D27
:10197800D8A001D001D0CDD7040162C472F404010B
:10198800736B0401040164510401731905E1040136
:101998000401635104017219D8B401D001D002D0F6
:1019A800000E48D051EC1DF0A60E04010401806F12
:1019B800790E0401816FCD0E040104017E6F790E4A
:1019C80004017F6F22EC1DF04D0E04010401806FAD
:1019D800790E0401816F7E0E040104017E6F790E79
:1019E80004017F6F22EC1DF00401726F050E0401E3
:1019F8000401786F040172510401650E04010401A9
:101A0800766F0401040E0401776FDD0E04010401F2
:101A1800746F790E0401756F14EC14F00401726F81
:101A2800010E040104017E6F0401725143EC1DF0A4
:101A3800010E00D01200040104015F51D8B401D096
:101A480001D005D0030E04010401602704D0030E61
:101A580004010401605F3CD10C0E040104016065BF
:101A680001D001D009D0170E04010401606101D032
:101A780001D002D0082A37D1030E040104016065A1
:101A880001D001D01CD00E0E04010401606101D008
:101A980001D015D0190E086401D001D00AD0040174
:101AA800616F010E0B6E04016151000E1B6E000E7A
:101AB8001C6E0401616F000E086E0401615113D1A0
:101AC80060C464F45FC463F426EC19F063C427F4BB
:101AD80064C428F4040104012829FE0ED8B4271987
:101AE800D8A401D001D003D0CDEC1CF0FCD0040167
:101AF80004012729D8B42829D8A401D001D001D0BD
:101B0800F2D01C501B10D8A401D001D006D004017B
:101B1800040127511C6E1B6A51D00401040127518E
:101B28001B120401040128511C121FD00401616F0B
:101B3800060E076E040161513F0E04010401556F42
:101B4800000E0401566F2ED00401616F080E076E57
:101B5800040161514F0E04010401556F000E040188
:101B6800566F20D0CDEC1CF0BED01BC061F41CC059
:101B780062F40FD0040161514D0AE6E0F3D7040185
:101B880061512D0AE1E0EED7040161514C0ACEE023
:101B9800E9D7040162510A0AEDE0100AF0E0F00A00
:101BA800F3E0E0D70401616F020E0B6E040161518E
:101BB8000401616F000E086E0401615194D060C485
:101BC80064F45FC463F426EC19F063C427F464C4B6
:101BD80028F4040104012829FE0ED8B42719D8A432
:101BE80001D001D003D0CDEC1CF07DD0040104015C
:101BF8002729D8B42829D8A401D001D001D073D07E
:101C080004011F0E0824E96EEA6A0401040EEA22A0
:101C1800040127C4EFFF082A0706076601D001D090
:101C28004ED7CDEC1CF051EC1DF0A60E04010401BA
:101C3800806F790E0401816FCD0E040104017E6F5F
:101C4800790E04017F6F22EC1DF0B40E040104012B
:101C5800806F790E0401816F7E0E040104017E6F8E
:101C6800790E04017F6F22EC1DF004011BC080F483
:101C780004011CC081F404010401826B0401836B1C
:101C8800C70E040104017E6F790E04017F6F79ECA1
:101C980013F008C078F404011F0E04010401766FE4
:101CA8000401040E0401776FDD0E04010401746F52
:101CB800790E0401756F14EC14F00401616F010EC4
:101CC800040104017E6F0401615143EC1DF00BD047
:101CD8000B50000A01E1C0D6010A01E1F1D6030A5E
:101CE80001E16DD700D0120004015E6F0B0E0401F4
:101CF80004015B6F04015E5104015E6F0A0E04016A
:101D080004015C6F04015E51010E04010401646F5B
:101D1800000E0401656FFA0E04010401626F790E6A
:101D28000401636F1F0E04010401606F020E0401B9
:101D3800616FE2EC17F0040161516011D8A401D081
:101D480001D011D00A0E040104018D6F000E0401A8
:101D58008E6F650E040104018B6F790E04018C6F80
:101D68003BEC03F0F0D0010E04010401646F000E97
:101D78000401656FFC0E04010401626F790E040111
:101D8800636F1F0E04010401606F020E0401616F8E
:101D9800E2EC17F0040161516011D8A401D001D020
:101DA8000AD0E70E040104018B6F790E04018C6FD1
:101DB8003BEC03F0C8D004015E6F000E040104017F
:101DC8005D6F04015E5104015E6F000E04010401A1
:101DD8005A6F04015E51B0D098D004015DC45EF41E
:101DE80004015F6B010E04015E27000E5F231F0EC6
:101DF80004015E25E96E020E04015F21EA6EEF50D0
:101E0800040104015B6F040104015D2B92D00401FD
:101E18005DC45EF404015F6B010E04015E27000ED1
:101E28005F231F0E04015E25E96E020E04015F2187
:101E3800EA6EEF50040104015C6F040104015D2B9C
:101E480078D05CC463F45BC462F4010E040104013D
:101E58005D2504010401606F0401616B000E04013B
:101E6800612334EC17F004015E6F010E04010401D4
:101E78005A6F04015E51D30E040104018B6F790E71
:101E880004018C6F3BEC03F054D05CC463F45BC476
:101E980062F4010E040104015D2504010401606F70
:101EA8000401616B000E04016123DCEC16F00401EF
:101EB8005E6F010E040104015A6F04015E51E20EC7
:101EC800040104018B6F790E04018C6F3BEC03F065
:101ED80030D01F0E040104015D25E96EEA6A020E86
:101EE800EA22EF5004015E6F04015E51040104010F
:101EF8008D6F04018E6BFC0E040104018B6F780E4C
:101F080004018C6F3BEC03F01ED01F0E040104018A
:101F18005D25E96EEA6A020EEA22EF50500A01E1F5
:101F28005CD7020A01E173D7010A8BE0070AADE02A
:101F3800D0D7040104015D2B040104015A51D8B41F
:101F480001D001D049D71200000E04010401666FC8
:101F5800000E0401676F000E0401686F000E040193
:101F6800696F010E04010401626F000E0401636FC2
:101F7800000E0401646F000E0401656F0401610E18
:101F880004010401876F0401040E0401886F040131
:101F98005F0E04010401856F0401040E0401866FBD
:101FA800A5EC1BF00401610E04010401806F04011B
:101FB800040E0401816F04015F0E040104017E6FA9
:101FC8000401040E04017F6FC4EC15F0000E040137
:101FD80004016A6F000E04016B6F040104016B5168
:101FE800800A800F0C0ED8B46A5DD8A001D001D049
:101FF80001D08FD00401610E04010401806F040137
:10200800040E0401816F04015F0E040104017E6F58
:102018000401040E04017F6FC4EC15F004010401EF
:102028006C6F0401610E04010401806F0401040E49
:102038000401816F04015F0E040104017E6F040135
:10204800040E04017F6FC4EC15F0040104016D6FE8
:102058000401610E04010401806F0401040E0401EF
:10206800816F04015F0E040104017E6F0401040EF8
:1020780004017F6FC4EC15F0040104016E6F0401C4
:10208800610E04010401806F0401040E0401816FD4
:1020980004015F0E040104017E6F0401040E0401B3
:1020A8007F6FC4EC15F0040104016F6F0401D89030
:1020B800040166370401673704016837040169378A
:1020C80007D017D004010401668113D0000E60D038
:1020D8006FC474F46EC473F46DC472F46CC471F498
:1020E80083EC1AF0000AEDE0010AECE0030AEEE0E6
:1020F80000D0040104016A4B6B2B040104016B51ED
:10210800800A800F0C0ED8B46A5DD8A001D001D027
:1021180071D751EC1DF0970E04010401806F790E00
:102128000401816F7E0E040104017E6F790E0401A3
:102138007F6F22EC1DF0580E04010401806F790EA8
:102148000401816FC70E040104017E6F790E04013A
:102158007F6F22EC1DF066C480F467C481F468C404
:1021680082F469C483F4DD0E040104017E6F790EE4
:1021780004017F6F79EC13F00401706F020E040103
:1021880004017E6F0401705143EC1DF0010E00D074
:102198001200000E04010401626F000E0401636F57
:1021A800000E0401646F000E0401656F010E040146
:1021B8000401666F000E0401676F000E0401686F6A
:1021C800000E0401696F0401610E04010401876FA8
:1021D8000401040E0401886F04015F0E0401040168
:1021E800856F0401040E0401866FA5EC1BF0000E38
:1021F800040104016A6F000E04016B6F04010401FD
:102208006B51800A800F180ED8B46A5DD8A001D02F
:1022180001D001D0A2D00401610E04010401806F35
:102228000401040E0401816F04015F0E040104011E
:102238007E6F0401040E04017F6FC4EC15F00401E5
:1022480004016C6F0401610E04010401806F040134
:10225800040E0401816F04015F0E040104017E6F06
:102268000401040E04017F6FC4EC15F0040104019D
:102278006D6F0401610E04010401806F0401040EF6
:102288000401816F04015F0E040104017E6F0401E3
:10229800040E04017F6FC4EC15F0040104016E6F95
:1022A8000401610E04010401806F0401040E04019D
:1022B800816F04015F0E040104017E6F0401040EA6
:1022C80004017F6FC4EC15F0040104016F6F1CD08A
:1022D8002AD00401040166510401040162130401B7
:1022E80004016751040104016313040104016851E6
:1022F8000401040164130401040169510401040187
:10230800651311D0000E58D06FC474F46EC473F402
:102318006DC472F46CC471F444EC1AF0000AD8E08D
:10232800010AD7E0EFD70401D89004016637040109
:1023380067370401683704016937040104016A4BEF
:102348006B2B040104016B51800A800F180ED8B45E
:102358006A5DD8A001D001D05ED751EC1DF0400EC7
:1023680004010401806F790E0401816F7E0E04015F
:1023780004017E6F790E04017F6F22EC1DF062C4A8
:1023880080F463C481F464C482F465C483F4DD0E0C
:10239800040104017E6F790E04017F6F79EC13F05C
:1023A8000401706F020E040104017E6F0401705174
:1023B80043EC1DF0010E00D012000401756F000EF1
:1023C80004010401726F04017551030E0401040134
:1023D800726501D001D001D023D0040104017251EB
:1023E800040104016825E96E0401000E04010401DA
:1023F8006921EA6E04016E0E040104017225E16E82
:10240800E26A0401040EE222EFCFE7FF04010401AF
:10241800722B030E04010401726501D001D0DDD7CF
:10242800050E0401040168250401756F000E0401FE
:10243800040169210401766F75C46CF476C46DF4E7
:102448000096000E116E0094040100EE04F00401E1
:102458006851E92604016951EA22EF500401040198
:102468006B6F040104016B6701D001D001D081D0EA
:10247800040104016B6701D001D001D072D06CC493
:10248800E9FF6DC4EAFFEF50040104016A6F04011B
:10249800756F000E04010401736F04017551030E7A
:1024A80004010401736501D001D001D050D06AC481
:1024B80075F4C00E04017517060E0401766FD890E6
:1024C800040175330401762FFAD70401755104010C
:1024D8000401746F04016E0E040104017425E96E91
:1024E800EA6A0401040EEA22010EEF6201D001D06B
:1024F80002D0008613D004016E0E04010401742575
:10250800E96EEA6A0401040EEA22EF50106EB18007
:1025180000D000A401D001D0FCD700940401D890C9
:102528006A37D8906A37040104016B070401040173
:102538006B6701D001D001D00AD004010401732BCC
:10254800030E04010401736501D001D0B0D7040162
:1025580004016C4B6D2B040104016B6701D001D0A1
:102568008ED7009400D000A401D001D0FCD7B19040
:1025780089981200026601D001D020D0030E040110
:102588000401686501D001D007D00D0E04010401D3
:10259800686501D001D00BD0870E040104018B6F50
:1025A800790E04018C6F3BEC03F0FE0E9DD0040104
:1025B800696F010E026E0401695194D00204D8A417
:1025C80001D001D042D00C0E04010401686501D08D
:1025D80001D007D0160E04010401686501D001D0AE
:1025E80024D00CC069F404016A6B0401040156513B
:1025F80004016A1905E1040104015551040169192E
:10260800D8B401D001D011D08F0E040104018B6F12
:10261800790E04018C6F3BEC03F00401696F000E26
:10262800026E04016951FE0E5FD00090040104019E
:1026380067A101D000800401696F020E026E0401D7
:102648006951000E00B0010E4FD00250020AD8A402
:1026580001D001D047D0040104016751D8B401D09A
:1026680001D015D0030E04010401686501D001D022
:102678000ED00E0E04010401686101D001D007D00C
:102688000401696F000E026E0401695129D00C0E15
:1026980004010401686501D001D00ED0170E0401B1
:1026A8000401686101D001D007D00401696F010EEF
:1026B800026E0401695114D0030E04010401686517
:1026C80001D001D00DD00E0E04010401686101D0C3
:1026D80001D006D00401696F000E026E0401695131
:1026E800FF0E02D0FF0E00D012007EC48DF47FC40E
:1026F8008EF4C10E040104018B6F790E04018C6FF6
:102708003BEC03F004018351801181118211D8A49C
:1027180001D001D00AD0F20E040104018B6F790EAA
:1027280004018C6F3BEC03F071D00401876F010E3C
:1027380004010401846F040187510401876F000EAE
:1027480004010401856F04018751070E0401040187
:10275800856501D001D001D059D0040180C487F427
:10276800040181C488F4040182C489F4040183C487
:102778008AF41D0E06D0D89004018A338933883331
:102788008733E82EF8D7040187510F0B04010401A1
:10279800866F04010401866701D001D008D00401C6
:1027A80004018405D8A401D001D001D018D00401B7
:1027B800040186C48DF4040104018E6BDA0E040151
:1027C80004018B6F790E04018C6F3BEC03F004015C
:1027D800876F000E04010401846F0401875104010E
:1027E800040ED89004018037040181370401823730
:1027F80004018337E82EF5D704010401852B070E61
:1028080004010401856501D001D0A7D7730E040126
:1028180004018B6F790E04018C6F3BEC03F01200FE
:1028280074C48DF475C48EF4EC0E040104018B6F2E
:10283800790E04018C6F3BEC03F004017A6F000EF3
:1028480004010401796F04017A51040104017851EB
:1028580004010401795DD8A001D001D001D04BD08A
:10286800040104017951040104017625E96E04018B
:10287800000E040104017721EA6EEF5004017A6F1B
:102888000F0E04017A1704017A51040104018F6FB5
:102898000401906B040104017951040104017625B7
:1028A800E96E0401000E040104017721EA6EEF507D
:1028B80004017B6F04017B3B0F0E7B1704017B51E6
:1028C800040104018D6F04018E6BD80E040104010C
:1028D8008B6F790E04018C6F3BEC03F0040104014B
:1028E800792B04010401785104010401795DD8A011
:1028F80001D001D0B5D7730E040104018B6F790E96
:1029080004018C6F3BEC03F012000401D8902A37C5
:1029180004010401C351D8B401D001D01BD0040173
:102928000401292B040104012951030AD8A401D068
:1029380001D005D0070E040104012A130AD0030EA2
:1029480004010401296501D001D003D00401040168
:102958002A8108D00401C46F000E04010401296F04
:102968000401C4510401D890323704010401312B09
:10297800040104012AAF01D001D004D004010401EC
:10298800328100D0040104013151080AD8A401D0D1
:1029980001D029D00401C46F000E04010401316F75
:1029A8000401C4511F0E040104012F25E96E000E15
:1029B800040104013021EA6E040132C4EFFF04016E
:1029C80004012F4B302B040104013051020A2F114E
:1029D800D8A401D001D007D0000E040104012F6F44
:1029E800000E0401306F1200040104014D51D8B4E7
:1029F80001D001D024D0040104014C510401040188
:102A08004B277E0E040104014B6501D001D004D090
:102A1800040104014C6911D0040104014B6701D081
:102A280001D00BD00401B46F010E040104014C6FF6
:102A38000401B451040104014D074BC4BEFF040155
:102A480004015051D8B401D001D024D004010401AC
:102A58004F51040104014E277E0E040104014E6506
:102A680001D001D004D0040104014F6911D0040140
:102A780004014E6701D001D00BD00401B46F010EE0
:102A8800040104014F6F0401B4510401040150070B
:102A98004EC4BBFF040104014D6701D001D002D030
:102AA800000EBE6E04010401506701D001D002D0AF
:102AB800000EBB6E12000096000E116E009468C4E2
:102AC800E9FF69C4EAFFEF50106EB18000D000A49E
:102AD80001D001D0FCD79D92010E040104016A6F58
:102AE800000E04016B6F2FD0040104016A51040128
:102AF80004016825E96E040104016B510401040115
:102B08006921EA6E010EEF6201D001D002D0008681
:102B180016D00094040104016A51040104016825D7
:102B2800E96E040104016B51040104016921EA6E94
:102B3800EF50106E00D000A401D001D0FCD70401E2
:102B480004016A4B6B2B040104016A51040104015E
:102B58006825E96E040104016B510401040169212F
:102B6800EA6EEF50D8A401D001D0BED79D82009460
:102B780000D000A401D001D0FCD7B19089981200F0
:102B88000401846F000E04010401836F0401845161
:102B980080C4E9FF81C4EAFFEF5004010401876F94
:102BA8007EC4E9FF7FC4EAFF0401EECF85F4040187
:102BB800EDCF86F401EC1CF0D8B001D002D0010EA4
:102BC80001D0000E04010401826F04010401832B6B
:102BD80080C487F481C488F47EC485F47FC486F4F5
:102BE800A5EC1BF080C4E9FF81C4EAFFEF500401A3
:102BF8000401876F7EC4E9FF7FC4EAFF0401EECFBA
:102C080085F40401EDCF86F401EC1CF0D8B001D0B6
:102C180002D0010E01D0000E040104018219D8B4BB
:102C280001D001D004D00401040183510AD0040169
:102C380004018329D8A401D001D002D0000E01D00C
:102C4800C4D71200000E04010401A16F000E040194
:102C5800A26F040104019F519E11D8B401D001D084
:102C680047D00401A36F010E04010401A06F040101
:102C7800A35109D00401D89004019E3704019F375D
:102C880004010401A02B040104019FAF01D001D06D
:102C9800F1D70401D8900401A1370401A237040137
:102CA80004019E51040104019C5D040104019F512B
:102CB800040104019D59D8A001D001D00FD004010E
:102CC80004019E51040104019C5F040104019F5109
:102CD800040104019D5B04010401A1810401D89051
:102CE80004019F3304019E3304010401A02FD1D7AE
:102CF800A1C49CF4A2C49DF400D01200000EAB6ED7
:102D0800AB8EAB88AC90AC8AAC94B896948E949CFD
:102D180006D00401AECF5AF4040104015B6B9EBADD
:102D280001D001D0F6D704015C6F400EAF6E0401EC
:102D38005C519F9A9F98F28C9D8A9D98CD909E9009
:102D4800000ECF6E000ECE6ECD9ACD98CD92000EAD
:102D580004010401616F020E0401626F000E040198
:102D680004015F6F000E0401606F1F0E040104016F
:102D78005D6F020E04015E6F8FEC1CF0000E040103
:102D88000401616F010E0401626F2D0E040104013C
:102D98005F6F000E0401606F0501000E040104015D
:102DA8005D6F0501050E04015E6F8FEC1CF01200CB
:102DB8006EEC1DF00401666F000E04010401646FDF
:102DC8000401665140D00401666F020E040104013B
:102DD800686F0401665175EC1DF01F0E0401666FE3
:102DE800020E676F040104016051040166270401A3
:102DF800040161510401672366C468F467C469F477
:102E0800E1EC11F00401666F000E04010401656F26
:102E1800040166510BD00D0E0401666FF90EE82E01
:102E2800FED7662FFCD704010401652B04010401B9
:102E3800625104010401655DD8A001D001D0EBD72F
:102E480004010401642B0401040163510401040119
:102E5800645DD8A001D001D0B6D769EC1DF012008E
:102E68006EEC1DF00401666F000E04010401646F2E
:102E78000401665140D00401666F020E040104018A
:102E8800686F0401665175EC1DF01F0E0401666F32
:102E9800020E676F040104016051040166270401F2
:102EA800040161510401672366C468F467C469F4C6
:102EB8005FEC15F00401666F000E04010401656FF4
:102EC800040166510BD00D0E0401666FF90EE82E51
:102ED800FED7662FFCD704010401652B0401040109
:102EE800625104010401655DD8A001D001D0EBD77F
:102EF80004010401642B0401040163510401040169
:102F0800645DD8A001D001D0B6D769EC1DF01200DD
:102F1800040104015F29D8B46029D8A401D001D0E4
:102F280006D0040104015F690401606946D0040108
:102F380004016251800A0401636F04015F510401B6
:102F48000401615D040104016051800A04016359B0
:102F5800D8A001D001D012D0040104015F510401AE
:102F68000401615D040104015F6F04010401605103
:102F78000401040162590401606F1FD0000E0401AE
:102F8800636F020E646F040104015F510401635F03
:102F98000401040160510401645B040104016151EE
:102FA80004016325040104015F6F040104016251F7
:102FB800040164210401606F00D012003ED060C497
:102FC800E9FF61C4EAFFEF50D8B401D001D014D0B2
:102FD800040162C4F6FF040163C4F7FF0800F5CFDB
:102FE80066F460C4E9FF61C4EAFFEF5004016619A2
:102FF800D8B401D001D019D060C4E9FF61C4EAFF98
:10300800EF500401666F040162C4F6FF040163C453
:10301800F7FF0800F5500401665D04010401606FC4
:103028000401616BD8A061071DD004010401604B45
:10303800612B04010401624B632B04010401640742
:10304800D8A0650704016429D8B46529D8A401D09B
:1030580001D0B5D7000E04010401606F000E040111
:10306800616F00D01200800E04010401796F000E18
:1030780004017A6F040104017A517911D8A401D0AE
:1030880001D001D040D00401000E040174BF010E2C
:1030980004010401776F0401786B04010401755180
:1030A8000401040179150009D8B401D001D00CD06D
:1030B8000401040178517711000ED8B4010E0401FF
:1030C8000401776F0401786B0401D8907437040108
:1030D800040178517711D8B401D001D006D0040189
:1030E8000401765104010401741B0401D890040101
:1030F8007A3304017933040104017A517911D8A48F
:1031080001D001D0C0D704010401745100D01200CD
:10311800FACFA7F4FBCFA8F4E9CFA9F4EACFAAF431
:10312800E1CFABF4E2CFACF4D9CFADF4DACFAEF463
:10313800F3CFAFF4F4CFB0F4F6CFB1F4F7CFB2F4E5
:10314800F8CFB3F49EAA01D001D002D03CEC1BF01A
:103158009EA801D001D002D0D4EC1BF09EA201D0D1
:1031680001D003D0F8EC14F09E92B3C4F8FFB2C4B7
:10317800F7FFB1C4F6FFB0C4F4FFAFC4F3FFAEC4A9
:10318800DAFFADC4D9FFACC4E2FFABC4E1FFAAC407
:10319800EAFFA9C4E9FFA8C4FBFFA7C4FAFFA6C4B5
:1031A800E0FFA5C4E8FFA4C4D8FF1000040104018F
:1031B8009F519E11D8B401D001D03ED00401A16F17
:1031C800010E04010401A06F0401A15109D00401FA
:1031D800D89004019E3704019F3704010401A02BF5
:1031E800040104019FAF01D001D0F1D7040104010B
:1031F8009E51040104019C5D040104019F510401D6
:1032080004019D59D8A001D001D00CD004010401BB
:103218009E51040104019C5F040104019F510401B3
:1032280004019D5B0401D89004019F3304019E337F
:1032380004010401A02FDAD79CC49CF49DC49DF41A
:1032480000D0120064C468F463C467F4BEEC12F0E2
:1032580004010401656F040104016551FE0AD8A444
:1032680001D001D008D0FE0E04010401636FFF0EE7
:103278000401646F31D0040104016529D8A401D088
:1032880001D006D00401040163690401646924D0F3
:10329800D8900532040104016551D8B401D001D099
:1032A80001D0058E0C2A042A080E046001D001D032
:1032B80006D0040104016369040164690DD00401A6
:1032C800666F000E046E04016651040105C063F4C4
:1032D80004010401646B00D0120079C480F47AC43C
:1032E80081F477C47EF478C47FF4C4EC15F004014B
:1032F80004017C6F1D0E040104017C6501D001D01E
:1033080009D0290E040104017C6101D001D002D04A
:10331800000E2DD079C480F47AC481F477C47EF489
:1033280078C47FF4C4EC15F0040104017B6F090E26
:10333800040104017C6501D001D017D0150E0401E9
:1033480004017C6101D001D010D0090E04010401F0
:103358007B6501D001D009D0150E040104017B6101
:1033680001D001D002D0010E02D0020E00D012000E
:103378000600EACFB9F4E1CFBAF4E2CFBBF4D9CF73
:10338800BCF4DACFBDF4F3CFBEF4F4CFBFF4F6CF7C
:10339800C0F4F7CFC1F4F8CFC2F4F2A401D001D041
:1033A8000BD0000E81B8010E04010401C36F89EC33
:1033B80014F0000ED66EF294A1A201D001D006D06E
:1033C800B368C90EB26EEBEC1CF0A192C2C4F8FF50
:1033D800C1C4F7FFC0C4F6FFBFC4F4FFBEC4F3FF07
:1033E800BDC4DAFFBCC4D9FFBBC4E2FFBAC4E1FF65
:1033F800B9C4EAFFB8C4E9FFB7C4FBFFB6C4FAFF13
:1034080011000F0E04010401766501D001D017D018
:103418000A0E04010401776101D001D010D00A0E10
:1034280004010401786101D001D009D00A0E040119
:103438000401796101D001D002D0000E20D00A0E1B
:1034480004010401766101D001D017D00A0E0401ED
:103458000401776101D001D010D00F0E04010401DE
:10346800786501D001D009D00A0E04010401796100
:1034780001D001D002D0010E02D0020E00D01200FD
:103488000D0E04010401716101D001D017D00D0E99
:1034980004010401726101D001D010D00D0E0401A5
:1034A8000401736101D001D009D0100E0401040198
:1034B800746501D001D002D0010E20D00D0E040198
:1034C8000401716101D001D017D0100E040104016C
:1034D800726501D001D010D00D0E04010401736192
:1034E80001D001D009D00D0E04010401746101D08E
:1034F80001D002D0000E02D0020E00D012000F0E32
:1035080004010401716501D001D017D00A0E04012D
:103518000401726101D001D010D00F0E0401040122
:10352800736501D001D009D00A0E04010401746149
:1035380001D001D002D0000E20D00A0E04010401EF
:10354800716101D001D017D00F0E0401040172651A
:1035580001D001D010D00F0E04010401736501D011
:1035680001D009D00A0E04010401746101D001D010
:1035780002D0010E02D0020E00D0120076C480F4F0
:1035880077C481F474C47EF475C47FF4C4EC15F078
:1035980004010401786F76C480F477C481F474C49C
:1035A8007EF475C47FF4C4EC15F004010401796F4E
:1035B8000D0E04010401786501D001D009D00D0E6B
:1035C80004010401796501D001D002D0000E12D0A7
:1035D8000B0E04010401786101D001D009D00D0E51
:1035E80004010401796501D001D002D0010E02D096
:1035F800020E00D012000401796F000E0E6E040155
:103608007951000E176E000E186E000E196E000E1E
:103618001A6E000E136E000E146E000E156E000E5C
:10362800166E010E04010401476F000E0401486F75
:10363800000E0401496F000E04014A6F0401796FFE
:10364800000E0F6E04017951000E040104012D6F64
:10365800000E04012E6F0401796F000E036E040141
:1036680079510401796F000E096E04017951120035
:10367800AECFB4F4ABA201D001D002D0AB98AB88E6
:1036880000A201D001D001D029D004010401B45115
:103698002B0AD8A401D001D00BD0CD9000821F0EE8
:1036A8000124E96EEA6A020EEA22000EEF6E16D0D5
:1036B8001F0E0124E96EEA6A020EEA220401B4C46C
:1036C800EFFF012A000ECF6E000ECE6ECD809E90C9
:1036D8000401B56F000E0D6E0401B55112009EA0D5
:1036E80001D001D00CD01E0E0D6401D001D005D040
:1036F800CD90000E016E009201D00D2A9E9000B26E
:1037080001D001D001D01CD078EC0EF0000E0401DD
:103718000401616F020E0401626F000E04010401CE
:103728005F6F000E0401606F1F0E040104015D6FDE
:10373800020E04015E6F8FEC1CF0000E016E009209
:10374800120087C4E9FF88C4EAFFD890EF3687C41F
:10375800E9FF88C4EAFFEF50D8A401D001D01FD0F8
:1037680087C4E9FF88C4EAFF010EEF6E85C4E9FF4C
:1037780086C4EAFFEE50ED10D8A401D001D008D0DD
:1037880085C4E9FF86C4EAFF000EEE6E020EED6EF8
:1037980085C4E9FF86C4EAFFEE06000EED5A120062
:1037A80059C4B4F404010401B429D8A401D001D047
:1037B80009D00401B56F000E04010401B46F0401BF
:1037C800B55103D004010401B42B0A5004010401CB
:1037D800B46301D001D002D09D980ED00501000E2F
:1037E80004010401B425E96EEA6A0501050EEA221E
:1037F800EF50AD6EB4C459F412001F0E0401040159
:103808008525E96E000E040104018621EA6EEF5059
:1038180004010401886F040104018851040187C46C
:1038280089F404018A6B89BF8A0704018917000E8D
:103838008A1704018A518911D8B401D001D002D065
:10384800D88002D0D89000D012000D0E04010401D7
:103858007E6101D001D009D00D0E040104017F6101
:1038680001D001D002D0000E12D0180E04010401BC
:103878007E6501D001D009D00D0E040104017F61DD
:1038880001D001D002D0010E02D0020E00D01200E9
:103898006FEC1CF064EC1DF082EC16F034EC1DF0BB
:1038A8005BEC1DF007EC1DF00A0E040104018D6F9E
:1038B800000E04018E6F630E040104018B6F790EF4
:1038C80004018C6F3BEC03F0BCEC08F073EC1BF0CC
:1038D800FBD714EF00F0000EC26E04015A6F0F0EF2
:1038E800C16E04015A51070EB46E000E806E000EB0
:1038F800926E000E946E000E956E000E826E000E93
:10390800836E000E936E000E816E89989298949241
:103918009494929612005DC463F45EC464F40BD070
:1039280063C4E9FF64C4EAFF04015FC4EFFF040154
:103938000401634B642B040104016107D8A06207EA
:1039480004016129D8B46229D8A401D001D0E8D7EC
:1039580000D0120000D00A50040104015919D8B44B
:1039680001D001D0F8D70501000E0A24E96EEA6AF1
:103978000501050EEA2204019CC4EFFF0A28D8A419
:1039880001D001D003D0000E0A6E01D00A2A9D880A
:1039980012000401636F000E046E040163510401F8
:1039A800636F000E026E040163510401636F000E21
:1039B8000C6E040163510401636F000E0B6E040169
:1039C8006351040104015569040156691200116626
:1039D80001D001D011D00084106601D001D001D0EF
:1039E80011D010C011F0000E106E00B601D001D039
:1039F80002D0897801D000961150D8B401D001D0F6
:103A080001D011061200CA82CA9CCA8ACA98CA96EC
:103A1800000EBD6E000EBA6EBA86BA84BD86BD842D
:103A2800BD9ABD98BA9ABA98000EBE6E000EBB6ECB
:103A38009E92CB689F929D82CA84120080C48FF4A4
:103A480081C490F47EC48DF47FC48EF4AD0E04015D
:103A580004018B6F790E04018C6F3BEC03F01200AC
:103A6800D594D592D590D596D59AD58CF294F28ADC
:103A780092969388F184D58E78EC1DF01200100E82
:103A8800040104018B6F790E04018C6F3BEC03F089
:103A98007EC47FF472EC1DF01200F40E04010401E0
:103AA8008B6F790E04018C6F3BEC03F0120092943B
:103AB80092988998B19AB198A082A282B190120086
:103AC800D08EF28EF28CF28E120078EC1DF0D58E2C
:103AD800B1901200D59E7BEC1DF012007FC44DF40E
:103AE800120068C450F412008994898612008984EF
:043AF8008996120099
:1078EA0001000A006400E8031027010010000001EB
:1078FA000010556E6B6E6F776E20636F6D6D616EE3
:10790A006420282575290D0A003031323334353682
:10791A003738394142434445460073656C666C65A5
:10792A0061726E696E6776320073656C666C65614A
:10793A00726E696E670065766572666C6F757269DC
:10794A0073680066696E656F666673657400636F57
:10795A006465737769746368000D0A2B5625750D83
:10796A000A0025733A307825583B006D616E646FC2
:10797A006C796E0070726F746F636F6C00413A209D
:10798A0025690D0A00423A2025690D0A00617263D1
:10799A007465636800286E756C6C290073656E7374
:1079AA006F720025733A25733B006F7265676F6EBD
:1079BA000068617374610025733A3078006D6F64F2
:1079CA00656C00636C617373002B530D0A002558B4
:1079DA0025580064617461002B540D0A002B4E0D6A
:1079EA000A0025733A00783130002B57002B5200D9
:0679FA0056004E000000E3
:020000040030CA
:04000000FF36FFFECA
:02000600BFFF3A
:00000001FF

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,7 @@
#ifdef _WINDOWS
#include <windows.h>
#include "win\ftd2xx.h"
#else
#include "osx/WinTypes.h"
#include "osx/ftd2xx.h"
#endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 754 B

After

Width:  |  Height:  |  Size: 1.6 KiB

Before After
Before After

View file

@ -0,0 +1,87 @@
#ifndef __WINDOWS_TYPES__
#define __WINDOWS_TYPES__
#define MAX_NUM_DEVICES 50
#include <sys/time.h>
typedef unsigned int DWORD;
typedef unsigned int ULONG;
typedef unsigned short USHORT;
typedef unsigned short SHORT;
typedef unsigned char UCHAR;
typedef unsigned short WORD;
typedef unsigned char BYTE;
typedef BYTE *LPBYTE;
typedef unsigned int BOOL;
typedef unsigned char BOOLEAN;
typedef unsigned char CHAR;
typedef BOOL *LPBOOL;
typedef UCHAR *PUCHAR;
typedef const char *LPCSTR;
typedef char *PCHAR;
typedef void *PVOID;
typedef void *HANDLE;
typedef unsigned int LONG;
typedef int INT;
typedef unsigned int UINT;
typedef char *LPSTR;
typedef char *LPTSTR;
typedef DWORD *LPDWORD;
typedef WORD *LPWORD;
typedef ULONG *PULONG;
typedef PVOID LPVOID;
typedef void VOID;
typedef unsigned long long int ULONGLONG;
typedef struct _OVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES , *LPSECURITY_ATTRIBUTES;
typedef struct timeval SYSTEMTIME;
typedef struct timeval FILETIME;
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
//
// Modem Status Flags
//
#define MS_CTS_ON ((DWORD)0x0010)
#define MS_DSR_ON ((DWORD)0x0020)
#define MS_RING_ON ((DWORD)0x0040)
#define MS_RLSD_ON ((DWORD)0x0080)
//
// Error Flags
//
#define CE_RXOVER 0x0001 // Receive Queue overflow
#define CE_OVERRUN 0x0002 // Receive Overrun Error
#define CE_RXPARITY 0x0004 // Receive Parity Error
#define CE_FRAME 0x0008 // Receive Framing error
#define CE_BREAK 0x0010 // Break Detected
#define CE_TXFULL 0x0100 // TX Queue is full
#define CE_PTO 0x0200 // LPTx Timeout
#define CE_IOE 0x0400 // LPTx I/O Error
#define CE_DNS 0x0800 // LPTx Device not selected
#define CE_OOP 0x1000 // LPTx Out-Of-Paper
#define CE_MODE 0x8000 // Requested mode unsupported
#ifndef INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE 0xFFFFFFFF
#endif
#endif

File diff suppressed because it is too large Load diff

View file

@ -1,2 +1,4 @@
HeaderTitle 1.0 HeaderTitle.qml HeaderTitle 1.0 HeaderTitle.qml
ControllerView 1.0 ControllerView.qml ControllerView 1.0 ControllerView.qml
ControllerUpgradeDialog 1.0 ControllerUpgradeDialog.qml
StateLabel 1.0 StateLabel.qml

View file

@ -0,0 +1,337 @@
#include "tellstick.h"
#include <telldus-core.h>
#include <QApplication>
#include <QTimer>
#include <QFile>
#include <QDebug>
#ifdef _WINDOWS
#include <windows.h>
#endif
#include "ftd2xx.h"
inline void msleep( const int msec) {
#ifdef _WINDOWS
Sleep(msec);
#else
usleep(msec*1000);
#endif
}
class TellStick::PrivateData {
public:
FT_HANDLE ftHandle;
};
TellStick::TellStick(int id, int type, const QString &name, QObject *parent) :
Controller(id, type, name, parent)
{
d = new PrivateData;
}
TellStick::~TellStick() {
delete d;
}
void TellStick::setAvailable(bool available) {
Controller::setAvailable(available);
if (!available && upgradeStep() == 0) {
//Doing firmware upgrade
setUpgradeStep(1);
QTimer::singleShot(1000, this, SLOT(aquireTellStick())); //Allow for widget updates
}
}
bool TellStick::isUpgradable() const {
QString fw = firmware();
if (fw == "?") {
return false;
}
int firmware = fw.toInt();
if (type() == 1) {
//TellStick
if (firmware <= 3) {
return false;
}
if (firmware < 6) {
return true;
}
} else if (type() == 2) {
//TellStick Duo
if (firmware < 10) {
return true;
}
}
return false;
}
void TellStick::aquireTellStick() {
char *tempSerial = new char[serial().size()+1];
#ifdef _WINDOWS
strcpy_s(tempSerial, serial().size()+1, serial().toLocal8Bit());
#else
strcpy(tempSerial, serial().toLocal8Bit());
int pid = 0x0C30;
if (type() == 2) {
pid = 0x0C31;
}
FT_SetVIDPID(0x1781, pid);
#endif
FT_STATUS ftStatus = FT_OpenEx(tempSerial, FT_OPEN_BY_SERIAL_NUMBER, &d->ftHandle);
delete tempSerial;
if (ftStatus != FT_OK) {
return;
}
//open = true;
if (type() == 2) {
FT_SetBaudRate(d->ftHandle, 115200);
} else {
FT_SetBaudRate(d->ftHandle, 9600);
}
FT_SetFlowControl(d->ftHandle, FT_FLOW_NONE, 0, 0);
FT_SetTimeouts(d->ftHandle,1000,0);
setUpgradeStep(2);
QTimer::singleShot(0, this, SLOT(enterBootloader()));
}
void TellStick::enterBootloader() {
FT_Purge(d->ftHandle, FT_PURGE_RX | FT_PURGE_TX);
FT_STATUS ftStatus = FT_SetBitMode(d->ftHandle, 0xff, 0x20);
for (int i = 0; i < 100; ++i) {
msleep(1);
QApplication::processEvents();
}
ftStatus = FT_SetBitMode(d->ftHandle, 0xf0, 0x20);
char buf = 0;
while(1) { //TODO: Make it possible to bail!
QApplication::processEvents();
buf = getCh();
if (buf == 'g') {
break;
}
}
send('r');
setUpgradeStep(3);
QTimer::singleShot(1000, this, SLOT(downloadFirmware()));
}
void TellStick::downloadFirmware() {
QString filename = "TellStick";
int bootloaderStart = 0x3A00;
if (type() == 2) {
filename = "TellStickDuo";
bootloaderStart = 0x7A00;
}
QString path;
//if (QApplication::arguments().count() > 1) {
// path = QApplication::arguments().at(1);
//} else {
path = QString(":/firmware/%1.hex").arg(filename);
//}
QByteArray data = readHex(path, bootloaderStart);
int bytesLeft = 0, i = 0;
char byte;
while (i < data.length()) {
QApplication::processEvents();
byte = getCh();
QApplication::processEvents();
if (byte == 'b') {
bytesLeft = data.length() - i;
if (bytesLeft > 0xFF) {
bytesLeft = 0xFF;
}
send(bytesLeft);
} else if (byte == 'd') {
send(data[i]);
--bytesLeft;
++i;
this->setUpgradeProgress( (qreal)i/(qreal)data.length()*100.0 );
}
}
setUpgradeStep(4);
QTimer::singleShot(0, this, SLOT(rebootTellStick()));
}
void TellStick::rebootTellStick() {
FT_STATUS ftStatus = FT_SetBitMode(d->ftHandle, 0xff, 0x20);
for (int i = 0; i < 100; ++i) {
msleep(1);
QApplication::processEvents();
}
ftStatus = FT_SetBitMode(d->ftHandle, 0xf0, 0x20);
FT_Close(d->ftHandle);
QApplication::processEvents();
setUpgradeStep(5);
QTimer::singleShot(0, this, SLOT(connectTellStick()));
}
void TellStick::connectTellStick() {
int pid = 0x0C30;
if (type() == 2) {
pid = 0x0C31;
}
tdConnectTellStickController(0x1781, pid, this->serial().toUtf8());
setUpgradeStep(-1);
emit upgradableChanged();
emit upgradeDone();
}
char TellStick::getCh() {
char buf = 0;
DWORD dwBytesRead = 0;
FT_Read(d->ftHandle, &buf, sizeof(buf), &dwBytesRead);
return buf;
}
void TellStick::send(uchar ch) {
DWORD bytesWritten;
FT_Write(d->ftHandle, &ch, sizeof(ch), &bytesWritten);
}
QByteArray TellStick::readHex(const QString &filename, int maxAddress) {
QByteArray data;
QFile file(filename);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
return "";
}
while( !file.atEnd() ) {
QByteArray fileLine = file.readLine();
if (fileLine[0] != ':' || fileLine.length() < 11) {
// skip line if not hex line entry,or not minimum length ":BBAAAATTCC"
continue;
}
int byteCount = parseHex(fileLine, 1, 2);
int startAddress = parseHex(fileLine, 3, 4);
int recordType = parseHex(fileLine, 7, 2);
if (recordType == 1) {
//End of file, break
break;
}
if (recordType == 2) {
//Not implemented yet
} else if (recordType == 4) {
//Extended Linear Address Record not supported
break;
} else if (recordType == 0) { //Data record
if (fileLine.length() < (11+ (2*byteCount))) {
// skip if line isn't long enough for bytecount.
continue;
}
//Protect us from overwriting the bootloader
if (startAddress >= maxAddress) {
continue;
}
//Pad with empty data when needed
if ((startAddress > data.size())) {
while (startAddress > data.size()) {
data.append((char)0xFF);
}
}
for (int lineByte = 0; lineByte < byteCount; lineByte++) {
unsigned char hex = (unsigned char)parseHex(fileLine, 9 + (2 * lineByte), 2);
data.append(hex);
}
}
}
for (int i = 0; i < 64; ++i) { //At least 64-bytes extra so the last block will be written to the memory
data.append((char)0xff);
}
return data;
}
int TellStick::parseHex(const QByteArray &characters, int start, int length) {
int integer = 0;
for (int i = 0; i < length; i++) {
integer *= 16;
switch(characters[start + i]) {
case '1':
integer += 1;
break;
case '2':
integer += 2;
break;
case '3':
integer += 3;
break;
case '4':
integer += 4;
break;
case '5':
integer += 5;
break;
case '6':
integer += 6;
break;
case '7':
integer += 7;
break;
case '8':
integer += 8;
break;
case '9':
integer += 9;
break;
case 'A':
case 'a':
integer += 10;
break;
case 'B':
case 'b':
integer += 11;
break;
case 'C':
case 'c':
integer += 12;
break;
case 'D':
case 'd':
integer += 13;
break;
case 'E':
case 'e':
integer += 14;
break;
case 'F':
case 'f':
integer += 15;
break;
}
}
return integer;
}
void TellStick::upgrade() {
setUpgradeStep(0);
int pid = 0x0C30;
if (type() == 2) {
pid = 0x0C31;
}
tdDisconnectTellStickController(0x1781, pid, serial().toUtf8()); //TODO: Make dynamic for TellStick Duo
}

View file

@ -0,0 +1,56 @@
#ifndef TELLSTICK_H
#define TELLSTICK_H
#include "controller.h"
class TellStick : public Controller
{
Q_OBJECT
public:
explicit TellStick(int id = 0, int type = 1, const QString &name = "", QObject *parent = 0);
virtual ~TellStick();
//bool available() const;
virtual void setAvailable(bool available);
/*QString firmware() const;
void setFirmware(const QString &version);
int id() const;
QString name() const;
void setName(const QString &name);
void save();
QString serial() const;
Q_INVOKABLE void tryRemove();
int type() const;*/
Q_INVOKABLE virtual void upgrade();
protected:
virtual bool isUpgradable() const;
private slots:
void aquireTellStick();
void enterBootloader();
void downloadFirmware();
void rebootTellStick();
void connectTellStick();
private:
char getCh();
void send(uchar ch);
static QByteArray readHex(const QString &filename, int maxAddress);
static int parseHex( const QByteArray &characters, int start, int length );
class PrivateData;
PrivateData *d;
};
#endif // TELLSTICK_H

View file

@ -0,0 +1,963 @@
/*++
Copyright (c) 2001-2007 Future Technology Devices International Ltd.
Module Name:
ftd2xx.h
Abstract:
Native USB device driver for FTDI FT8U232/245
FTD2XX library definitions
Environment:
kernel & user mode
Revision History:
13/03/01 awm Created.
13/01/03 awm Added device information support.
19/03/03 awm Added FT_W32_CancelIo.
12/06/03 awm Added FT_StopInTask and FT_RestartInTask.
18/09/03 awm Added FT_SetResetPipeRetryCount.
10/10/03 awm Added FT_ResetPort.
23/01/04 awm Added support for open-by-location.
16/03/04 awm Added support for FT2232C.
23/09/04 awm Added support for FT232R.
20/10/04 awm Added FT_CyclePort.
18/01/05 awm Added FT_DEVICE_LIST_INFO_NODE type.
11/02/05 awm Added LocId to FT_DEVICE_LIST_INFO_NODE.
25/08/05 awm Added FT_SetDeadmanTimeout.
02/12/05 awm Removed obsolete references.
05/12/05 awm Added FT_GetVersion, FT_GetVersionEx.
08/09/06 awm Added FT_W32_GetCommMask.
11/09/06 awm Added FT_Rescan.
11/07/07 awm Added support for FT2232H and FT4232H.
10/08/07 awm Added flags definitions.
21/11/07 mja Added FT_GetComPortNumber.
05/06/08 mja Added EEPROM extensions for FT2232H.
--*/
#ifndef FTD2XX_H
#define FTD2XX_H
// The following ifdef block is the standard way of creating macros
// which make exporting from a DLL simpler. All files within this DLL
// are compiled with the FTD2XX_EXPORTS symbol defined on the command line.
// This symbol should not be defined on any project that uses this DLL.
// This way any other project whose source files include this file see
// FTD2XX_API functions as being imported from a DLL, whereas this DLL
// sees symbols defined with this macro as being exported.
#ifdef FTD2XX_EXPORTS
#define FTD2XX_API __declspec(dllexport)
#else
#define FTD2XX_API __declspec(dllimport)
#endif
typedef PVOID FT_HANDLE;
typedef ULONG FT_STATUS;
//
// Device status
//
enum {
FT_OK,
FT_INVALID_HANDLE,
FT_DEVICE_NOT_FOUND,
FT_DEVICE_NOT_OPENED,
FT_IO_ERROR,
FT_INSUFFICIENT_RESOURCES,
FT_INVALID_PARAMETER,
FT_INVALID_BAUD_RATE,
FT_DEVICE_NOT_OPENED_FOR_ERASE,
FT_DEVICE_NOT_OPENED_FOR_WRITE,
FT_FAILED_TO_WRITE_DEVICE,
FT_EEPROM_READ_FAILED,
FT_EEPROM_WRITE_FAILED,
FT_EEPROM_ERASE_FAILED,
FT_EEPROM_NOT_PRESENT,
FT_EEPROM_NOT_PROGRAMMED,
FT_INVALID_ARGS,
FT_NOT_SUPPORTED,
FT_OTHER_ERROR,
FT_DEVICE_LIST_NOT_READY,
};
#define FT_SUCCESS(status) ((status) == FT_OK)
//
// FT_OpenEx Flags
//
#define FT_OPEN_BY_SERIAL_NUMBER 1
#define FT_OPEN_BY_DESCRIPTION 2
#define FT_OPEN_BY_LOCATION 4
//
// FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags
//
#define FT_LIST_NUMBER_ONLY 0x80000000
#define FT_LIST_BY_INDEX 0x40000000
#define FT_LIST_ALL 0x20000000
#define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL)
//
// Baud Rates
//
#define FT_BAUD_300 300
#define FT_BAUD_600 600
#define FT_BAUD_1200 1200
#define FT_BAUD_2400 2400
#define FT_BAUD_4800 4800
#define FT_BAUD_9600 9600
#define FT_BAUD_14400 14400
#define FT_BAUD_19200 19200
#define FT_BAUD_38400 38400
#define FT_BAUD_57600 57600
#define FT_BAUD_115200 115200
#define FT_BAUD_230400 230400
#define FT_BAUD_460800 460800
#define FT_BAUD_921600 921600
//
// Word Lengths
//
#define FT_BITS_8 (UCHAR) 8
#define FT_BITS_7 (UCHAR) 7
#define FT_BITS_6 (UCHAR) 6
#define FT_BITS_5 (UCHAR) 5
//
// Stop Bits
//
#define FT_STOP_BITS_1 (UCHAR) 0
#define FT_STOP_BITS_1_5 (UCHAR) 1
#define FT_STOP_BITS_2 (UCHAR) 2
//
// Parity
//
#define FT_PARITY_NONE (UCHAR) 0
#define FT_PARITY_ODD (UCHAR) 1
#define FT_PARITY_EVEN (UCHAR) 2
#define FT_PARITY_MARK (UCHAR) 3
#define FT_PARITY_SPACE (UCHAR) 4
//
// Flow Control
//
#define FT_FLOW_NONE 0x0000
#define FT_FLOW_RTS_CTS 0x0100
#define FT_FLOW_DTR_DSR 0x0200
#define FT_FLOW_XON_XOFF 0x0400
//
// Purge rx and tx buffers
//
#define FT_PURGE_RX 1
#define FT_PURGE_TX 2
//
// Events
//
typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD);
#define FT_EVENT_RXCHAR 1
#define FT_EVENT_MODEM_STATUS 2
#define FT_EVENT_LINE_STATUS 4
//
// Timeouts
//
#define FT_DEFAULT_RX_TIMEOUT 300
#define FT_DEFAULT_TX_TIMEOUT 300
//
// Device types
//
typedef ULONG FT_DEVICE;
enum {
FT_DEVICE_BM,
FT_DEVICE_AM,
FT_DEVICE_100AX,
FT_DEVICE_UNKNOWN,
FT_DEVICE_2232C,
FT_DEVICE_232R,
FT_DEVICE_2232H,
FT_DEVICE_4232H
};
#ifdef __cplusplus
extern "C" {
#endif
FTD2XX_API
FT_STATUS WINAPI FT_Open(
int deviceNumber,
FT_HANDLE *pHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_OpenEx(
PVOID pArg1,
DWORD Flags,
FT_HANDLE *pHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_ListDevices(
PVOID pArg1,
PVOID pArg2,
DWORD Flags
);
FTD2XX_API
FT_STATUS WINAPI FT_Close(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_Read(
FT_HANDLE ftHandle,
LPVOID lpBuffer,
DWORD dwBytesToRead,
LPDWORD lpBytesReturned
);
FTD2XX_API
FT_STATUS WINAPI FT_Write(
FT_HANDLE ftHandle,
LPVOID lpBuffer,
DWORD dwBytesToWrite,
LPDWORD lpBytesWritten
);
FTD2XX_API
FT_STATUS WINAPI FT_IoCtl(
FT_HANDLE ftHandle,
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped
);
FTD2XX_API
FT_STATUS WINAPI FT_SetBaudRate(
FT_HANDLE ftHandle,
ULONG BaudRate
);
FTD2XX_API
FT_STATUS WINAPI FT_SetDivisor(
FT_HANDLE ftHandle,
USHORT Divisor
);
FTD2XX_API
FT_STATUS WINAPI FT_SetDataCharacteristics(
FT_HANDLE ftHandle,
UCHAR WordLength,
UCHAR StopBits,
UCHAR Parity
);
FTD2XX_API
FT_STATUS WINAPI FT_SetFlowControl(
FT_HANDLE ftHandle,
USHORT FlowControl,
UCHAR XonChar,
UCHAR XoffChar
);
FTD2XX_API
FT_STATUS WINAPI FT_ResetDevice(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_SetDtr(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_ClrDtr(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_SetRts(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_ClrRts(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_GetModemStatus(
FT_HANDLE ftHandle,
ULONG *pModemStatus
);
FTD2XX_API
FT_STATUS WINAPI FT_SetChars(
FT_HANDLE ftHandle,
UCHAR EventChar,
UCHAR EventCharEnabled,
UCHAR ErrorChar,
UCHAR ErrorCharEnabled
);
FTD2XX_API
FT_STATUS WINAPI FT_Purge(
FT_HANDLE ftHandle,
ULONG Mask
);
FTD2XX_API
FT_STATUS WINAPI FT_SetTimeouts(
FT_HANDLE ftHandle,
ULONG ReadTimeout,
ULONG WriteTimeout
);
FTD2XX_API
FT_STATUS WINAPI FT_GetQueueStatus(
FT_HANDLE ftHandle,
DWORD *dwRxBytes
);
FTD2XX_API
FT_STATUS WINAPI FT_SetEventNotification(
FT_HANDLE ftHandle,
DWORD Mask,
PVOID Param
);
FTD2XX_API
FT_STATUS WINAPI FT_GetStatus(
FT_HANDLE ftHandle,
DWORD *dwRxBytes,
DWORD *dwTxBytes,
DWORD *dwEventDWord
);
FTD2XX_API
FT_STATUS WINAPI FT_SetBreakOn(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_SetBreakOff(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_SetWaitMask(
FT_HANDLE ftHandle,
DWORD Mask
);
FTD2XX_API
FT_STATUS WINAPI FT_WaitOnMask(
FT_HANDLE ftHandle,
DWORD *Mask
);
FTD2XX_API
FT_STATUS WINAPI FT_GetEventStatus(
FT_HANDLE ftHandle,
DWORD *dwEventDWord
);
FTD2XX_API
FT_STATUS WINAPI FT_ReadEE(
FT_HANDLE ftHandle,
DWORD dwWordOffset,
LPWORD lpwValue
);
FTD2XX_API
FT_STATUS WINAPI FT_WriteEE(
FT_HANDLE ftHandle,
DWORD dwWordOffset,
WORD wValue
);
FTD2XX_API
FT_STATUS WINAPI FT_EraseEE(
FT_HANDLE ftHandle
);
//
// structure to hold program data for FT_Program function
//
typedef struct ft_program_data {
DWORD Signature1; // Header - must be 0x00000000
DWORD Signature2; // Header - must be 0xffffffff
DWORD Version; // Header - FT_PROGRAM_DATA version
// 0 = original
// 1 = FT2232C extensions
// 2 = FT232R extensions
// 3 = FT2232H extensions
// 4 = FT4232H extensions
WORD VendorId; // 0x0403
WORD ProductId; // 0x6001
char *Manufacturer; // "FTDI"
char *ManufacturerId; // "FT"
char *Description; // "USB HS Serial Converter"
char *SerialNumber; // "FT000001" if fixed, or NULL
WORD MaxPower; // 0 < MaxPower <= 500
WORD PnP; // 0 = disabled, 1 = enabled
WORD SelfPowered; // 0 = bus powered, 1 = self powered
WORD RemoteWakeup; // 0 = not capable, 1 = capable
//
// Rev4 (FT232B) extensions
//
UCHAR Rev4; // non-zero if Rev4 chip, zero otherwise
UCHAR IsoIn; // non-zero if in endpoint is isochronous
UCHAR IsoOut; // non-zero if out endpoint is isochronous
UCHAR PullDownEnable; // non-zero if pull down enabled
UCHAR SerNumEnable; // non-zero if serial number to be used
UCHAR USBVersionEnable; // non-zero if chip uses USBVersion
WORD USBVersion; // BCD (0x0200 => USB2)
//
// Rev 5 (FT2232) extensions
//
UCHAR Rev5; // non-zero if Rev5 chip, zero otherwise
UCHAR IsoInA; // non-zero if in endpoint is isochronous
UCHAR IsoInB; // non-zero if in endpoint is isochronous
UCHAR IsoOutA; // non-zero if out endpoint is isochronous
UCHAR IsoOutB; // non-zero if out endpoint is isochronous
UCHAR PullDownEnable5; // non-zero if pull down enabled
UCHAR SerNumEnable5; // non-zero if serial number to be used
UCHAR USBVersionEnable5; // non-zero if chip uses USBVersion
WORD USBVersion5; // BCD (0x0200 => USB2)
UCHAR AIsHighCurrent; // non-zero if interface is high current
UCHAR BIsHighCurrent; // non-zero if interface is high current
UCHAR IFAIsFifo; // non-zero if interface is 245 FIFO
UCHAR IFAIsFifoTar; // non-zero if interface is 245 FIFO CPU target
UCHAR IFAIsFastSer; // non-zero if interface is Fast serial
UCHAR AIsVCP; // non-zero if interface is to use VCP drivers
UCHAR IFBIsFifo; // non-zero if interface is 245 FIFO
UCHAR IFBIsFifoTar; // non-zero if interface is 245 FIFO CPU target
UCHAR IFBIsFastSer; // non-zero if interface is Fast serial
UCHAR BIsVCP; // non-zero if interface is to use VCP drivers
//
// Rev 6 (FT232R) extensions
//
UCHAR UseExtOsc; // Use External Oscillator
UCHAR HighDriveIOs; // High Drive I/Os
UCHAR EndpointSize; // Endpoint size
UCHAR PullDownEnableR; // non-zero if pull down enabled
UCHAR SerNumEnableR; // non-zero if serial number to be used
UCHAR InvertTXD; // non-zero if invert TXD
UCHAR InvertRXD; // non-zero if invert RXD
UCHAR InvertRTS; // non-zero if invert RTS
UCHAR InvertCTS; // non-zero if invert CTS
UCHAR InvertDTR; // non-zero if invert DTR
UCHAR InvertDSR; // non-zero if invert DSR
UCHAR InvertDCD; // non-zero if invert DCD
UCHAR InvertRI; // non-zero if invert RI
UCHAR Cbus0; // Cbus Mux control
UCHAR Cbus1; // Cbus Mux control
UCHAR Cbus2; // Cbus Mux control
UCHAR Cbus3; // Cbus Mux control
UCHAR Cbus4; // Cbus Mux control
UCHAR RIsD2XX; // non-zero if using D2XX driver
//
// Rev 7 (FT2232H) Extensions
//
UCHAR PullDownEnable7; // non-zero if pull down enabled
UCHAR SerNumEnable7; // non-zero if serial number to be used
UCHAR ALSlowSlew; // non-zero if AL pins have slow slew
UCHAR ALSchmittInput; // non-zero if AL pins are Schmitt input
UCHAR ALDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA
UCHAR AHSlowSlew; // non-zero if AH pins have slow slew
UCHAR AHSchmittInput; // non-zero if AH pins are Schmitt input
UCHAR AHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA
UCHAR BLSlowSlew; // non-zero if BL pins have slow slew
UCHAR BLSchmittInput; // non-zero if BL pins are Schmitt input
UCHAR BLDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA
UCHAR BHSlowSlew; // non-zero if BH pins have slow slew
UCHAR BHSchmittInput; // non-zero if BH pins are Schmitt input
UCHAR BHDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA
UCHAR IFAIsFifo7; // non-zero if interface is 245 FIFO
UCHAR IFAIsFifoTar7; // non-zero if interface is 245 FIFO CPU target
UCHAR IFAIsFastSer7; // non-zero if interface is Fast serial
UCHAR AIsVCP7; // non-zero if interface is to use VCP drivers
UCHAR IFBIsFifo7; // non-zero if interface is 245 FIFO
UCHAR IFBIsFifoTar7; // non-zero if interface is 245 FIFO CPU target
UCHAR IFBIsFastSer7; // non-zero if interface is Fast serial
UCHAR BIsVCP7; // non-zero if interface is to use VCP drivers
UCHAR PowerSaveEnable; // non-zero if using BCBUS7 to save power for self-powered designs
//
// Rev 8 (FT4232H) Extensions
//
UCHAR PullDownEnable8; // non-zero if pull down enabled
UCHAR SerNumEnable8; // non-zero if serial number to be used
UCHAR ASlowSlew; // non-zero if AL pins have slow slew
UCHAR ASchmittInput; // non-zero if AL pins are Schmitt input
UCHAR ADriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA
UCHAR BSlowSlew; // non-zero if AH pins have slow slew
UCHAR BSchmittInput; // non-zero if AH pins are Schmitt input
UCHAR BDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA
UCHAR CSlowSlew; // non-zero if BL pins have slow slew
UCHAR CSchmittInput; // non-zero if BL pins are Schmitt input
UCHAR CDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA
UCHAR DSlowSlew; // non-zero if BH pins have slow slew
UCHAR DSchmittInput; // non-zero if BH pins are Schmitt input
UCHAR DDriveCurrent; // valid values are 4mA, 8mA, 12mA, 16mA
UCHAR ARIIsTXDEN; // non-zero if port A uses RI as RS485 TXDEN
UCHAR BRIIsTXDEN; // non-zero if port B uses RI as RS485 TXDEN
UCHAR CRIIsTXDEN; // non-zero if port C uses RI as RS485 TXDEN
UCHAR DRIIsTXDEN; // non-zero if port D uses RI as RS485 TXDEN
UCHAR AIsVCP8; // non-zero if interface is to use VCP drivers
UCHAR BIsVCP8; // non-zero if interface is to use VCP drivers
UCHAR CIsVCP8; // non-zero if interface is to use VCP drivers
UCHAR DIsVCP8; // non-zero if interface is to use VCP drivers
} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA;
FTD2XX_API
FT_STATUS WINAPI FT_EE_Program(
FT_HANDLE ftHandle,
PFT_PROGRAM_DATA pData
);
FTD2XX_API
FT_STATUS WINAPI FT_EE_ProgramEx(
FT_HANDLE ftHandle,
PFT_PROGRAM_DATA pData,
char *Manufacturer,
char *ManufacturerId,
char *Description,
char *SerialNumber
);
FTD2XX_API
FT_STATUS WINAPI FT_EE_Read(
FT_HANDLE ftHandle,
PFT_PROGRAM_DATA pData
);
FTD2XX_API
FT_STATUS WINAPI FT_EE_ReadEx(
FT_HANDLE ftHandle,
PFT_PROGRAM_DATA pData,
char *Manufacturer,
char *ManufacturerId,
char *Description,
char *SerialNumber
);
FTD2XX_API
FT_STATUS WINAPI FT_EE_UASize(
FT_HANDLE ftHandle,
LPDWORD lpdwSize
);
FTD2XX_API
FT_STATUS WINAPI FT_EE_UAWrite(
FT_HANDLE ftHandle,
PUCHAR pucData,
DWORD dwDataLen
);
FTD2XX_API
FT_STATUS WINAPI FT_EE_UARead(
FT_HANDLE ftHandle,
PUCHAR pucData,
DWORD dwDataLen,
LPDWORD lpdwBytesRead
);
FTD2XX_API
FT_STATUS WINAPI FT_SetLatencyTimer(
FT_HANDLE ftHandle,
UCHAR ucLatency
);
FTD2XX_API
FT_STATUS WINAPI FT_GetLatencyTimer(
FT_HANDLE ftHandle,
PUCHAR pucLatency
);
FTD2XX_API
FT_STATUS WINAPI FT_SetBitMode(
FT_HANDLE ftHandle,
UCHAR ucMask,
UCHAR ucEnable
);
FTD2XX_API
FT_STATUS WINAPI FT_GetBitMode(
FT_HANDLE ftHandle,
PUCHAR pucMode
);
FTD2XX_API
FT_STATUS WINAPI FT_SetUSBParameters(
FT_HANDLE ftHandle,
ULONG ulInTransferSize,
ULONG ulOutTransferSize
);
FTD2XX_API
FT_STATUS WINAPI FT_SetDeadmanTimeout(
FT_HANDLE ftHandle,
ULONG ulDeadmanTimeout
);
FTD2XX_API
FT_STATUS WINAPI FT_GetDeviceInfo(
FT_HANDLE ftHandle,
FT_DEVICE *lpftDevice,
LPDWORD lpdwID,
PCHAR SerialNumber,
PCHAR Description,
LPVOID Dummy
);
FTD2XX_API
FT_STATUS WINAPI FT_StopInTask(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_RestartInTask(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_SetResetPipeRetryCount(
FT_HANDLE ftHandle,
DWORD dwCount
);
FTD2XX_API
FT_STATUS WINAPI FT_ResetPort(
FT_HANDLE ftHandle
);
FTD2XX_API
FT_STATUS WINAPI FT_CyclePort(
FT_HANDLE ftHandle
);
//
// Win32-type functions
//
FTD2XX_API
FT_HANDLE WINAPI FT_W32_CreateFile(
LPCTSTR lpszName,
DWORD dwAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreate,
DWORD dwAttrsAndFlags,
HANDLE hTemplate
);
FTD2XX_API
BOOL WINAPI FT_W32_CloseHandle(
FT_HANDLE ftHandle
);
FTD2XX_API
BOOL WINAPI FT_W32_ReadFile(
FT_HANDLE ftHandle,
LPVOID lpBuffer,
DWORD nBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped
);
FTD2XX_API
BOOL WINAPI FT_W32_WriteFile(
FT_HANDLE ftHandle,
LPVOID lpBuffer,
DWORD nBufferSize,
LPDWORD lpBytesWritten,
LPOVERLAPPED lpOverlapped
);
FTD2XX_API
DWORD WINAPI FT_W32_GetLastError(
FT_HANDLE ftHandle
);
FTD2XX_API
BOOL WINAPI FT_W32_GetOverlappedResult(
FT_HANDLE ftHandle,
LPOVERLAPPED lpOverlapped,
LPDWORD lpdwBytesTransferred,
BOOL bWait
);
FTD2XX_API
BOOL WINAPI FT_W32_CancelIo(
FT_HANDLE ftHandle
);
//
// Win32 COMM API type functions
//
typedef struct _FTCOMSTAT {
DWORD fCtsHold : 1;
DWORD fDsrHold : 1;
DWORD fRlsdHold : 1;
DWORD fXoffHold : 1;
DWORD fXoffSent : 1;
DWORD fEof : 1;
DWORD fTxim : 1;
DWORD fReserved : 25;
DWORD cbInQue;
DWORD cbOutQue;
} FTCOMSTAT, *LPFTCOMSTAT;
typedef struct _FTDCB {
DWORD DCBlength; /* sizeof(FTDCB) */
DWORD BaudRate; /* Baudrate at which running */
DWORD fBinary: 1; /* Binary Mode (skip EOF check) */
DWORD fParity: 1; /* Enable parity checking */
DWORD fOutxCtsFlow:1; /* CTS handshaking on output */
DWORD fOutxDsrFlow:1; /* DSR handshaking on output */
DWORD fDtrControl:2; /* DTR Flow control */
DWORD fDsrSensitivity:1; /* DSR Sensitivity */
DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */
DWORD fOutX: 1; /* Enable output X-ON/X-OFF */
DWORD fInX: 1; /* Enable input X-ON/X-OFF */
DWORD fErrorChar: 1; /* Enable Err Replacement */
DWORD fNull: 1; /* Enable Null stripping */
DWORD fRtsControl:2; /* Rts Flow control */
DWORD fAbortOnError:1; /* Abort all reads and writes on Error */
DWORD fDummy2:17; /* Reserved */
WORD wReserved; /* Not currently used */
WORD XonLim; /* Transmit X-ON threshold */
WORD XoffLim; /* Transmit X-OFF threshold */
BYTE ByteSize; /* Number of bits/byte, 4-8 */
BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */
BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */
char XonChar; /* Tx and Rx X-ON character */
char XoffChar; /* Tx and Rx X-OFF character */
char ErrorChar; /* Error replacement char */
char EofChar; /* End of Input character */
char EvtChar; /* Received Event character */
WORD wReserved1; /* Fill for now. */
} FTDCB, *LPFTDCB;
typedef struct _FTTIMEOUTS {
DWORD ReadIntervalTimeout; /* Maximum time between read chars. */
DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */
DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */
DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */
DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */
} FTTIMEOUTS,*LPFTTIMEOUTS;
FTD2XX_API
BOOL WINAPI FT_W32_ClearCommBreak(
FT_HANDLE ftHandle
);
FTD2XX_API
BOOL WINAPI FT_W32_ClearCommError(
FT_HANDLE ftHandle,
LPDWORD lpdwErrors,
LPFTCOMSTAT lpftComstat
);
FTD2XX_API
BOOL WINAPI FT_W32_EscapeCommFunction(
FT_HANDLE ftHandle,
DWORD dwFunc
);
FTD2XX_API
BOOL WINAPI FT_W32_GetCommModemStatus(
FT_HANDLE ftHandle,
LPDWORD lpdwModemStatus
);
FTD2XX_API
BOOL WINAPI FT_W32_GetCommState(
FT_HANDLE ftHandle,
LPFTDCB lpftDcb
);
FTD2XX_API
BOOL WINAPI FT_W32_GetCommTimeouts(
FT_HANDLE ftHandle,
FTTIMEOUTS *pTimeouts
);
FTD2XX_API
BOOL WINAPI FT_W32_PurgeComm(
FT_HANDLE ftHandle,
DWORD dwMask
);
FTD2XX_API
BOOL WINAPI FT_W32_SetCommBreak(
FT_HANDLE ftHandle
);
FTD2XX_API
BOOL WINAPI FT_W32_SetCommMask(
FT_HANDLE ftHandle,
ULONG ulEventMask
);
FTD2XX_API
BOOL WINAPI FT_W32_GetCommMask(
FT_HANDLE ftHandle,
LPDWORD lpdwEventMask
);
FTD2XX_API
BOOL WINAPI FT_W32_SetCommState(
FT_HANDLE ftHandle,
LPFTDCB lpftDcb
);
FTD2XX_API
BOOL WINAPI FT_W32_SetCommTimeouts(
FT_HANDLE ftHandle,
FTTIMEOUTS *pTimeouts
);
FTD2XX_API
BOOL WINAPI FT_W32_SetupComm(
FT_HANDLE ftHandle,
DWORD dwReadBufferSize,
DWORD dwWriteBufferSize
);
FTD2XX_API
BOOL WINAPI FT_W32_WaitCommEvent(
FT_HANDLE ftHandle,
PULONG pulEvent,
LPOVERLAPPED lpOverlapped
);
//
// Device information
//
typedef struct _ft_device_list_info_node {
ULONG Flags;
ULONG Type;
ULONG ID;
DWORD LocId;
char SerialNumber[16];
char Description[64];
FT_HANDLE ftHandle;
} FT_DEVICE_LIST_INFO_NODE;
// Device information flags
enum {
FT_FLAGS_OPENED = 1,
FT_FLAGS_HISPEED = 2
};
FTD2XX_API
FT_STATUS WINAPI FT_CreateDeviceInfoList(
LPDWORD lpdwNumDevs
);
FTD2XX_API
FT_STATUS WINAPI FT_GetDeviceInfoList(
FT_DEVICE_LIST_INFO_NODE *pDest,
LPDWORD lpdwNumDevs
);
FTD2XX_API
FT_STATUS WINAPI FT_GetDeviceInfoDetail(
DWORD dwIndex,
LPDWORD lpdwFlags,
LPDWORD lpdwType,
LPDWORD lpdwID,
LPDWORD lpdwLocId,
LPVOID lpSerialNumber,
LPVOID lpDescription,
FT_HANDLE *pftHandle
);
//
// Version information
//
FTD2XX_API
FT_STATUS WINAPI FT_GetDriverVersion(
FT_HANDLE ftHandle,
LPDWORD lpdwVersion
);
FTD2XX_API
FT_STATUS WINAPI FT_GetLibraryVersion(
LPDWORD lpdwVersion
);
FTD2XX_API
FT_STATUS WINAPI FT_Rescan(
void
);
FTD2XX_API
FT_STATUS WINAPI FT_Reload(
WORD wVid,
WORD wPid
);
FTD2XX_API
FT_STATUS WINAPI FT_GetComPortNumber(
FT_HANDLE ftHandle,
LPLONG lpdwComPortNumber
);
#ifdef __cplusplus
}
#endif
#endif /* FTD2XX_H */