confclerk-0.6.4/0000775000175000017500000000000013212517317012765 5ustar gregoagregoaconfclerk-0.6.4/confclerk.pro0000664000175000017500000000350313212517317015456 0ustar gregoagregoa# confclerk.pro QMAKEVERSION = $$[QMAKE_VERSION] ISQT4 = $$find(QMAKEVERSION, ^[2-9]) isEmpty( ISQT4 ) { error("Use the qmake include with Qt4.7 or greater, on Debian that is qmake-qt4"); } TEMPLATE = subdirs SUBDIRS = src # The global.pri defines the VERSION of the project include(src/global.pri) QMAKE_EXTRA_TARGETS += changelog icon man release releaseclean tarball signature changelog.target = ChangeLog changelog.commands = \ git pull && /usr/share/gnulib/build-aux/gitlog-to-changelog > ChangeLog changelog.CONFIG = phony icon.target = data/$${TARGET}.png icon.commands = convert -transparent white data/$${TARGET}.svg data/$${TARGET}.png icon.depends = data/$${TARGET}.svg man.target = data/$${TARGET}.1 man.commands = \ pod2man --utf8 --center=\"Offline conference scheduler\" --release=\"Version $${VERSION}\" data/$${TARGET}.pod > data/$${TARGET}.1 man.depends = data/$${TARGET}.pod releaseclean.commands = \ $(DEL_FILE) data/$${TARGET}.png data/$${TARGET}.1 ChangeLog $${TARGET}-$${VERSION}.tar.gz.asc release.depends = distclean releaseclean tarball signature #releaseclean.CONFIG = phony tarball.target = $${TARGET}-$${VERSION}.tar.gz tarball.commands = \ $(DEL_FILE) -r $${TARGET}-$${VERSION} ; \ $(MKDIR) $${TARGET}-$${VERSION} ; \ $(COPY_DIR) * $${TARGET}-$${VERSION}/ ; \ $(DEL_FILE) $${TARGET}-$${VERSION}/*.pro.user* \ $${TARGET}-$${VERSION}/$${TARGET}-$${VERSION}.tar.gz \ $(DEL_FILE) -r $${TARGET}-$${VERSION}/$${TARGET}-$${VERSION} \ $${TARGET}-$${VERSION}/Makefile ; \ tar -cz --exclude=.svn --exclude=.git --exclude=*.tar.gz -f $$tarball.target $${TARGET}-$${VERSION} ; \ $(DEL_FILE) -r $${TARGET}-$${VERSION} tarball.depends = changelog icon man signature.target = $${TARGET}-$${VERSION}.tar.gz.asc signature.commands = \ gpg --armor --detach-sign $${TARGET}-$${VERSION}.tar.gz signature.depends = tarball confclerk-0.6.4/AUTHORS0000664000175000017500000000050213212517317014032 0ustar gregoagregoaThis is the AUTHORS file for ConfClerk. ConfClerk is the successor of fosdem-schedule; cf. docs/fosdem-schedule for the historic documentation. Francisco Fortes Matus Hanzes Martin Komara Marek Timko Matus Uzak Monika Berendova Pavol Korinek Pavol Pavelka Maksim Kirillov Philipp Spitzer gregor herrmann Stefan Strahl confclerk-0.6.4/INSTALL0000664000175000017500000000104713212517317014020 0ustar gregoagregoaThis is the INSTALL file for ConfClerk. ConfClerk is the successor of fosdem-schedule; cf. docs/fosdem-schedule for the historic documentation. Note ConfClerk is an application intended for mobile devices like the Nokia N810 and N900. The preferred distribution is using a packaged version for your distribution. Basic Installation 1. Type `qmake' to generate Makefiles. 2. Type `make' to compile the source code. 3. Type `make install' to install the executable. 4. Type `make uninstall' to remove all installed files form your system. confclerk-0.6.4/src/0000775000175000017500000000000013212517317013554 5ustar gregoagregoaconfclerk-0.6.4/src/orm/0000775000175000017500000000000013212517317014351 5ustar gregoagregoaconfclerk-0.6.4/src/orm/ormrecord.h0000664000175000017500000001403613212517317016522 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef ORMRECORD_H #define ORMRECORD_H #include #include #include #include #include #include #include #include class OrmException: public std::runtime_error { public: OrmException(const QString& text) : std::runtime_error(text.toStdString()), mText(text) {} virtual ~OrmException() throw() {} virtual const QString& text() const { return mText; } private: QString mText; }; class OrmNoObjectException : public OrmException { public: OrmNoObjectException() : OrmException("SQL query expects one record but found none."){} ~OrmNoObjectException() throw() {} }; class OrmSqlException : public OrmException { public: OrmSqlException(const QString& text) : OrmException( QString("Sql error: ") + text ) {} ~OrmSqlException() throw() {} }; template class OrmRecord : protected QSqlRecord { public: OrmRecord(); static T hydrate(const QSqlRecord& record); void update(QString col, QVariant value = QVariant()); // updates specified column 'col' protected: QVariant value(QString col) const; void setValue(QString col, QVariant value); static T loadOne(QSqlQuery query); static QList load(QSqlQuery query); // auxiliary methods static QSqlRecord toRecord(const QList & columnList); // all record items/columns are in one table static QString columnsForSelect(const QString& prefix = QString()); static QString selectQuery(); static QString updateQuery(); static QVariant convertToC(QVariant value, QVariant::Type colType); static QVariant convertToDb(QVariant value, QVariant::Type colType); }; template OrmRecord::OrmRecord() { QSqlRecord::operator=(T::sColumns); } template T OrmRecord::hydrate(const QSqlRecord& record) { T object; object.QSqlRecord::operator=(record); return object; } // updates specified column 'col' // if the value is not specified as an argument, // it's taken from the record itself // see also: setValue() method for more details template void OrmRecord::update(QString col, QVariant value) { QSqlQuery query; query.prepare(QString(updateQuery() + "SET %1 = :col WHERE id = :id").arg(col)); if(value.isValid()) // take 'col' value from the method's arguments query.bindValue(":col", value); else // take 'col' value from the record; see setValue() query.bindValue(":col", convertToDb(this->value(col), this->value(col).type())); query.bindValue(":id", this->value("id")); query.exec(); } template QVariant OrmRecord::value(QString col) const { return convertToC(QSqlRecord::value(col), T::sColumns.field(col).type()); } template void OrmRecord::setValue(QString col, QVariant value) { QSqlRecord::setValue(col, convertToDb(value, T::sColumns.field(col).type())); } template T OrmRecord::loadOne(QSqlQuery query) { if (!query.isActive()) { if (!query.exec()) { throw OrmSqlException(query.lastError().text()); } } if (!query.next()) { throw OrmNoObjectException(); } return hydrate(query.record()); } template QList OrmRecord::load(QSqlQuery query) { if (!query.isActive()) { if (!query.exec()) { qDebug() << "Error: " << query.lastError().driverText() << "; Type: " << query.lastError().type(); throw OrmSqlException(query.lastError().text()); } } QList objects; while (query.next()) { objects << hydrate(query.record()); } return objects; } template QString OrmRecord::columnsForSelect(const QString& prefix) { QStringList prefixedColumns; for (int i=0; i QString OrmRecord::selectQuery() { return QString("SELECT %1 FROM %2 ").arg(columnsForSelect(), T::sTableName); } template QString OrmRecord::updateQuery() { return QString("UPDATE %1 ").arg(T::sTableName); } template QSqlRecord OrmRecord::toRecord(const QList & columnList) { QSqlRecord record; for(int i=0; i< columnList.count(); i++) { record.append(columnList[i]); } return record; } template QVariant OrmRecord::convertToC(QVariant value, QVariant::Type colType) { if (colType == QVariant::DateTime && value.canConvert()) { QDateTime date; date.setTimeSpec(Qt::UTC); date.setTime_t(value.toUInt()); return date; } return value; } template QVariant OrmRecord::convertToDb(QVariant value, QVariant::Type colType) { if (colType == QVariant::DateTime && value.canConvert()) { QDateTime dateTime = value.toDateTime(); dateTime.setTimeSpec(Qt::UTC); // this is to avoid that dateTime.toTime_t changes the time depending on the local time zone return dateTime.toTime_t(); } return value; } #endif // ORMRECORD_H confclerk-0.6.4/src/orm/orm.pro0000664000175000017500000000024513212517317015671 0ustar gregoagregoaTEMPLATE = lib TARGET = orm DESTDIR = ../bin CONFIG += static QT += sql QMAKE_CLEAN += ../bin/liborm.a # module dependencies DEPENDPATH += . HEADERS += ormrecord.h confclerk-0.6.4/src/db.qrc0000664000175000017500000000021213212517317014643 0ustar gregoagregoa dbschema001.sql dbschema000to001.sql confclerk-0.6.4/src/dbschema000.sql0000664000175000017500000000540113212517317016263 0ustar gregoagregoaBEGIN TRANSACTION; CREATE TABLE CONFERENCE ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , title VARCHAR UNIQUE NOT NULL , subtitle VARCHAR , venue VARCHAR , city VARCHAR NOT NULL , start INTEGER NOT NULL , end INTEGER NOT NULL , days INTEGER , day_change INTEGER , timeslot_duration INTEGER , active INTEGER DEFAULT 0 , url VARCHAR); CREATE TABLE TRACK ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , xid_conference INTEGER NOT NULL , name VARCHAR NOT NULL , UNIQUE (xid_conference, name)); CREATE TABLE ROOM ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , xid_conference INTEGER NOT NULL , name VARCHAR NOT NULL , picture VARCHAR NOT NULL , UNIQUE (xid_conference, name)); CREATE TABLE PERSON ( id INTEGER NOT NULL , xid_conference INTEGER NOT NULL , name VARCHAR NOT NULL , UNIQUE (xid_conference, name) , PRIMARY KEY (id, xid_conference)); CREATE TABLE EVENT ( xid_conference INTEGER NOT NULL , id INTEGER NOT NULL , start INTEGER NOT NULL , duration INTEGER NOT NULL -- duration of the event in seconds , xid_track INTEGER NOT NULL REFERENCES TRACK(id) , type VARCHAR , language VARCHAR , tag VARCHAR , title VARCHAR NOT NULL , subtitle VARCHAR , abstract VARCHAR , description VARCHAR , favourite INTEGER DEFAULT 0 , alarm INTEGER DEFAULT 0 , PRIMARY KEY (xid_conference ,id) , FOREIGN KEY(xid_conference) REFERENCES CONFERENCE(id) , FOREIGN KEY(xid_track) REFERENCES TRACK(id)); CREATE TABLE EVENT_PERSON ( xid_conference INTEGER NOT NULL , xid_event INTEGER NOT NULL , xid_person INTEGER NOT NULL , UNIQUE ( xid_conference , xid_event , xid_person ) ON CONFLICT REPLACE , FOREIGN KEY(xid_conference) REFERENCES CONFERENCE(id) , FOREIGN KEY(xid_conference, xid_event) REFERENCES EVENT(xid_conference, id) , FOREIGN KEY(xid_conference, xid_person) REFERENCES PERSON(xid_conference, id)); CREATE TABLE EVENT_ROOM ( xid_conference INTEGER NOT NULL , xid_event INTEGER NOT NULL , xid_room INTEGER NOT NULL , UNIQUE ( xid_conference , xid_event , xid_room ) ON CONFLICT REPLACE , FOREIGN KEY(xid_conference) REFERENCES CONFERENCE(id) , FOREIGN KEY(xid_conference, xid_event) REFERENCES EVENT(xid_conference, id) , FOREIGN KEY(xid_conference, xid_room) REFERENCES ROOM(xid_conference, id)); CREATE TABLE LINK ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , xid_conference INTEGER NOT NULL , xid_event INTEGER NOT NULL , name VARCHAR , url VARCHAR NOT NULL , UNIQUE ( xid_conference , xid_event , url ) ON CONFLICT REPLACE , FOREIGN KEY(xid_conference) REFERENCES CONFERENCE(id) , FOREIGN KEY(xid_conference, xid_event) REFERENCES EVENT(xid_conference, id)); COMMIT; confclerk-0.6.4/src/global.pri0000664000175000017500000000164213212517317015533 0ustar gregoagregoa# This is 'global.pri' file which defines # GLOBAL definitions for the project # include this file in each "*.pro" file, where it's needed # USAGE: include(./global.pri) # VERSION VERSION = 0.6.4 DEFINES += VERSION=\\\"$$VERSION\\\" # Define 'MAEMO' specific CONFIG/DEFINE # To handle 'MAEMO' specific soruces/code DISTRO = $$system(cat /etc/issue) contains( DISTRO, [Mm]aemo ) { # for 'MAEMO' specific source code parts DEFINES += MAEMO # for eg. including 'MAEMO' specific files CONFIG += maemo } contains( DISTRO, [Ii]nternet ) { contains( DISTRO, [Tt]ablet ) { # Nokia N810 device DEFINES += N810 } } # gcc 4.2.1 on Maemo doesn't understand anything newer then c++98. # make sure we explicitly add the flag even when building # with a modern compiler. # Only under Qt4 because Qt5 needs c++11 unix: { equals( QT_MAJOR_VERSION, 4 ) { QMAKE_CXXFLAGS += -std=c++98 } } confclerk-0.6.4/src/gui/0000775000175000017500000000000013212517317014340 5ustar gregoagregoaconfclerk-0.6.4/src/gui/dayviewtabcontainer.h0000664000175000017500000000232113212517317020551 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef DAYVIEWTABCONTAINER_H_ #define DAYVIEWTABCONTAINER_H_ #include "tabcontainer.h" class DayViewTabContainer: public TabContainer { Q_OBJECT public: DayViewTabContainer(QWidget *aParent); virtual ~DayViewTabContainer() {} public slots: void expandTimeGroup(QTime time, int conferenceId); protected: virtual void loadEvents(const QDate &aDate, const int aConferenceId ); }; #endif /* DAYVIEWTABCONTAINER_H_ */ confclerk-0.6.4/src/gui/urlinputdialog.cpp0000664000175000017500000000367113212517317020115 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "urlinputdialog.h" #include #include UrlInputDialog::UrlInputDialog(QWidget* parent) : QDialog(parent) { setupUi(this); QPushButton* openFile = buttons->addButton(tr("Open file ..."), QDialogButtonBox::ActionRole); textChanged(urlEntry->text()); connect(openFile, SIGNAL(clicked()), SLOT(openFileClicked())); connect(buttons, SIGNAL(accepted()), SLOT(acceptClicked())); connect(buttons, SIGNAL(rejected()), SLOT(rejectClicked())); connect(urlEntry, SIGNAL(textChanged(QString)), SLOT(textChanged(QString))); } void UrlInputDialog::openFileClicked() { QString file = QFileDialog::getOpenFileName(this, "Select Conference Schedule", QString(), "Schedule Files (*.xml);;All Files(*)"); if (file.isNull()) { return; } else { saved_result = file; done(HaveFile); } } void UrlInputDialog::textChanged(const QString& text) { buttons->button(QDialogButtonBox::Open)->setEnabled(!text.isEmpty()); } void UrlInputDialog::acceptClicked() { saved_result = urlEntry->text().trimmed(); setResult(HaveUrl); } void UrlInputDialog::rejectClicked() { setResult(Cancel); } confclerk-0.6.4/src/gui/conflictdialogcontainer.cpp0000664000175000017500000000304113212517317021726 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "conflictdialogcontainer.h" ConflictDialogContainer::ConflictDialogContainer(QWidget *aParent) : TabContainer( aParent ), mEventId(-1), mConferenceId(-1) {} void ConflictDialogContainer::setEventId(int aEventId, int conferenceId) { mEventId = aEventId; mConferenceId = conferenceId; loadEvents(); } void ConflictDialogContainer::loadEvents() { static_cast(treeView->model())->loadConflictEvents(mEventId, mConferenceId); treeView->setAllExpanded(true); } void ConflictDialogContainer::loadEvents(const QDate &aDate, const int aConferenceId) { Q_UNUSED(aDate); Q_UNUSED(aConferenceId); Q_ASSERT(aConferenceId == mConferenceId); Q_ASSERT(mConferenceId > 0); Q_ASSERT(mEventId > 0); loadEvents(); } confclerk-0.6.4/src/gui/searchhead.cpp0000664000175000017500000000273213212517317017137 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "searchhead.h" #include SearchHead::SearchHead(QWidget *parent) : QWidget(parent) { setupUi(this); QShortcut* shortcutEnter = new QShortcut(QKeySequence(Qt::Key_Enter), this, 0, 0, Qt::WidgetWithChildrenShortcut); connect(shortcutEnter, SIGNAL(activated()), this, SLOT(searchButtonClicked())); QShortcut* shortcutReturn = new QShortcut(QKeySequence(Qt::Key_Return), this, 0, 0, Qt::WidgetWithChildrenShortcut); connect(shortcutReturn, SIGNAL(activated()), this, SLOT(searchButtonClicked())); connect( searchButton, SIGNAL(clicked()), SLOT(searchButtonClicked())); } SearchHead::~SearchHead() { } void SearchHead::searchButtonClicked() { emit( searchClicked() ); } confclerk-0.6.4/src/gui/conferenceeditor.cpp0000664000175000017500000001444313212517317020370 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "conferenceeditor.h" #include "conferencemodel.h" #include "urlinputdialog.h" #include "errormessage.h" #include #include #include #include ConferenceEditor::ConferenceEditor(ConferenceModel* model, QWidget* parent) : QDialog(parent) , model(model) , selected_id(-1) { setupUi(this); progressBar->hide(); confView->setModel(model); QItemSelectionModel* confViewSelection = new QItemSelectionModel(model, this); confView->setSelectionModel(confViewSelection); connect(confViewSelection, SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), SLOT(itemSelected(const QModelIndex&, const QModelIndex&))); connect(this, SIGNAL(wantCurrent(const QModelIndex&, QItemSelectionModel::SelectionFlags)), confViewSelection, SLOT(setCurrentIndex(const QModelIndex&, QItemSelectionModel::SelectionFlags))); connect(addBtn, SIGNAL(clicked()), SLOT(addClicked())); connect(removeBtn, SIGNAL(clicked()), SLOT(removeClicked())); connect(changeUrl, SIGNAL(clicked()), SLOT(changeUrlClicked())); connect(refreshBtn, SIGNAL(clicked()), SLOT(refreshClicked())); connect(buttonBox, SIGNAL(rejected()), SLOT(close())); // it's OK to emit selection signals here // because they are not yet connected to anybody int active_id = Conference::activeConference(); if (active_id > 0) { emit wantCurrent(model->indexFromId(active_id), QItemSelectionModel::SelectCurrent); } else { itemSelected(QModelIndex(), QModelIndex()); } } void ConferenceEditor::conferenceRemoved() { if (model->rowCount() > 0) { emit wantCurrent(model->index(0, 0), QItemSelectionModel::SelectCurrent); } else { itemSelected(QModelIndex(), QModelIndex()); } } void ConferenceEditor::itemSelected(const QModelIndex& current, const QModelIndex& previous) { // TODO: fill all required fields Q_UNUSED(previous); if (!current.isValid()) { selected_id = -1; emit noneConferenceSelected(); conferenceInfo->setCurrentIndex(1); removeBtn->hide(); } else { const Conference& conf = model->conferenceFromIndex(current); selected_id = conf.id(); emit haveConferenceSelected(selected_id); conferenceTitle->setText(conf.title()); conferenceSubtitle->setText(conf.subtitle()); conferenceWhere->setText(conf.city() + (!conf.venue().isEmpty() ? ", " + conf.venue() : "")); conferenceWhen->setText( conf.start().toString("yyyy-MM-dd") + " - " + conf.end().toString("yyyy-MM-dd")); conferenceInfo->setCurrentIndex(0); removeBtn->show(); } } void ConferenceEditor::addClicked() { UrlInputDialog url_input(this); switch (url_input.exec()) { case UrlInputDialog::HaveUrl: emit haveConferenceUrl(url_input.url(), 0); break; case UrlInputDialog::HaveFile: emit haveConferenceFile(url_input.url(), 0); break; case UrlInputDialog::Cancel: return; } } void ConferenceEditor::removeClicked() { if (selected_id < 0) { // TODO: disable it when none is selected return; } QMessageBox::StandardButton answer = QMessageBox::question(0 , "Deletion confirmation" , QString("Really delete the %1 conference").arg(Conference::getById(selected_id).title()) , QMessageBox::Yes | QMessageBox::No , QMessageBox::No); if (answer == QMessageBox::Yes) { emit removeConferenceRequested(selected_id); } } void ConferenceEditor::changeUrlClicked() { if (selected_id < 0) return; const Conference& selectedConf = Conference::getById(selected_id); bool ok; QString url = QInputDialog::getText(this, "URL Input", "Enter schedule URL", QLineEdit::Normal, selectedConf.url(), &ok); if (ok) { emit changeUrlRequested(selected_id, url); } } void ConferenceEditor::refreshClicked() { if (selected_id <= 0) return; const Conference& selectedConf = Conference::getById(selected_id); QString url = selectedConf.url(); if (url.isEmpty()) { static const QString format("Schedule URL for %1 is not set. Enter the schedule URL:"); bool ok; url = QInputDialog::getText(this, "URL Input", format.arg(selectedConf.title()), QLineEdit::Normal, QString(), &ok); if (!ok) return; // first save it, to remain if fetch fails emit changeUrlRequested(selected_id, url); } // fetch importStarted(); // just to show the progress bar emit haveConferenceUrl(url, selected_id); } void ConferenceEditor::importStarted() { addBtn->hide(); removeBtn->hide(); buttons->layout()->removeItem(buttonsSpacer); progressBar->setValue(0); progressBar->show(); QApplication::processEvents(); } void ConferenceEditor::showParsingProgress(int progress) { progressBar->setValue(progress); QApplication::processEvents(); } void ConferenceEditor::importFinished(int conferenceId) { addBtn->show(); // removeItem should be shown later, but it takes some time, // and not looks good // anyway it will be shown a bit later removeBtn->show(); buttons->layout()->addItem(buttonsSpacer); progressBar->hide(); QApplication::processEvents(); QModelIndex item = model->indexFromId(conferenceId); if (item.isValid()) emit wantCurrent(item, QItemSelectionModel::SelectCurrent); else itemSelected(QModelIndex(), QModelIndex()); } confclerk-0.6.4/src/gui/conflictsdialog.ui0000664000175000017500000000422513212517317020046 0ustar gregoagregoa ConflictsDialog 0 0 471 373 Dialog Selected Event is in conflict with the following event(s): true 0 1 Qt::Horizontal 40 20 OK ConflictDialogContainer QWidget
conflictdialogcontainer.h
1
okButton clicked() ConflictsDialog close() 301 156 175 89
confclerk-0.6.4/src/gui/favtabcontainer.h0000664000175000017500000000216213212517317017660 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef FAVTABCONTAINER_H_ #define FAVTABCONTAINER_H_ #include "tabcontainer.h" class FavTabContainer: public TabContainer { Q_OBJECT public: FavTabContainer(QWidget *aParent); virtual ~FavTabContainer(){} protected: virtual void loadEvents( const QDate &aDate, const int aConferenceId ); }; #endif /* FAVTABCONTAINER_H_ */ confclerk-0.6.4/src/gui/daynavigatorwidget.ui0000664000175000017500000000311113212517317020567 0ustar gregoagregoa DayNavigatorWidget 0 0 31 138 0 0 Go to next day (Ctrl+Up) Ctrl+Up true Qt::UpArrow Go to previous day (Ctrl+Down) Ctrl+Down true Qt::DownArrow prevDayButtonClicked() nextDayButtonClicked() todayButtonClicked() confclerk-0.6.4/src/gui/favtabcontainer.cpp0000664000175000017500000000206713212517317020217 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "favtabcontainer.h" FavTabContainer::FavTabContainer(QWidget *aParent) : TabContainer( aParent ) { } void FavTabContainer::loadEvents( const QDate &aDate, const int aConferenceId ) { static_cast(treeView->model())->loadFavEvents( aDate, aConferenceId ); } confclerk-0.6.4/src/gui/settingsdialog.cpp0000664000175000017500000000452713212517317020074 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "settingsdialog.h" #include "appsettings.h" #include SettingsDialog::SettingsDialog(QWidget *aParent) : QDialog(aParent) { setupUi(this); connect(directConnection, SIGNAL(clicked(bool)), SLOT(connectionTypeChanged(bool))); } void SettingsDialog::loadDialogData() { // deserialize dialog data address->setText(AppSettings::proxyAddress()); port->setValue(AppSettings::proxyPort()); const QNetworkProxy::ProxyType proxyType = AppSettings::proxyType(); proxyTypeHTTP->setChecked(proxyType != QNetworkProxy::Socks5Proxy); // we enable QNetworkProxy::HttpProxy by default unless we have QNetworkProxy::Socks5Proxy proxyTypeSOCKS5->setChecked(proxyType == QNetworkProxy::Socks5Proxy); username->setText(AppSettings::proxyUsername()); password->setText(AppSettings::proxyPassword()); directConnection->setChecked(AppSettings::isDirectConnection()); proxyWidget->setDisabled(directConnection->isChecked()); } void SettingsDialog::saveDialogData() { // serialize dialog data AppSettings::setProxyAddress(address->text()); AppSettings::setProxyPort(port->value()); AppSettings::setProxyType(proxyTypeHTTP->isChecked() ? QNetworkProxy::HttpProxy : proxyTypeSOCKS5->isChecked() ? QNetworkProxy::Socks5Proxy : QNetworkProxy::DefaultProxy); AppSettings::setProxyUsername(username->text()); AppSettings::setProxyPassword(password->text()); AppSettings::setDirectConnection(directConnection->isChecked()); } void SettingsDialog::connectionTypeChanged(bool aState) { proxyWidget->setDisabled(aState); } confclerk-0.6.4/src/gui/conferenceeditor.ui0000664000175000017500000001750713212517317020227 0ustar gregoagregoa ConferenceEditor 0 0 596 267 Edit Conferences :/confclerk.svg:/confclerk.svg 0 0 0 :/icons/add.png:/icons/add.png 0 0 :/icons/remove.png:/icons/remove.png 10 0 0 false Qt::Horizontal 40 20 0 75 true Conference Name Qt::AlignCenter true Conference Subtitle Qt::AlignCenter true 75 true true When: 75 true true Where: DATE (FROM - TO) CITY, CAMPUS Reload from URL :/icons/reload.png:/icons/reload.png Change URL Qt::Horizontal 40 20 Qt::Vertical 20 40 QDialogButtonBox::Close confclerk-0.6.4/src/gui/searchhead.h0000664000175000017500000000240413212517317016600 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef SEARCHHEAD_H #define SEARCHHEAD_H #include "qglobal.h" #if QT_VERSION >= 0x050000 #include #else #include #endif #include #include "ui_searchhead.h" class SearchHead : public QWidget, public Ui::SearchHeadClass { Q_OBJECT public: SearchHead(QWidget *parent = 0); ~SearchHead(); signals: void searchClicked(); private slots: void searchButtonClicked(); //private: //Ui::SearchHeadClass ui; }; #endif // SEARCHHEAD_H confclerk-0.6.4/src/gui/trackstabcontainer.cpp0000664000175000017500000000211013212517317020717 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "trackstabcontainer.h" TracksTabContainer::TracksTabContainer( QWidget *aParent ) : TabContainer( aParent ) { } void TracksTabContainer::loadEvents( const QDate &aDate, const int aConferenceId ) { static_cast(treeView->model())->loadEventsByTrack( aDate, aConferenceId ); } confclerk-0.6.4/src/gui/daynavigatorwidget.cpp0000664000175000017500000000737713212517317020756 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "daynavigatorwidget.h" #include #include DayNavigatorWidget::DayNavigatorWidget(QWidget *aParent): QWidget(aParent) { setupUi(this); connect(prevDayButton, SIGNAL(clicked()), SLOT(prevDayButtonClicked())); connect(nextDayButton, SIGNAL(clicked()), SLOT(nextDayButtonClicked())); configureNavigation(); } void DayNavigatorWidget::setDates(const QDate &aStartDate, const QDate &aEndDate) { Q_ASSERT(aStartDate.isValid() && aEndDate.isValid() && aStartDate<=aEndDate); mStartDate = aStartDate; mEndDate = aEndDate; if (!mCurDate.isValid()) mCurDate = mStartDate; // if mCurDate is out of range, set it to mstartDate else if (mCurDate < mStartDate || mCurDate > mEndDate) mCurDate = mStartDate; configureNavigation(); emit(dateChanged(mCurDate)); this->update(); } void DayNavigatorWidget::setCurDate(const QDate& curDate) { Q_ASSERT(curDate.isValid()); if (curDate == mCurDate) return; if (!mStartDate.isValid()) { // the start and end date have not been set mStartDate = curDate; mEndDate = curDate; mCurDate = curDate; } else if (curDate < mStartDate) mCurDate = mStartDate; else if (curDate > mEndDate) mCurDate = mEndDate; else mCurDate = curDate; configureNavigation(); emit(dateChanged(mCurDate)); this->update(); } void DayNavigatorWidget::unsetDates() { mStartDate= QDate(); mEndDate = QDate(); mCurDate = QDate(); configureNavigation(); emit(dateChanged(mCurDate)); this->update(); } void DayNavigatorWidget::configureNavigation() { prevDayButton->setDisabled(!mStartDate.isValid() || mCurDate == mStartDate); nextDayButton->setDisabled(!mEndDate.isValid() || mCurDate == mEndDate); } void DayNavigatorWidget::prevDayButtonClicked() { if(mCurDate <= mStartDate) return; mCurDate = mCurDate.addDays(-1); configureNavigation(); emit(dateChanged(mCurDate)); this->update(); } void DayNavigatorWidget::nextDayButtonClicked() { if(mCurDate >= mEndDate) return; mCurDate = mCurDate.addDays(1); configureNavigation(); emit(dateChanged(mCurDate)); this->update(); } void DayNavigatorWidget::paintEvent(QPaintEvent *aEvent) { Q_UNUSED(aEvent); QString selectedDateStr = mCurDate.isValid() ? mCurDate.toString("dddd\nyyyy-MM-dd") : tr("No date"); QPainter painter(this); painter.save(); // rectangle only for the text QRect q(-selectedDate->height()-selectedDate->y(), selectedDate->x(), selectedDate->height(), selectedDate->width()); painter.rotate(270); // font size adjustion, static on maemo, dynamically otherwise QFont f = painter.font(); #ifdef MAEMO qreal factor = 0.8; #else qreal factor = (qreal) 2 * q.width() / painter.fontMetrics().width(selectedDateStr); #endif if (factor < 1) f.setPointSizeF(f.pointSizeF() * factor); painter.setFont(f); painter.drawText(q, Qt::AlignCenter, selectedDateStr); painter.restore(); } confclerk-0.6.4/src/gui/conflictsdialog.cpp0000664000175000017500000000245713212517317020220 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "conflictsdialog.h" ConflictsDialog::ConflictsDialog(int aEventId, int aConferenceId, QWidget *aParent) : QDialog(aParent) { setupUi(this); connect(container, SIGNAL(eventChanged(int,bool)), this, SIGNAL(eventChanged(int,bool))); connect(container, SIGNAL(eventChanged(int,bool)), container, SLOT(loadEvents())); container->setEventId(aEventId, aConferenceId); } ConflictsDialog::~ConflictsDialog() { disconnect(container, SIGNAL(eventChanged(int,bool)), this, SIGNAL(eventChanged(int,bool))); } confclerk-0.6.4/src/gui/trackstabcontainer.h0000664000175000017500000000221013212517317020365 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef TRACKSTABCONTAINER_H_ #define TRACKSTABCONTAINER_H_ #include "tabcontainer.h" class TracksTabContainer: public TabContainer { Q_OBJECT public: TracksTabContainer( QWidget *aParent ); virtual ~TracksTabContainer() {} protected: virtual void loadEvents( const QDate &aDate, const int aConferenceId ); }; #endif /* TRACKSTABCONTAINER_H_ */ confclerk-0.6.4/src/gui/settingsdialog.h0000664000175000017500000000226213212517317017533 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef SETTINGSDIALOG_H #define SETTINGSDIALOG_H #include #include "ui_settingsdialog.h" class SettingsDialog : public QDialog, Ui::SettingsDialog { Q_OBJECT public: SettingsDialog(QWidget *aParent = NULL); ~SettingsDialog() {} void loadDialogData(); void saveDialogData(); private slots: void connectionTypeChanged(bool aState); }; #endif /* PROXYSETTINGSDIALOG_H */ confclerk-0.6.4/src/gui/conflictdialogcontainer.h0000664000175000017500000000255413212517317021403 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef CONFLICTDIALOGCONTAINER_H #define CONFLICTDIALOGCONTAINER_H #include "tabcontainer.h" class ConflictDialogContainer: public TabContainer { Q_OBJECT public: ConflictDialogContainer(QWidget *aParent); virtual ~ConflictDialogContainer() {} public slots: void setEventId(int aEventId, int conferenceId); void loadEvents(); // update the conflicts protected: virtual void loadEvents(const QDate &aDate, const int aConferenceId); // the date and conference are ignored private: int mEventId; int mConferenceId; }; #endif /* CONFLICTDIALOGCONTAINER_H */ confclerk-0.6.4/src/gui/conflictsdialog.h0000664000175000017500000000224613212517317017661 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef CONFLICTSDIALOG_H #define CONFLICTSDIALOG_H #include "ui_conflictsdialog.h" #include class ConflictsDialog : public QDialog, Ui::ConflictsDialog { Q_OBJECT public: ConflictsDialog(int aEventId, int aConferenceId, QWidget *aParent = NULL); ~ConflictsDialog(); signals: void eventChanged(int aEventId, bool favouriteChanged); }; #endif /* CONFLICTSDIALOG_H */ confclerk-0.6.4/src/gui/eventdialog.ui0000664000175000017500000000560413212517317017205 0ustar gregoagregoa EventDialog 0 0 539 404 0 0 Details false true ... :/icons/alarm-off.png:/icons/alarm-off.png 32 32 CapsLock ... :/icons/favourite-no.png:/icons/favourite-no.png 32 32 Qt::Horizontal 40 20 OK okButton clicked() EventDialog close() 287 84 169 53 confclerk-0.6.4/src/gui/tabcontainer.cpp0000664000175000017500000000637613212517317017531 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "tabcontainer.h" #include #include #include #include "treeview.h" #include "delegate.h" #include "eventdialog.h" #include "room.h" #include "errormessage.h" #include "conflictsdialog.h" TabContainer::TabContainer(QWidget *aParent) : QWidget(aParent) { setupUi(this); treeView->setHeaderHidden(true); treeView->setRootIsDecorated(false); treeView->setIndentation(0); treeView->setAnimated(true); treeView->setModel(new EventModel()); treeView->setItemDelegate(new Delegate(treeView)); connect(treeView, SIGNAL(eventChanged(int,bool)), SIGNAL(eventChanged(int,bool))); connect(treeView, SIGNAL(clicked(const QModelIndex &)), SLOT(itemClicked(const QModelIndex &))); connect(treeView, SIGNAL(requestForConflicts(const QModelIndex &)), SLOT(displayConflicts(const QModelIndex &))); } void TabContainer::updateTreeView(const QDate &aDate) { int active_id = Conference::activeConference(); if (active_id > 0) { loadEvents(aDate, active_id); } else { static_cast(treeView->model())->clearModel(); } } void TabContainer::itemClicked(const QModelIndex &aIndex) { // have to handle only events, not time-groups if(!aIndex.parent().isValid()) // time-group return; EventDialog dialog(Conference::activeConference(), static_cast(aIndex.internalPointer())->id(),this); #ifdef N810 dialog.setFixedWidth(static_cast(parent())->width()); #endif connect(&dialog, SIGNAL(eventChanged(int,bool)), this, SIGNAL(eventChanged(int,bool))); dialog.exec(); disconnect(&dialog, SIGNAL(eventChanged(int,bool)), this, SIGNAL(eventChanged(int,bool))); } void TabContainer::displayConflicts(const QModelIndex &aIndex) { Event* event = static_cast(aIndex.internalPointer()); ConflictsDialog dialog(event->id(), event->conferenceId(), this); #ifdef N810 dialog.setFixedWidth(static_cast(parent())->width()); #endif connect(&dialog, SIGNAL(eventChanged(int,bool)), this, SIGNAL(eventChanged(int,bool))); dialog.exec(); disconnect(&dialog, SIGNAL(eventChanged(int,bool)), this, SIGNAL(eventChanged(int,bool))); } void TabContainer::redisplayEvent(int aEventId) { static_cast(treeView->model())->updateModel(aEventId); } void TabContainer::redisplayDate(const QDate& curDate) { updateTreeView(curDate); } void TabContainer::clearModel() { static_cast(treeView->model())->clearModel(); } confclerk-0.6.4/src/gui/gui.pro0000664000175000017500000000372313212517317015653 0ustar gregoagregoainclude(../global.pri) TEMPLATE = lib TARGET = gui DESTDIR = ../bin CONFIG += static QT += sql \ xml \ network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets QMAKE_CLEAN += ../bin/libgui.a # module dependencies LIBS += -L$$DESTDIR \ -lmvc \ -lorm \ -lsql INCLUDEPATH += ../orm \ ../mvc \ ../sql \ ../app DEPENDPATH += . \ ../orm \ ../mvc \ ../sql POST_TARGETDEPS += $$DESTDIR/liborm.a \ $$DESTDIR/libmvc.a \ $$DESTDIR/libsql.a maemo { LIBS += -L$$DESTDIR \ -lqalarm INCLUDEPATH += ../alarm DEPENDPATH += ../alarm POST_TARGETDEPS += $$DESTDIR/libqalarm.a } # A shamelessly long list of sources, headers and forms. # Please note that resources MUST be added to the app module # (which means they need to be added to the test module as well, # but I am sure you can live with that for the time being). FORMS += searchhead.ui \ mainwindow.ui \ daynavigatorwidget.ui \ about.ui \ eventdialog.ui \ conflictsdialog.ui \ tabcontainer.ui \ settingsdialog.ui \ conferenceeditor.ui \ urlinputdialog.ui HEADERS += roomstabcontainer.h \ trackstabcontainer.h \ favtabcontainer.h \ searchtabcontainer.h \ searchhead.h \ dayviewtabcontainer.h \ conflictdialogcontainer.h \ conflictsdialog.h \ mainwindow.h \ daynavigatorwidget.h \ eventdialog.h \ tabcontainer.h \ settingsdialog.h \ conferenceeditor.h \ urlinputdialog.h SOURCES += roomstabcontainer.cpp \ trackstabcontainer.cpp \ favtabcontainer.cpp \ searchtabcontainer.cpp \ searchhead.cpp \ dayviewtabcontainer.cpp \ conflictdialogcontainer.cpp \ conflictsdialog.cpp \ mainwindow.cpp \ daynavigatorwidget.cpp \ eventdialog.cpp \ tabcontainer.cpp \ settingsdialog.cpp \ conferenceeditor.cpp \ urlinputdialog.cpp HEADERS += errormessage.h SOURCES += errormessage.cpp CONFIG(maemo5) { QT += maemo5 } OTHER_FILES += \ test.qml confclerk-0.6.4/src/gui/roomstabcontainer.cpp0000664000175000017500000000210313212517317020571 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "roomstabcontainer.h" RoomsTabContainer::RoomsTabContainer( QWidget *aParent ) : TabContainer( aParent ) { } void RoomsTabContainer::loadEvents( const QDate &aDate, const int aConferenceId ) { static_cast(treeView->model())->loadEventsByRoom( aDate, aConferenceId ); } confclerk-0.6.4/src/gui/errormessage.cpp0000664000175000017500000000245013212517317017543 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "errormessage.h" #include #include #ifdef QT_MAEMO5_LIB #include #else #include #endif void error_message(const QString& message) { #ifdef QT_MAEMO5_LIB // by default the message is white on yellow, which is unusable // but some html here works // remove it as soon as they fix the colors QMaemo5InformationBox::information(0, "" + message + ""); #else QMessageBox::warning(0, "Error", message); #endif } confclerk-0.6.4/src/gui/tabcontainer.ui0000664000175000017500000000255613212517317017360 0ustar gregoagregoa TabContainer 0 0 568 292 0 0 Form 0 0 1 Qt::ScrollBarAlwaysOn TreeView QTreeView
../mvc/treeview.h
confclerk-0.6.4/src/gui/tabcontainer.h0000664000175000017500000000315013212517317017161 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef TABCONTAINER_H #define TABCONTAINER_H #include #include "ui_tabcontainer.h" #include "conference.h" #include "sqlengine.h" #include "conference.h" #include "eventmodel.h" class TabContainer : public QWidget, public Ui::TabContainer { Q_OBJECT public: TabContainer(QWidget *aParent = NULL); virtual ~TabContainer() {} void clearModel(); protected: virtual void loadEvents( const QDate &aDate, const int aConferenceId ) = 0; signals: void eventChanged(int aEventId, bool aReloadModel); public slots: virtual void redisplayEvent(int aEventId); void redisplayDate(const QDate& curDate); protected slots: virtual void updateTreeView(const QDate &aDate); void itemClicked(const QModelIndex &aIndex); void displayConflicts(const QModelIndex &aIndex); }; #endif /* TABCONTAINER_H */ confclerk-0.6.4/src/gui/settingsdialog.ui0000664000175000017500000001227513212517317017726 0ustar gregoagregoa SettingsDialog 0 0 500 168 0 0 500 0 Settings Proxy settings Direct connection true Address: Port: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 65535 8080 Proxy type: HTTP proxy SOCKS5 proxy Optional: Username: Password: QLineEdit::Password Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() SettingsDialog accept() 288 128 325 147 buttonBox rejected() SettingsDialog reject() 202 130 226 147 confclerk-0.6.4/src/gui/dayviewtabcontainer.cpp0000664000175000017500000000371513212517317021114 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "dayviewtabcontainer.h" DayViewTabContainer::DayViewTabContainer(QWidget *aParent): TabContainer(aParent) { } void DayViewTabContainer::expandTimeGroup(QTime time, int conferenceId) { EventModel* eventModel = static_cast(treeView->model()); // iterate over the time groups for (int g = 0; g != eventModel->rowCount(); ++g) { QModelIndex groupIdx = eventModel->index(g, 0); // iterate over the events in the group for (int e = 0; e != eventModel->rowCount(groupIdx); ++e) { QModelIndex eventIdx = eventModel->index(e, 0, groupIdx); int eventId = eventIdx.data().toInt(); Event event = Event::getById(eventId, conferenceId); if (time < event.start().time().addSecs(event.duration())) { // if time < end // expand this group treeView->expand(groupIdx); treeView->scrollTo(eventIdx, QAbstractItemView::PositionAtTop); return; } } } } void DayViewTabContainer::loadEvents( const QDate &aDate, const int aConferenceId ) { static_cast(treeView->model())->loadEvents( aDate, aConferenceId ); } confclerk-0.6.4/src/gui/roomstabcontainer.h0000664000175000017500000000220213212517317020236 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef ROOMSTABCONTAINER_H_ #define ROOMSTABCONTAINER_H_ #include "tabcontainer.h" class RoomsTabContainer: public TabContainer { Q_OBJECT public: RoomsTabContainer( QWidget *aParent ); virtual ~RoomsTabContainer() {} protected: virtual void loadEvents( const QDate &aDate, const int aConferenceId ); }; #endif /* ROOMSTABCONTAINER_H_ */ confclerk-0.6.4/src/gui/searchhead.ui0000664000175000017500000000720613212517317016773 0ustar gregoagregoa SearchHeadClass 0 0 371 153 0 0 10 10 SearchHead Title true Abstract Speaker true Tag Room true type a keyword to search 0 0 Search :/icons/search.png:/icons/search.png false true true false Qt::Vertical 20 20 searchButton searchEdit searchTag searchRoom confclerk-0.6.4/src/gui/eventdialog.h0000664000175000017500000000260613212517317017016 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef EVENTDIALOG_H #define EVENTDIALOG_H #include #include "ui_eventdialog.h" #include "event.h" class EventDialog : public QDialog, Ui::EventDialog { Q_OBJECT public: EventDialog(int conferencdId, int eventId, QWidget *parent = 0); ~EventDialog() {} private slots: void favouriteClicked(); void alarmClicked(); signals: void eventChanged(int aEventId, bool favouriteChanged); // emited when user changes some event details, eg. sets it Favourite private: int mConferenceId; int mEventId; void updateFavouriteButton(const Event& event); }; #endif /* EVENTDIALOG_H */ confclerk-0.6.4/src/gui/urlinputdialog.h0000664000175000017500000000247013212517317017556 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef URL_INPUT_DIALOG_H #define URL_INPUT_DIALOG_H #include "ui_urlinputdialog.h" class UrlInputDialog : public QDialog, private Ui::UrlInputDialog { Q_OBJECT public: enum { Cancel, HaveUrl, HaveFile }; UrlInputDialog(QWidget* parent); virtual ~UrlInputDialog() { } QString url() { return saved_result; } private slots: void acceptClicked(); void rejectClicked(); void openFileClicked(); void textChanged(const QString& text); private: QString saved_result; }; #endif confclerk-0.6.4/src/gui/mainwindow.h0000664000175000017500000000537613212517317016700 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include "qglobal.h" #if QT_VERSION >= 0x050000 #include #else #include #endif #include #include "ui_mainwindow.h" #include "conferencemodel.h" class ScheduleXmlParser; class QNetworkAccessManager; class QNetworkReply; class MainWindow : public QMainWindow, private Ui::MainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); signals: void conferenceRemoved(); private slots: void on_conferencesAction_triggered(); void on_settingsAction_triggered(); void on_aboutAction_triggered(); void on_reloadAction_triggered(); void on_nowAction_triggered(); void on_searchAction_triggered(); void on_expandAllAction_triggered(); void on_collapseAllAction_triggered(); void onEventChanged(int aEventId, bool favouriteChanged); void onSearchResultChanged(); void sslErrors(QNetworkReply*,const QList &errors); void networkQueryFinished(QNetworkReply*); void importFromNetwork(const QString&, int conferenceId); void importFromFile(const QString&, int conferenceId); void removeConference(int); void changeConferenceUrl(int, const QString&); void onSystemTrayMessageClicked(); void onAlarmTimerTimeout(); void useConference(int conferenceId); void unsetConference(); void showError(const QString& message); private: void fillAndShowConferenceHeader(); void initTabs(); ///< called on startup and on change of a conference void clearTabs(); void importData(const QByteArray &aData, const QString& url, int conferenceId); QString saved_title; SqlEngine* sqlEngine; ConferenceModel* conferenceModel; ScheduleXmlParser *mXmlParser; QNetworkAccessManager *mNetworkAccessManager; QSystemTrayIcon* systemTrayIcon; ///< to be able to show notifications QTimer* alarmTimer; ///< timer that triggers every minute to be able to show alarms }; #endif /* MAINWINDOW_H */ confclerk-0.6.4/src/gui/mainwindow.ui0000664000175000017500000002077113212517317017062 0ustar gregoagregoa MainWindow 0 0 903 498 400 300 ConfClerk :/confclerk.svg:/confclerk.svg 20 0 1 Qt::ElideRight &Favourites &Day &Tracks &Rooms &Search 0 0 0 0 903 22 Qt::LeftToRight toolBar false RightToolBarArea false C&onferences Manage Conferences (Ctrl+O) Ctrl+O S&ettings Ctrl+E &About &Quit Quit (Ctrl+Q) Ctrl+Q :/icons/reload.png:/icons/reload.png Reload Conference Reload Conference (Ctrl+R) Ctrl+R :/icons/today.png:/icons/today.png Jump to now Jump to now (Ctrl+N) Ctrl+N :/icons/search.png:/icons/search.png &Search Search (Ctrl+F) Ctrl+F :/icons/expand.png:/icons/expand.png Expand all Expand all (Ctrl++) Ctrl++ :/icons/collapse.png:/icons/collapse.png Collapse all Collapse all (Ctrl+-) Ctrl+- SearchTabContainer QWidget
searchtabcontainer.h
DayViewTabContainer QWidget
dayviewtabcontainer.h
FavTabContainer QWidget
favtabcontainer.h
TracksTabContainer QWidget
trackstabcontainer.h
RoomsTabContainer QWidget
roomstabcontainer.h
DayNavigatorWidget QWidget
daynavigatorwidget.h
1
quitAction triggered() MainWindow close() -1 -1 451 248
confclerk-0.6.4/src/gui/mainwindow.cpp0000664000175000017500000004301313212517317017221 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "mainwindow.h" #include #include #include #include #include #include #include "sqlengine.h" #include "track.h" #include "eventmodel.h" #include "delegate.h" #include "room.h" #include "conference.h" #include #include #include "ui_about.h" #include "eventdialog.h" #include "daynavigatorwidget.h" #include "settingsdialog.h" #include "conferenceeditor.h" #include "schedulexmlparser.h" #include "errormessage.h" #include "tabcontainer.h" #include "appsettings.h" MainWindow::MainWindow(QWidget* parent): QMainWindow(parent) { setupUi(this); // Open database sqlEngine = new SqlEngine(this); searchTabContainer->setSqlEngine(sqlEngine); connect(sqlEngine, SIGNAL(dbError(QString)), this, SLOT(showError(QString))); sqlEngine->open(); sqlEngine->createOrUpdateDbSchema(); conferenceModel = new ConferenceModel(this); mXmlParser = new ScheduleXmlParser(sqlEngine, this); mNetworkAccessManager = new QNetworkAccessManager(this); systemTrayIcon = new QSystemTrayIcon(qApp->windowIcon(), this); alarmTimer = new QTimer(this); alarmTimer->setInterval(60000); alarmTimer->start(); saved_title = windowTitle(); #ifdef N810 tabWidget->setTabText(1,"Favs"); //tabWidget->setTabText(2,"Day"); #endif // first time run aplication: -> let's have it direct connection in this case if(!AppSettings::contains("proxyIsDirectConnection")) AppSettings::setDirectConnection(true); QNetworkProxy proxy( AppSettings::isDirectConnection() ? QNetworkProxy::NoProxy : (QNetworkProxy::ProxyType)AppSettings::proxyType(), AppSettings::proxyAddress(), AppSettings::proxyPort(), AppSettings::proxyUsername(), AppSettings::proxyPassword()); QNetworkProxy::setApplicationProxy(proxy); // event details have changed connect(dayTabContainer, SIGNAL(eventChanged(int,bool)), SLOT(onEventChanged(int,bool))); connect(favsTabContainer, SIGNAL(eventChanged(int,bool)), SLOT(onEventChanged(int,bool))); connect(tracksTabContainer, SIGNAL(eventChanged(int,bool)), SLOT(onEventChanged(int,bool))); connect(roomsTabContainer, SIGNAL(eventChanged(int,bool)), SLOT(onEventChanged(int,bool))); connect(searchTabContainer, SIGNAL(eventChanged(int,bool)), SLOT(onEventChanged(int,bool))); // date has changed connect(dayNavigator, SIGNAL(dateChanged(QDate)), dayTabContainer, SLOT(redisplayDate(QDate))); connect(dayNavigator, SIGNAL(dateChanged(QDate)), favsTabContainer, SLOT(redisplayDate(QDate))); connect(dayNavigator, SIGNAL(dateChanged(QDate)), tracksTabContainer, SLOT(redisplayDate(QDate))); connect(dayNavigator, SIGNAL(dateChanged(QDate)), roomsTabContainer, SLOT(redisplayDate(QDate))); connect(dayNavigator, SIGNAL(dateChanged(QDate)), searchTabContainer, SLOT(redisplayDate(QDate))); // search result has changed connect(searchTabContainer, SIGNAL(searchResultChanged()), SLOT(onSearchResultChanged())); // systm tray icon connect(systemTrayIcon, SIGNAL(messageClicked()), SLOT(onSystemTrayMessageClicked())); connect(systemTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(onSystemTrayMessageClicked())); // timer connect(alarmTimer, SIGNAL(timeout()), SLOT(onAlarmTimerTimeout())); // add the actions from the main menu to the window, otherwise the shortcuts don't work on MAEMO addAction(conferencesAction); addAction(settingsAction); addAction(quitAction); // make it impossible to hide the toolbar by disallowing its context menu toolBar->setContextMenuPolicy(Qt::PreventContextMenu); // open conference useConference(Conference::activeConference()); // optimization, see useConference() code try { initTabs(); } catch (const OrmException& e) { qDebug() << "OrmException:" << e.text(); clearTabs(); } connect(mNetworkAccessManager, SIGNAL(sslErrors(QNetworkReply*, QList)), SLOT(sslErrors(QNetworkReply*, QList))); connect(mNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), SLOT(networkQueryFinished(QNetworkReply*))); connect(mXmlParser, SIGNAL(parsingScheduleBegin()), conferenceModel, SLOT(newConferenceBegin())); connect(mXmlParser, SIGNAL(parsingScheduleEnd(int)), conferenceModel, SLOT(newConferenceEnd(int))); } MainWindow::~MainWindow() { sqlEngine->close(); } void MainWindow::on_aboutAction_triggered() { QDialog dialog(this); Ui::AboutDialog ui; ui.setupUi(&dialog); ui.labDescription->setText(ui.labDescription->text().arg(qApp->applicationVersion())); #ifdef N810 dialog.setFixedWidth(width()); #endif dialog.exec(); } void MainWindow::on_reloadAction_triggered() { int confId = Conference::activeConference(); if (confId== -1) return; Conference active = Conference::getById(confId); if (active.url().isEmpty()) return; importFromNetwork(active.url(), confId); setEnabled(false); } void MainWindow::on_nowAction_triggered() { int confId = Conference::activeConference(); if (confId== -1) return; dayNavigator->setCurDate(QDate::currentDate()); dayTabContainer->expandTimeGroup(QTime::currentTime(), confId); } void MainWindow::on_searchAction_triggered() { if (tabWidget->currentWidget() == searchTab) searchTabContainer->showSearchDialog(!searchTabContainer->searchDialogIsVisible()); else { tabWidget->setCurrentWidget(searchTab); searchTabContainer->showSearchDialog(); } } void MainWindow::on_expandAllAction_triggered() { if (tabWidget->currentWidget() == favouritesTab) favsTabContainer->treeView->expandAll(); if (tabWidget->currentWidget() == dayViewTab) dayTabContainer->treeView->expandAll(); if (tabWidget->currentWidget() == tracksTab) tracksTabContainer->treeView->expandAll(); if (tabWidget->currentWidget() == roomsTab) roomsTabContainer->treeView->expandAll(); if (tabWidget->currentWidget() == searchTab) searchTabContainer->treeView->expandAll(); } void MainWindow::on_collapseAllAction_triggered() { if (tabWidget->currentWidget() == favouritesTab) favsTabContainer->treeView->collapseAll(); if (tabWidget->currentWidget() == dayViewTab) dayTabContainer->treeView->collapseAll(); if (tabWidget->currentWidget() == tracksTab) tracksTabContainer->treeView->collapseAll(); if (tabWidget->currentWidget() == roomsTab) roomsTabContainer->treeView->collapseAll(); if (tabWidget->currentWidget() == searchTab) searchTabContainer->treeView->collapseAll(); } void MainWindow::onEventChanged(int aEventId, bool favouriteChanged) { dayTabContainer->redisplayEvent(aEventId); if (favouriteChanged) favsTabContainer->redisplayDate(dayNavigator->curDate()); else favsTabContainer->redisplayEvent(aEventId); tracksTabContainer->redisplayEvent(aEventId); roomsTabContainer->redisplayEvent(aEventId); searchTabContainer->redisplayEvent(aEventId); } void MainWindow::onSearchResultChanged() { // Are results found on the current date? QDate date = dayNavigator->curDate(); int count = searchTabContainer->searchResultCount(date); if (count > 0) {searchTabContainer->redisplayDate(date); return;} // Are results found in the future? for (date = date.addDays(1); date <= dayNavigator->endDate(); date = date.addDays(1)) { int count = searchTabContainer->searchResultCount(date); if (count > 0) {dayNavigator->setCurDate(date); return;} } // Are results found in the past? for (date = dayNavigator->startDate(); date < dayNavigator->curDate(); date = date.addDays(1)) { int count = searchTabContainer->searchResultCount(date); if (count > 0) {dayNavigator->setCurDate(date); return;} } // No results were found searchTabContainer->redisplayDate(dayNavigator->curDate()); } void MainWindow::onSystemTrayMessageClicked() { systemTrayIcon->hide(); } void MainWindow::onAlarmTimerTimeout() { // determine if an alarm is set on an event that's starting soon QList events = Event::getImminentAlarmEvents(AppSettings::preEventAlarmSec(), Conference::activeConference()); if (events.empty()) return; // build a message string Event event; QString title; QString message; if (events.size() == 1) { event = events.first(); title = tr("Next event at %1").arg(event.start().toString("HH:mm")); message = tr("\"%1\"\n(%2)").arg(event.title()).arg(event.room()->name()); } else { title = tr("%1 upcoming events").arg(events.size()); QStringList messages; foreach (event, events) { messages += tr("%1: \"%2\" (%3)").arg(event.start().toString("HH:mm")).arg(event.title()).arg(event.room()->name()); } message = messages.join("\n"); } // and delete the corresponding alarm foreach (event, events) { event.setHasAlarm(false); event.update("alarm"); onEventChanged(event.id(), false); } // show message systemTrayIcon->show(); // The next two lines are to prevent a very strange position of the message box the first time at X11/aweseome (not Win32/XP) systemTrayIcon->showMessage("ConfClerk", tr("Your upcoming events"), QSystemTrayIcon::Information); qApp->processEvents(); systemTrayIcon->showMessage(title, message, QSystemTrayIcon::Information, 60*60*24*1000); QApplication::alert(this); QApplication::beep(); } void MainWindow::useConference(int conferenceId) { if (conferenceId == -1) // in case no conference is active { unsetConference(); return; } try { int oldActiveConferenceId = Conference::activeConference(); bool switchActiveConference = conferenceId != oldActiveConferenceId; if (switchActiveConference) Conference::getById(oldActiveConferenceId).update("active", 0); Conference activeConference = Conference::getById(conferenceId); if (switchActiveConference) activeConference.update("active",1); // looks like it does not work at n900 setWindowTitle(activeConference.title()); // optimization. // dont run initTabs() here // it takes much CPU, making travelling between conferences in ConferenceEditor longer // and is not seen in maemo WM anyway // instead run it explicitly // 1. at startup // 2. when ConferenceEditor finished // dont forget to protect the calls by try-catch! // just in case, clear conference selection instead clearTabs(); // end of optimization // initTabs(); } catch (const OrmException& e) { qDebug() << "OrmException:" << e.text(); // cannon set an active conference unsetConference(); // TODO: as no active conference is now correctly managed this should be handled as a fatal error return; } } void MainWindow::initTabs() { int confId = Conference::activeConference(); if (confId != -1) // only init tabs if a conference is active { Conference active = Conference::getById(confId); QDate startDate = active.start(); QDate endDate = active.end(); // 'dayNavigator' emits signal 'dateChanged' after setting valid START:END dates dayNavigator->setDates(startDate, endDate); nowAction->trigger(); } } void MainWindow::clearTabs() { dayTabContainer->clearModel(); tracksTabContainer->clearModel(); roomsTabContainer->clearModel(); favsTabContainer->clearModel(); searchTabContainer->clearModel(); } void MainWindow::unsetConference() { clearTabs(); dayNavigator->unsetDates(); setWindowTitle(saved_title); } void MainWindow::showError(const QString& message) { error_message(message); } void MainWindow::on_settingsAction_triggered() { SettingsDialog dialog; dialog.loadDialogData(); if (dialog.exec() == QDialog::Accepted) { dialog.saveDialogData(); QNetworkProxy proxy( AppSettings::isDirectConnection() ? QNetworkProxy::NoProxy : (QNetworkProxy::ProxyType)AppSettings::proxyType(), AppSettings::proxyAddress(), AppSettings::proxyPort(), AppSettings::proxyUsername(), AppSettings::proxyPassword()); QNetworkProxy::setApplicationProxy(proxy); } } /** Create and run ConferenceEditor dialog, making required connections for it. This method manages, which classes actually perform changes in conference list. There are several classes that modify the conferences: this: deletion and URL update. this, mXmlParser and mNetworkAccessManager: addition and refresh. */ void MainWindow::on_conferencesAction_triggered() { ConferenceEditor dialog(conferenceModel, this); connect(&dialog, SIGNAL(haveConferenceUrl(const QString&, int)), SLOT(importFromNetwork(const QString&, int))); connect(&dialog, SIGNAL(haveConferenceFile(const QString&, int)), SLOT(importFromFile(const QString&, int))); connect(&dialog, SIGNAL(removeConferenceRequested(int)), SLOT(removeConference(int))); connect(&dialog, SIGNAL(changeUrlRequested(int, const QString&)), SLOT(changeConferenceUrl(int, const QString&))); connect(&dialog, SIGNAL(haveConferenceSelected(int)), SLOT(useConference(int))); connect(&dialog, SIGNAL(noneConferenceSelected()), SLOT(unsetConference())); connect(mXmlParser, SIGNAL(parsingScheduleBegin()), &dialog, SLOT(importStarted())); connect(mXmlParser, SIGNAL(progressStatus(int)), &dialog, SLOT(showParsingProgress(int))); connect(mXmlParser, SIGNAL(parsingScheduleEnd(int)), &dialog, SLOT(importFinished(int))); connect(this, SIGNAL(conferenceRemoved()), &dialog, SLOT(conferenceRemoved())); dialog.exec(); // optimization, see useConference() code try { initTabs(); } catch (const OrmException& e) { qDebug() << "OrmException:" << e.text(); clearTabs(); } } void MainWindow::sslErrors(QNetworkReply *aReply, const QList &errors) { QString errorString; foreach (const QSslError &error, errors) { if (!errorString.isEmpty()) { errorString += ", "; } errorString += error.errorString(); } if (QMessageBox::warning( this, tr("SSL errors"), tr("One or more SSL errors have occurred: %1", 0, errors.size()).arg(errorString), QMessageBox::Ignore | QMessageBox::Cancel) == QMessageBox::Ignore) { aReply->ignoreSslErrors(); } else { aReply->abort(); } } void MainWindow::networkQueryFinished(QNetworkReply *aReply) { if (aReply->error() != QNetworkReply::NoError) { error_message(tr("Error occurred during download: %1").arg(aReply->errorString())); } else { QUrl redirectUrl = aReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (!redirectUrl.isEmpty()) { if (redirectUrl != aReply->request().url()) { importFromNetwork(redirectUrl.toString(), aReply->request().attribute(QNetworkRequest::User).toInt()); return; // don't enable controls } else { error_message(tr("Error: Cyclic redirection from %1 to itself.").arg(redirectUrl.toString())); } } else { importData(aReply->readAll(), aReply->url().toEncoded(), aReply->request().attribute(QNetworkRequest::User).toInt()); } } setEnabled(true); } void MainWindow::importData(const QByteArray &aData, const QString& url, int conferenceId) { mXmlParser->parseData(aData, url, conferenceId); } void MainWindow::importFromNetwork(const QString& url, int conferenceId) { QNetworkRequest request; QSslConfiguration qSslConfiguration = request.sslConfiguration(); qSslConfiguration.setProtocol(QSsl::AnyProtocol); qSslConfiguration.setPeerVerifyMode(QSslSocket::QueryPeer); request.setUrl(QUrl(url)); request.setSslConfiguration(qSslConfiguration); request.setAttribute(QNetworkRequest::User, conferenceId); mNetworkAccessManager->setProxy(QNetworkProxy::applicationProxy()); mNetworkAccessManager->get(request); } void MainWindow::importFromFile(const QString& filename, int conferenceId) { QFile file(filename); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { static const QString format("Cannot read \"%1\": error %2"); error_message(format.arg(filename, QString::number(file.error()))); } importData(file.readAll(), "", conferenceId); } void MainWindow::removeConference(int id) { sqlEngine->deleteConference(id); conferenceModel->conferenceRemoved(); emit conferenceRemoved(); } void MainWindow::changeConferenceUrl(int id, const QString& url) { Conference::getById(id).setUrl(url); } confclerk-0.6.4/src/gui/daynavigatorwidget.h0000664000175000017500000000377313212517317020417 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef DAYNAVIGATORWIDGET_H #define DAYNAVIGATORWIDGET_H #include "ui_daynavigatorwidget.h" #include #include /** The DayNavigator widget manages three dates, the startDate, curDate and endDate. Either startDate, curDate and endDate all have to be valid and startDate <= curDate <= endDate, OR all three dates are invalid (representing "no date range", e.g. no conference). */ class DayNavigatorWidget : public QWidget, private Ui::DayNavigatorWidget { Q_OBJECT public: DayNavigatorWidget(QWidget *aParent = NULL); ~DayNavigatorWidget() {} void setDates(const QDate &aStartDate, const QDate &aEndDate); void setCurDate(const QDate& curDate); QDate startDate() const {return mStartDate;} QDate curDate() const {return mCurDate;} QDate endDate() const {return mEndDate;} void unsetDates(); protected: void paintEvent(QPaintEvent *); void configureNavigation(); private slots: void prevDayButtonClicked(); void nextDayButtonClicked(); signals: void dateChanged(const QDate &aDate); private: QDate mStartDate; QDate mEndDate; QDate mCurDate; }; #endif /* DAYNAVIGATORWIDGET_H */ confclerk-0.6.4/src/gui/searchtabcontainer.h0000664000175000017500000000321513212517317020351 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef SEARCHTAB_H_ #define SEARCHTAB_H_ #include #include "tabcontainer.h" #include "searchhead.h" #include "sqlengine.h" class SearchTabContainer: public TabContainer { Q_OBJECT private: SqlEngine* sqlEngine; public: SearchTabContainer(QWidget *aParent); virtual ~SearchTabContainer() {} void setSqlEngine(SqlEngine* sqlEngine) {this->sqlEngine = sqlEngine;} bool searchDialogIsVisible() const; int searchResultCount(const QDate& date) const; ///< returns the number of events found on that specific date protected: virtual void loadEvents( const QDate &aDate, const int aConferenceId ); signals: void searchResultChanged(); public slots: void showSearchDialog(bool show=true); private slots: void searchButtonClicked(); private: SearchHead *header; QToolButton *searchAgainButton; }; #endif /* SEARCHTAB_H_ */ confclerk-0.6.4/src/gui/about.ui0000664000175000017500000002140413212517317016012 0ustar gregoagregoa AboutDialog Qt::WindowModal 0 0 460 570 0 0 77 77 500 1000 239 235 231 239 235 231 239 235 231 239 235 231 255 255 255 239 235 231 About application Qt::ScrollBarAlwaysOff true 0 0 438 517 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:8pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/confclerk.svg" width="77" style="float: right;" /></p> <p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:xx-large; font-weight:600;">ConfClerk</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Successor of FOSDEM schedule<br /></span>Version %1</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://www.toastfreeware.priv.at/confclerk/"><span style=" text-decoration: underline; color:#0057ae;">http://www.toastfreeware.priv.at/confclerk/</span></a></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ConfClerk is an application written in Qt, which makes conference schedules available offline. It displays the conference schedule from various views, supports searches on various items (speaker, speech topic, location, etc.) and enables you to select favorite events and create your own schedule. At the moment ConfClerk is able to import schedules in XML format created by the PentaBarf conference management system used by e.g. FOSDEM, DebConf, FrOSCon, and the CCC.</p> <p style=" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:x-large; font-weight:600;">Developers</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Berendova Monika, Hanzes Matus, Komara Martin, Korinek Pavol, Pavelka Pavol, Timko Marek, Uzak Matus, Fortes Francisco, Philipp Spitzer, gregor herrmann</p> <p style=" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:x-large; font-weight:600;">Copyright and license</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ConfClerk is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ConfClerk is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2010 Ixonos Plc.<br />Copyright (C) 2011-2017 Philipp Spitzer &amp; gregor herrmann &amp; Stefan Strahl</p></body></html> Qt::RichText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true true Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse Qt::Horizontal 40 20 OK okButton clicked() AboutDialog close() 512 724 282 375 confclerk-0.6.4/src/gui/eventdialog.cpp0000664000175000017500000001302513212517317017346 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "eventdialog.h" #include "conference.h" #include #ifdef MAEMO #include "alarm.h" #include "appsettings.h" #endif QString toHtmlEscaped(const QString& string) { #if QT_VERSION >= 0x050000 return string.toHtmlEscaped(); #else return Qt::escape(string); #endif } EventDialog::EventDialog(int conferenceId, int eventId, QWidget *parent): QDialog(parent), mConferenceId(conferenceId), mEventId(eventId) { setupUi(this); #ifdef MAEMO showFullScreen(); #endif Event event = Event::getById(mEventId, mConferenceId); QString info; // title info.append(QString("

%1

\n").arg(toHtmlEscaped(event.title()))); // persons info += QString("

%1

\n").arg(tr("Persons")); QStringList persons = event.persons(); for (int i = 0; i != persons.size(); ++i) persons[i] = toHtmlEscaped(persons[i]); info += QString("

%1

\n").arg(persons.join(", ")); // abstract info += QString("

%1

\n").arg(tr("Abstract")); if (Qt::mightBeRichText(event.abstract())) { info += event.abstract(); } else { info += Qt::convertFromPlainText(event.abstract(), Qt::WhiteSpaceNormal); } // description info += QString("

%1

\n").arg(tr("Description")); if (Qt::mightBeRichText(event.description())) { info += event.description(); } else { QString description = Qt::convertFromPlainText(event.description(), Qt::WhiteSpaceNormal); // make links clickable QRegExp rx("()]*[^][{}\\s\"<>().,:!])?/?)>?"); info += description.replace(rx, "\\1"); } // links info += QString("

%1

\n
    \n").arg(tr("Links")); QMapIterator i(event.links()); while (i.hasNext()) { i.next(); QString url(i.value()); QString name(i.key()); if (url.isEmpty() || url == "http://") continue; if (name.isEmpty()) name = url; info += QString("
  • %2
  • \n").arg(toHtmlEscaped(url), toHtmlEscaped(name)); } info += QString("
\n"); eventInfoTextBrowser->setHtml(info); // make sure colours are the same as usual eventInfoTextBrowser->setPalette(qApp->palette()); // reduce font size, on maemo #ifdef MAEMO QFont font = eventInfoTextBrowser->font(); font.setPointSizeF(font.pointSizeF()*0.8); eventInfoTextBrowser->setFont(font); #endif connect(favouriteButton, SIGNAL(clicked()), SLOT(favouriteClicked())); connect(alarmButton, SIGNAL(clicked()), SLOT(alarmClicked())); updateFavouriteButton(event); if(event.hasAlarm()) { alarmButton->setIcon(QIcon(":/icons/alarm-on.png")); } } void EventDialog::favouriteClicked() { Event event = Event::getById(mEventId, mConferenceId); event.cycleFavourite(); event.update("favourite"); updateFavouriteButton(event); // 'conflicts' list may have changed QList conflicts = Event::conflictEvents(event.id(), mConferenceId); // have to emit 'eventChanged' signal on all events in conflict for(int i=0; isetIcon(QIcon(":/icons/alarm-off.png")); #ifdef MAEMO // remove alarm from the 'alarmd' alarms list Alarm alarm; alarm.deleteAlarm(event.conferenceId(), event.id()); // TODO: test if removing was successfull #endif /* MAEMO */ } else { event.setHasAlarm(true); alarmButton->setIcon(QIcon(":/icons/alarm-on.png")); #ifdef MAEMO // add alarm to the 'alarmd' Alarm alarm; alarm.addAlarm(event.conferenceId(), event.id(), event.title(), event.start().addSecs(-AppSettings::preEventAlarmSec())); #endif /* MAEMO */ } event.update("alarm"); // since the Alarm icon has changed, update TreeView accordingly // all TreeViews have to listen on this signal emit eventChanged(event.id(), false); } void EventDialog::updateFavouriteButton(const Event& event) { switch (event.favourite()) { case Favourite_no: favouriteButton->setIcon(QIcon(":/icons/favourite-no.png")); break; case Favourite_weak: favouriteButton->setIcon(QIcon(":/icons/favourite-weak.png")); break; case Favourite_strong: favouriteButton->setIcon(QIcon(":/icons/favourite-strong.png")); break; } } confclerk-0.6.4/src/gui/conferenceeditor.h0000664000175000017500000000455013212517317020033 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef CONFERENCE_EDITOR_H #define CONFERENCE_EDITOR_H #include "ui_conferenceeditor.h" #include class ConferenceModel; /** ConferenceEditor clas is used for managing list of conferences. That is, selecting an active conference, adding a new conference from URL or file, removing a conference, refreshing a conference from URL that is saved in the DB. It does not do anything of this itself, instead emitting controlling signals. On the ConferenceEditor creation, they are connected to proper listeners. \see MainWindow::showConferences() */ class ConferenceEditor : public QDialog, private Ui::ConferenceEditor { Q_OBJECT public: ConferenceEditor(ConferenceModel* model, QWidget* parent); virtual ~ConferenceEditor() { } signals: void haveConferenceSelected(int id); void noneConferenceSelected(); void haveConferenceUrl(const QString& url, int conferenceId); void haveConferenceFile(const QString& path, int conferenceId); void removeConferenceRequested(int id); void changeUrlRequested(int, const QString&); void wantCurrent(const QModelIndex&, QItemSelectionModel::SelectionFlags); public slots: void importStarted(); void importFinished(int conferenceId); void conferenceRemoved(); void showParsingProgress(int); private slots: void itemSelected(const QModelIndex& current, const QModelIndex& previous); void addClicked(); void removeClicked(); void changeUrlClicked(); void refreshClicked(); private: ConferenceModel* model; int selected_id; QString import_in_progress_title; }; #endif confclerk-0.6.4/src/gui/urlinputdialog.ui0000664000175000017500000000326613212517317017750 0ustar gregoagregoa UrlInputDialog 0 0 URL Input Enter schedule URL Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Open buttons accepted() UrlInputDialog accept() 248 254 157 274 buttons rejected() UrlInputDialog reject() 316 260 286 274 confclerk-0.6.4/src/gui/errormessage.h0000664000175000017500000000162013212517317017206 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef ERRORMESSAGE_H #define ERRORMESSAGE_H #include void error_message(const QString& message); #endif confclerk-0.6.4/src/gui/searchtabcontainer.cpp0000664000175000017500000000732113212517317020706 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "searchtabcontainer.h" #include "searchhead.h" #include SearchTabContainer::SearchTabContainer(QWidget *aParent): TabContainer(aParent), sqlEngine(0) { header = new SearchHead(this); header->setObjectName(QString::fromUtf8("header")); QSizePolicy sizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); //sizePolicy.setHeightForWidth(TabContainer::sizePolicy().hasHeightForWidth()); sizePolicy.setHeightForWidth(header->sizePolicy().hasHeightForWidth()); header->setSizePolicy(sizePolicy); header->setMinimumSize(QSize(10, 10)); verticalLayout->insertWidget(0,header); connect(header, SIGNAL(searchClicked()), SLOT(searchButtonClicked())); showSearchDialog(); } bool SearchTabContainer::searchDialogIsVisible() const { return header->isVisible(); } int SearchTabContainer::searchResultCount(const QDate& date) const { int confId = Conference::activeConference(); if (confId == -1) return 0; return Event::getSearchResultByDate(date, confId, "start, duration").count(); } void SearchTabContainer::showSearchDialog(bool show) { header->setVisible(show); treeView->setVisible(!show); if (show) header->searchEdit->setFocus(Qt::OtherFocusReason); } void SearchTabContainer::searchButtonClicked() { if (!sqlEngine) return; QHash columns; SearchHead *searchHeader = static_cast(header); if( searchHeader->searchTitle->isChecked() ) columns.insertMulti("EVENT", "title"); if( searchHeader->searchAbstract->isChecked() ) columns.insertMulti("EVENT", "abstract"); if( searchHeader->searchTag->isChecked() ) columns.insertMulti("EVENT", "tag"); if( searchHeader->searchSpeaker->isChecked() ) columns["PERSON"] = "name"; if( searchHeader->searchRoom->isChecked() ) columns["ROOM"] = "name"; QString keyword = searchHeader->searchEdit->text(); int confId = Conference::activeConference(); if (confId == -1) return; Conference conf = Conference::getById(confId); sqlEngine->searchEvent( confId, columns, keyword ); int nrofFounds = 0; for (QDate d = conf.start(); d <= conf.end(); d = d.addDays(1)) nrofFounds += Event::getSearchResultByDate(d, confId, "start, duration").count(); if (!nrofFounds) { treeView->hide(); header->show(); QMessageBox::information( this, QString("Keyword '%1' not found!").arg(keyword), QString("No events containing '%1' found!").arg(keyword), QMessageBox::Ok); } else { treeView->show(); header->hide(); emit searchResultChanged(); } } void SearchTabContainer::loadEvents( const QDate &aDate, const int aConferenceId ) { static_cast(treeView->model())->loadSearchResultEvents( aDate, aConferenceId ); } confclerk-0.6.4/src/icons/0000775000175000017500000000000013212517317014667 5ustar gregoagregoaconfclerk-0.6.4/src/icons/collapse.png0000664000175000017500000000070113212517317017175 0ustar gregoagregoaPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<>IDATX?j`\jk*C7E@f l*Gz+ALUO ||0y$0 ȲL8UU( c\7/xXUp\4M_QQCq=$YX<^zP<<p FTd mҹPUC E5Gc ;I0 \P9p]wZwSsa/at ~w1VY.ˍC  dVK + jҿߚݴ]BIENDB`confclerk-0.6.4/src/icons/dialog-warning.png0000664000175000017500000000327013212517317020301 0ustar gregoagregoaPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<5IDATXõkWg̼{.P ݪИ|kZ,jZ1*RC?TSb#4?xI&oJlmZ`([vey/3s.~xwe$O3ϜIfr7V8`]#}l\z9|B%{<^~#uVwTynj%w`pKvo58=jpJ~aR9Kl;0 [WS]K4CwKrR0 2?x-k^@%+Ȟ<"zXG̾ٝ-r=<$&{_OV8XG`$t?OuxV yLy nnhLi 5N_:e}N4iYw`.܍lE2:NzIKD۲${ K'1*F!`-^K/"btB4vQ튎M;>4@`g=51{=V\V JkR0*FGD8(bSi:F0*5v2{}M\k5cUB4> avl6UOبQ1͠2(k s&XpJwpbm{ͷ9q4FŸ \$`uI.U`|^SFDanxhr$n[*;+yLSΣ.@G`b `٣zG:, !e`D|-z\MĠc>uc0^"L<5N?fC~R<(+^|4?QF+2D T>A4MFQc)}tߖ xQ؈xFŤWM+߄x*|c||CT Lu]0C0BR9l[r<c8R׳.GUȮxHn`Tp&ԄqKa,.pP(yۅN^˪vQ"@'U2dM]8S#G9}B~>Gڭ.ImEw}JxqV 1? z\!MWsޖm7!B֕i#o}`vy*hQbpȯ݂#]5Xky7IFP.磵:l*ABgmޚudB0. ;z0`hj8րhj^m ٮkU@~Wk;Bm ;C qz FYg,.ϏCwޚc;HEG3L}k+"Q;Eq0K bӞa@J@nB]\:a#΢vQHd^Pܡ3KWgI>>rnWxB0eP/?! 4}anhj썊ʱ \Gi 7-4sΆB;ڥN4OIENDB`confclerk-0.6.4/src/icons/remove.png0000664000175000017500000000116113212517317016671 0ustar gregoagregoaPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleOptical Drive>g IDATX햱@MBt SP  */sP@ANwJHSڱ%PXrV#Nfv&Ib̑>L0Eom\%B !k-_olOGTiճ|PM3 x$\m߸_t.ޕ?.Vˣ bμy(F_^zl6#P}_UNV'Dϟ,p}>;.o;)"]13 r v[=~ȋ4h9O nn6HOg _+;]¡ll?:xzrFlʀXV @;xZ_]'Bi-)}e\:N@܂B\\Z|\/\08 ƀecv*u;r;Gͣ6EJHJ7_WpFyY'kV`J^GMT$ !Avso"wh5iԗWUVW`UdAR|ɩ;gtrL:I$ e7OD@+.>%5)Z%di@$V2FƻA0498tR1i  2tˣ9]S[ybq+c.J%rD6[qy|Ry_l2f!R[vq; ,B -@?pX,iER5R1@ (FA8nfdGT(Z!j$iM+ L;?.-^8Y#ULk^3x n-.Gu\Gk}SL}>W,L)IFۏh,̛/?1KVc>7Oa8}8m5 Y{= 'UJ8IENDB`confclerk-0.6.4/src/icons/favourite-strong.png0000664000175000017500000000304713212517317020717 0ustar gregoagregoaPNG  IHDR szz pHYs  IDATXŗ[lG3{n9۩(h'"*Q(JE hPPx@"<($VPQƉǎo粻3g8%uQ'h%"\ޒg$JK:0L"q5 <+IPDɵ696kr˽rl 2""JU 9@1Ÿq6|tVC3nxq hfܹ s l> 4蹚A&gCD1y)*SEA |,N 3(A) =9@~> ¹s,LLJi{OOc뻶Fyqp Zπlb+e%*D5kx&pk01 Ɔ^c|T :ZwKݷ]͡F2ͭ$0< YT gfn>'ݹ>ll@.W -ׁ Zi JxRzi̫G)A6X^w~ k).) ǏUF 2 d PhQ A)R*% '8'8gq!dzw=?a3$&$I"\ "ucM-uTֆ`CD'C;ߦo>N{[Ԓv?sԾԿF2B 5Kk(46` arjuc8p.%T^:nCit\Bn '_o>C02+ d Mx~89 x81X*۴*)~\%$LFσR /FӄIB"`oUv|ttM~LÉNc?>Z::OoY[f;ﺟBa-LZXy"3G[$Viy-=~ݴ~Ŧ.2&@؈8[@CM^^5r"$!&alqS^jQ u#$GbS&!9[JeOUܙ(Zq*Yp8)Wo!q?źkJ᥿/FQpjʚ$Q<q*:vX} R(ћGxiGb;~{l:*a8Cl+$an~+vGc Fz?DP(@Qۯ߼<8@XIqΠo4[7Bu@{Wlgؑ&ǖYbb%1s$6d{')~&W rG6=[ =s?ůsg˜>;/=-S'Y+";ٶ̜"򔈄3gN˙<>*"wޙZbDOOȋ ^Tvo @^IENDB`confclerk-0.6.4/src/icons/expand.svg0000664000175000017500000002502213212517317016670 0ustar gregoagregoa image/svg+xml confclerk-0.6.4/src/icons/search.png0000664000175000017500000000444713212517317016653 0ustar gregoagregoaPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleOptical Drive>g IDATXŖi^er}w_fv6 #v ZH)V jOF *QĢ`HHqIB. @ TC- ݦfS3JMOnr{99!|4Kԏ \!WƧ: X@qr"؜I2042 "9Xlmm.f2R,(J`"ϟoR VǶ#ϯLIM]E,;1OdG:$ Z8,/,TI۩Tܘj(jl[hLL]JKi?u$:*3Dr!.|\Od3q JzBZgh n,%2J;\qt]vR<mp#`1)'*74t!CV7t@Ae,eh PHbƘn,;wEb2wPHk|*,oDCv,[.UbbJTG JvuE 76αcBjyFe+ l,ipaӇKx)Y\ 8:?>w7nlfJ} wZQ†! Uym._=As\!f651Fb1FESSǹ$(*RFjy]r [ܖxKr]8/plrl؆iN?)]}m3#g1EљVeIiJL!Ѳ]UgO[6FYae[pGC2\NY˳++-+b?=r.^?&.crz.d"x_|̔ \(Js?:.j*mne8we{Cs7t!̛2;1k kvg1KQ}]\dYǐWq` ɳ__1@o/aTX]1H!>XS+[rEg 1nE|ķ.NXZaY abцv4O>r&wjhW+DnېRjW$PFa{"\ȰB`2WEP4kx9dH|˚(nan =c!QO+O |tXFsDѐJDQ- ;U-U+J>3$X@DDRNֶD5pдR(.\& @l[$Z XG׵FgJhD&PX(ȅm,z!@   QjB^x|^fd X˲#mz'N./I\Z=sEe BW%CAAY]@v\z3,]_Ag IDATXŗo\E?|wql'/425D$zĿ!wHHkJqlB:{C;?-hOw;|wo̸q.Sn»dW\8'{on/bf`tcO[^[ZA`qaG\x!D./ANv"A3"c6$R`(JTt9&B)b"50oIeM 9fn4u4%sEU{b?V~Dd=,=y+X;{sBΥ!ҙ~NCyVǚk R*/d~׳'c4jofM;LMf'@` " V7C y}ѻ>3 GkWiZjol RRy fV!&*K nuc?CD('dp}2ovcw ! %Y^;,,͝t`e0SVg0c}<Kk714Րeݷ: SllIɘ_(:*w,g+R|yxfM  nC) LydYiy"Y뤮i |eXSR/*<$<:U8c*dZdG?`#&LD*Ie#A|a;sxA }3*`3QfSF2Y!%ȪLu m`f&"5MVQ9Dɀ o0͎5^C=oIDjgnLsb[/ٚxt /qb[U6hAh'a"ЇG~/ܰ9Ķ=O,oJm0_u{b%U%= oJmgP+UiPIdyUP;W:nѠҬomv'y~q:.[RIENDB`confclerk-0.6.4/src/icons/alarm-on.png0000664000175000017500000000313513212517317017105 0ustar gregoagregoaPNG  IHDR szz pHYs  IDATXŗk]Us};vʴ22J h?(6Q?iԤ`J0d"5 4Lk{ssým&m0MW>읬{^kmVE{'iZ.ݥbVOBvPU9R;e'U '<ê>OGG7w>J,3lOjNRJ71o/1uqh9<M|9 GJ&7A=<ܞrY` 0Y#6~Bh﹥LDXhEhxLrqF0=sZ ҩn  3Ҁ> { 9q$g0x|73퉛`$ Y4Mtz> NўIϩ-[)+]IENDB`confclerk-0.6.4/src/icons/alarm.blend0000664000175000017500000211125013212517317016773 0ustar gregoagregoaBLENDER_v272RENDHSceneTESTLPs ſTHSGG<%ľ~uARFSGSGF<,&$7/}tARFRFRFSGF<,&#.(5.~|tAPEQERFRFSGG<,&.(4-4-7/ʾ|s@PDPETHXK^Q`RA7)#4-4-4-4-hb?PDOCXL\O_Q^Q^Q@6$)$4.4.4-4-4-ga?NCOCWJ\OaSaSaSOD?6$.)4.4.4.4-4-@7ɾzr@MBWJ[N`R`RaSaSQF1*! $.)4.4.4.4.4.4-rl?վyq@MBTHWK^Q`R`R`R`RA8!!!!!!+%.)4.4.4.4.4.4.@8?MBPDWK[N[N\O`R`RQEA7!!!!!!6/KCKC4.4.4.4.4.?8XMԾLANCODTH[N[N[N[N^QQE1*!!!!!+%6/KCKCKCF>4.4.4.?8WL_Sоxp@K@ODRGRGRGVJ[N[N[N>5!!!!!!+%@9KCKCKCKCKC@94.?8WLcWUK}t?KAH?G>RGRGRGRGRG[NNC2+$#!!!!6/@9KCKCKCKCKCKCKCKCWLcW_SOF|t?ͿJ?I@G>F=F=I?RGRGRGRG;32+$$$$$"6/KCKCKCKCKCKCKCKCVMbWcW^STKOFOFо801*,%& !*$5-Ͽwo@E;A7F=F=F=F=F=LBRGG=;3$$$$$$3-RIbWKCKCKCKCKCKCKCVMbWbW^SSJOFOFOF~pi@800)*$%  #e`@̿I?A7=48080F=F=F=F=F=810)$$$$$$C;bWbWbWbWKCKCKCKCPHVMbWbW^SSJMEMEOFOF|t?>56..'("#  )#ke@οun@?7A78080808080F=F=>65.$$$$$$3-C;bWbWbWbWbWWMKCKCPH\RbWbW]SSJMEMEMENEOFPFun@=44,.'(""  $6.zq@G=70'"'"808080808080>6-'$$$$$$C;RIbWbWbWbWbWbWbWWMPH\RbWbW_UULMEMEMEMENEOFOF~vn@?65-.''!"  & <3пG=?7/)'"'"'"'"8080804-0)("("% $$$$C;bWbWbWbWbWbWbWbWbWbWaWbWbW_UYOULMEMEMEMEMEOFOF91~}t@J?A8911*)#   ,%C9ҿum@F<4,$'"'"'"'"'"'"800),&("("("("("% 3-RIbWbWbWbWbWbWbWbWbWbWaWaWbW_UYOULULQIMEMEMEMENEOF2,0)~|@VJNCF=>66/-(%! !3+NCF<+$!!!'"'"'"'"'"'"("("("("("("("OFvjbWbWbWbWbWbWbWbWbWbWaWaWaW\RULULULULULMEMEMEMENEB:$0)`TZORHKAC::32,*&# ("?6I>!!!!&!'"'"'"("("("("("(";4bXvjvjvjbWbWbWbWbWbWbWaWaWaWaW[RULULULULULULQIMEMEMEME&"$0)@fY_SWMOFG??871/*($#   2+J@C9!!"& ("("("("("("("OFvjvjvjvjvjvjbWbWbWbWbWaWaWaWbXcY^TULULULULULULULMEMEME82$0)pbk^dX\QSJLCD<<64/.)*%&"#  *$=4[N& & ("("("("("(";4bXvjvjvjvjvjvjvjvjg\bWbWaWaWaWbXdZf[f[ZPULULULULULULOGMEC<""$0)@ugobh\`UXNPGH@@::4602-.)+&'##   &!/(.'+%("("("(";4OFvjvjvjvjvjvjvjvjvjsgoccYaWaWaWcYf[f[f[f[f[ULULULULULULSKC<-("""$0)p{ltfl`dY\RTKMEH?B;>7:4603-/*+&(#$  .'.'.'.'.'("("OFbXvjvjvjvjvjvjvjvjvjock`g\f[aWbXdZf[f[f[f[f[f[^TULULULULULOG60"""""$0)ļupxjpch]`VYPUKOFJAF?C;?8:4713-.**&&""%.'.'.'.'.'.'D;SJvjvjvjvjvjvjvjvjvjsgocg\g\g\g\cYdZf[f[f[f[f[f[f[f[ZPULULULOGC<=60*"""""$0)Ǿzt}ntgm`eZ_U[QWMQHNEJBF>B;>793501--(($%!%.'.'.'.'.'.'.'[Pqdyrvjvjvjvjvjvjvjock`g\g\g\j_nbuif[f[f[f[f[f[f[f[f[f[ULULOGC<=6=6=60*"""""$0)~xsykqdi^dZaW]SYOULQHMEIAE=@9<5720*.'.'.'.'.'.'.'D;qdyyyyyvjvjvjvjsgocg\g\g\g\nbqeuiuiuif[f[f[f[f[f[f[f[f[^TOGC<=6=6=6=6=60*"""""$0)€}w}ouhnbj^f[cY`U\RXNTKPGKDB;5..'.'.'.'.'.'D;[Pyyyyyyyyrvjock`g\g\g\j_nbuiuiuiuiuiuif[f[f[f[f[f[f[f[_TNF=6=6=6=6=6=6=660"""""*$0)Āzsylsfpdmaj_f[bX_UQHE=4,4,1*.'.'.'.'[Pqdyyyyyyyyytuig\g\g\g\nbqeuiuiuiuiuiuiuiuif[f[f[f[f[f[_TWMWMJB=6=6=6=6=6=6=6=6"""""0)0)ƀ~w}pylvjthpdmaNE4,4,4,4,4,.'.'D;qdyyyyyyyyyt{nncncnclaj_nbuiuiuiuiuiuiuiuiuiuiuif[f[f[cX[QWMWMWMWMPG=6=6=6=6=6=6=6=6"""""0)0)se{s~q|oWLE<4,4,4,4,4,4,LB[Pyyyyyyyyyy{nuincncncncxk}oxluiuiuiuiuiuiuiuiuiuiuiuif[_T[QWMWMWMWMWMWMWM=6=6=6=6=6=6=6=6"""""0)0)slAE;>5OEre[P4,4,4,4,4,4,4,eY}oyyyyyyytuincncncncxk}otttquiuiuiuiuiuiuiuiuiuiuirfWMWMWMWMWMWMWMWMWMWM=6=6=6=6=6=6=6=6"""""/(/(tlAE;7/)#)#)#xk^7.4,4,4,4,4,4,eY}oyyyt{nncncncncsgxktttttttxluiuiuiuiuiuiuithpdnbnbWMWMWMWMWMWMWMWMWMWMC<=6=6=6=6=6=6=6"""""/(/(E;E;A8=43+.')#3+=4=4=44,4,4,4,LBeY|{nncncncncncxktttttttttt|ouiuiuiuiuirfnbnbnbnbnbcXWMWMWMWMWMWMWMWMWMJB=6=6=6=6=6=6=6"""""/(/(E;E;F;=4=4=4=4=4=4=4=4=4904,LBeYw}otgtgqeqezn}otttttttttttttuiuithpdnbnbnbnbnbnbnbcXWMWMWMWMWMWMWMWMWMJB=6=6=6=6=6=6=60*"""" /(tlAF<E;H>MBPDG<B8=4=4=4=4=4=4=4eYw}otgtgtgtgrx~~vtttttttttttttzmnbnbnbnbnbnbnbnbnbnbnbWMWMWMWMWMWMWMWMWMJB=6=6=6=6=6=6=60*"""! /(tmAF<G<G<H=THNCE;=4=4=4=4=4=4nax}otgtgtgtgrx~~~~~~vtttttttttttttnbnbnbnbnbnbnbnbnbnbnb]RWMWMWMWMWMWMWMWMWM=6=6=6=6=6=6=60*"" /(umAG=H=H>H>H>G=G=G=@7=4=4=4naxwtgtgtgtgrx~~~~~~~~~~vttttttttttttsfnbnbnbnbnbnbnbnbnbnbcXWMWMWMWMWMWMWMWMWM=6=6=6=6=6=6=60*! /(I>K@LAMBG=G=G=G=G=B9=4naxyviviuiuiux~~~~~~~~~~~~~~{ttttttttttt}onbnbnbnbnbnbnbnbnbnbh]WMWMWMWMWMWMWMWMWM=6=6=6=6=6=6<5,' /(RGODODODG=G=G=G=^Rvhy}wkwkwkwkw}~~~~~~~~~~~~{tttttttttttnbnbnbnbnbnbnbnbnbnbnbWMWMWMWMWMWMWMWMWMJB=6=6=6<5:3821, /(SHODODODI?G=vhvh}twkwkwk~qw}~~~~~~~tttttttttttxknbnbnbnbnbnbnbnbnbnb]RWMWMWMWMWMWMWMWMJB=6=6;482828282 /(SHPEODdXzl~}uylxlxlyy~~{tttttttttttnbnbnbnbnbnbnbnbnbnbcXWMWMWMWMWMWMWMWMJB;4828282828282 /(zmzmzmzzwttttttttttxknbnbnbnbnbnbnbnbnbnbWMWMWMWMWMWMWMULSJ82828282828282 /(Ͼ@?@z~tttttttttt}onbnbnbnbnbnbnbnbnbnbWMWMWMWMVMULSJSJSJ82828282828282$  /(~@wttttttttttsfnbnbnbnbnbnbnbnbnbcXWMVMTKSJSJSJSJSJ?8828282828282+&/(~~ttttttttttxknbnbnbnbnbnbnbnbnbbWTKSJSJSJSJSJSJSJF>828282828282+&/(Ⱦwttttttttttnbnbnbnbnbnbnblaj_j_SJSJSJSJSJSJSJSJF>828282828282+&/(~ttttttttttxknbnbnbmbk`j_j_j_j_YOSJSJSJSJSJSJSJSJ828282828282821)wttttttttt}onblaj_j_j_j_j_j_j__USJSJSJSJSJSJSJSJ828282828282822*@ttttttttssodj_j_j_j_j_j_j_j_j_SJSJSJSJSJSJSJSJF>828282828282'!~@{ttttssrrruij_j_j_j_j_j_j_j_j_SJSJSJSJSJSJSJSJF>828282828282$+$~@tssrrrrrrrj_j_j_j_j_j_j_j_j__USJSJSJSJSJSJSJLD828282828282+&#$$+$~@yrrrrrrrrruij_j_j_j_j_j_j_j_dZSJSJSJSJSJSJSJSJ828282828282+&&")%$$.'@rrrrrrrrrzmj_j_j_j_j_j_j_j_j_SJSJSJSJSJSJSJSJ828282828282+& &")%)%$$2*@yrrrrrrrrrodj_j_j_j_j_j_j_j_YOSJSJSJSJSJSJSJF>82828282820+)%)%)%'"$$2*@rrrrrrrrruij_j_j_j_j_j_j_j__USJSJSJSJSJSJSJF>828282:4@961)%)%)%'"$$~yrrrrrrrrrj_j_j_j_j_j_j_j_j_SJSJSJSJSJSJSJLD8282@9C<C<61)%)%)%'"$+$~rrrrrrrrrodj_j_j_j_j_j_j_j_YOSJSJSJSJSJSJSJ;4C<C<C<C<61)%)%)%'"$+$~yrrrrrrrrzmj_j_j_j_j_j_j_j__USJSJSJSJSJULYPC<C<C<C<C<61)%)%)%'"$+$@rrrrrrrrrj_j_j_j_j_j_j_j_dZSJSJSJULYP\R\RC<C<C<C<C<61)%)%)%$$.'@yrrrrrrrruij_j_j_j_j_j_j_j_SJULYP\R\R\R\RIAC<C<C<C<61)%)%)%$$~@rrrrrrrrrj_j_j_j_j_j_j_nbg\\R\R\R\R\R\RPGC<C<C<C<61)%)%)%$$ʾyrrrrrrrrodj_j_j_l`pdrfrfg\\R\R\R\R\R\RPGC<C<C<C<61)%)%)%$c^?rrrrrrrrzmj_nbpdrfrfrfrfrf\R\R\R\R\R\RPGC<C<C<C<61)%)%)%0*~ɀyrrrrrrturfrfrfrfrfrfrfrf\R\R\R\R\R\RPGC<C<C<C<61)%)%-(5.@rrrtuwww|orfrfrfrfrfrfrfaW\R\R\R\R\RPGC<C<C<C<61)%1,4/gb?@{uwwwwwwwrfrfrfrfrfrfrfg\\R\R\R\R\RVLC<C<C<C<611,4/5.ʾ@zwwwwwww|orfrfrfrfrfrfla\R\R\R\R\R\RC<C<C<E=:44/4/5.@wwwwwwwsrfrfrfrfrfrfrf\R\R\R\R\R\RC<C<IAKC4/4/4/~~wwwwwwwwjrfrfrfrfrfrfaW\R\R\R\R\RE>KCKCF>4/4/5.ʾwwwwwww|orfrfrfrfrfrfg\\R\R\R]S`VKCKCKC@94/4/gb?@wwwwwwwrfrfrfrfrfrfg\\R]S`VbXbXKCKCKC:44/4/@zwwwwww|orfrfrfrfrfsg`VbXbXbXbXKCKCKC4/4/ɾ@wwwwwwsrfrfrfthuivjbXbXbXbXWNKCKCKC4/ɾ~wwwwwwxkthvjvjvjvjbXbXbXbXWNKCKC@9ɾzwwwxyuvjvjvjvjvjlabXbXbXWNKCMEξ@xyyyyyvjvjvjvjvjlabXbXbXWNPGpj@@yyyyyrvjvjvjvjlabXbXcXYO /(̿@|yyyyyvjvjvjvjqecYeZRI0+ $ο|yyyyrvjvjvjrff[j_ZPME82! ,&ѿyyyyuviuhuhr~|tuh`VIA/*e`@xwtt?~?unbQH0*Ͽ~~?}}}tg?xnbQH+'ga@svhi^g\eZ_V~w?@tf[A;!%!Žxvik_f[\RLD̾~sgWN0,% zuimacXQHke?{maW<5'"À|uik`ZP?8zng\H?,'ǽŀxll`UL5.{xkh\KC1+ǀ{nk`NF.)<3teyrpdf[JB2,tocRJ.)& |ABrd|msfk`cYKCfb?}vjYP1,!)#vA~A^Qi\k_i^e[]SF?rf\C<!;3vA]PODLAQG[P^S`VcYXOE=@wkWM2- &!/(/(1*4-:3D=OFYO_U_URIͽ{pdRJ0+ &!-(81C;OG[RbX\S~}reVM>7($"*%3.?8NF]ScYbXy??|og]TKG@>8<5>7D<NEYPdYi^i^Խ}~qsgj^g\f[i]mbqesg~~{xv~~GLOB8̫ 0V Ly unknown/home/philipp/projekte/toastfreeware/confclerk/src/icons/alarm.blendWM4 WMWinMan Z Z 4 lV N W N tW W l` l` l` DATA W V screen|hr "> [ [ d|s }s $}s $}s  SN $q SRAnimation.001lP \ %Z D& l tW Ly DATAlP t DATAt tW lP DATAtW $[ t DATA$[ dV tW DATAdV R3 $[ DATAR3 !?@ ""!"W>DATAW DATA`|W  < l2 q \ , =;Ԙr Ԙr tr r DATA$tr r CAb'&6XCAWCAWCA?? ";DATA$r tr CGCS?? =!DATAԘr |Y DATA |Y C DATAC Ly Ly Ly Ly $  vz \  Ly DATA` =Z |W V tc/ 5 ̳ YWj,r ,r ܙr r DATA$ܙr  r @qDADAVDADA?? WWYrWDATA$ r 3;Q?Fwi?JF>#,TY!e?*=>o?E>Fwi?TY5;JF>!e?Q?#,+=>`DAoy@?>Ѣ0QQuZ? r[>?>#,>mi}?T*= lAoAc>ntU?@FR0ݹ,-3> O?8Clu·Ai>rB;B7@D>3;Q?Fwi?JF>#,TY!e?*=>o?>Ѣ0QQuZ? r[>?>#,>mi}?T*= lAoA [@ [@ [@?\>7?8˔oAH;?DATA,,r 333?? AL>\ ?? B?=C DATA`=Z T8175e?4>Z& 4?ߕ/?7F:?81X~>75e?'?T3>ne@>N@?/?=I''? ??T?ļL@ l4}@~q11A 4AF>>֟ļG=->3xkBˇ֟&B|`eA(@ݕ/?V~'?3F:?>T8175e?4>Z& 4?/?=I''? ??T?ļL@ l4}@~q11A 4Afga@fga@fga@?H?N+Z# A;A??DATA,r 333?? AL>\ ?? B? #<C SN$q V  SRCompositingg.001x L # - 4tY | Ly 0wDATAx  $Z DATA $Z A> x DATAA>  $Z DATA  "5 A> DATA "5 Y DATAY  "5 DATA < Y 4`DATA< $ `DATA$ j5 < 4DATAj5 Ĥ $ DATAĤ  j5 4DATA D1 Ĥ DATAD1 L DATAL D1 4DATA#  $Z A> DATA $ # $Z "5 DATA$  Y A> DATA eV $ Y "5 DATAeV D  < DATAD DN eV < DATADN 4V D Y $ DATA4V  N DN $ "5 DATA N , i 4V $ DATA, i  V N Y < DATA V  r , i "5 j5 DATA r < V Ĥ $ DATA< t[ r Ĥ j5 DATAt[ W < j5 DATAW  t[ Ĥ DATA ] W D1 x DATA]   D1 L DATA W ] L DATAW N  L DATAN tY W D1 DATAtY - N L Ĥ DATA- tY x j5 DATA`4tY W "5 $Z A> Y {@ |V |V r N^ ! <ا DATA$r N^ DADADADA??  }@ DATA$N^ r mED?|o{?? ||@ DATA`W ܓ 4tY L < 5_Y`4Y@ \Z \Z O^ P^ s DATA$O^ P^ {DACAXCACA??  YY5YYB6g>)&>p@|@3?*1%b ޜ% a?2$AA`ןxI7R6g>)@DjihW>o>pG46gcyHB?hf?I?LXWJ?W=p= b|U_y?cy?[?H> @ +@I@/?/?/?HB?*@?F?jH!͘oA6sY; A\>7?8˔?V?إ>$?DATA,d^ 333?? AL>\ ?? B?=C DATA`d>dddADATA$^ h @PDADADADA?? DATA$h h ^ Ct_Ct?@ DATA$h h h DHB 7DHB1DDBDDB?? 222DATA$h h VC@fDc??DATA<4h th ^ h |h DATA|h Save As Image/home/philipp/projekte/confclerk/src/icons/alarm-off.png 0SNV <> $q SRDefaultt L# wZ #3 V ,4 Ly ,0wDATAt  ? DATA ? a* t DATAa* 5 ? DATA5 $Ps a* DATA$Ps \q 5 DATA\q Y $Ps DATAY ^ \q DATA^ 6 Y DATA6 ܆Q ^ DATA܆Q lQ 6 DATAlQ L# ܆Q 8DATAL# lQ 8DATAwZ a a* ? DATAa < wZ ? $Ps DATA< D|W a \q a* DATAD|W V < \q $Ps DATAV Ĉ[ D|W Y t DATAĈ[ \N V Y 5 DATA\N  Ĉ[ $Ps ^ DATA tݤ \N \q ^ DATAtݤ V  Y 6 DATAV @X tݤ 6 ^ DATA@X H V ܆Q \q DATAH \wY @X ܆Q 5 DATA\wY Z H ܆Q 6 DATAZ  \wY lQ t DATA Y Z lQ $Ps DATAY lW L# ^ DATAlW #3 Y Y L# DATA#3 lW lQ L# DATA`V T $Ps ? a* \q %{@ D^ D^ dh h Y DATA$dh h DADADADA??   }@ z z f/  DATA$h dh mED0A| o{ ??  |  ! |@ D y DATA`T Z V Y 6 ܆Q 5 n y@ 0 0 h h tRr d DATA$h h CAĎA7CAmCACA??  nn n"n{@   s Pr DATA$h h C~C?L\n[[?@n\ts  n#ny@ %^ Y $h ;X DATA$i $i $h DATA_PT_modifiersDATA_PT_modifiersModifiers$7DATA$i $i $i SCENE_PT_audioSCENE_PT_audioAudio9DATA$i $i $i OBJECT_PT_context_objectOBJECT_PT_context_object$,DATA$i V $i OBJECT_PT_transformOBJECT_PT_transformTransform'y-DATAV X $i OBJECT_PT_delta_transformOBJECT_PT_delta_transformDelta Transform`.DATAX  X V OBJECT_PT_transform_locksOBJECT_PT_transform_locksTransform Locks7`/DATA X  X X OBJECT_PT_relationsOBJECT_PT_relationsRelationsb0DATA X  X  X OBJECT_PT_groupsOBJECT_PT_groupsGroups$1DATA X  X  X OBJECT_PT_displayOBJECT_PT_displayDisplay2DATA X  X  X OBJECT_PT_duplicationOBJECT_PT_duplicationDuplication$3DATA X X  X OBJECT_PT_relations_extrasOBJECT_PT_relations_extrasRelations Extras2P4DATAX X  X OBJECT_PT_motion_pathsOBJECT_PT_motion_pathsMotion Pathsw5DATAX X X OBJECT_PT_custom_propsOBJECT_PT_custom_propsCustom Properties_6DATAX X X OBJECT_PT_constraintsOBJECT_PT_constraintsObject Constraints$+DATAX X X DATA_PT_context_meshDATA_PT_context_mesh$#DATAX X X DATA_PT_normalsDATA_PT_normalsNormalsf:$DATAX X X DATA_PT_texture_spaceDATA_PT_texture_spaceTexture SpaceN%DATAX X X DATA_PT_vertex_groupsDATA_PT_vertex_groupsVertex GroupsL&DATAX X X DATA_PT_shape_keysDATA_PT_shape_keysShape KeysL'DATAX X X DATA_PT_uv_textureDATA_PT_uv_textureUV Maps)E(DATAX X X DATA_PT_vertex_colorsDATA_PT_vertex_colorsVertex ColorsE)DATAX X X DATA_PT_custom_props_meshDATA_PT_custom_props_meshCustom Properties*DATAX X X MATERIAL_PT_context_materialMATERIAL_PT_context_material^[~DATAX X X DATA_PT_context_lampDATA_PT_context_lamp\$DATAX X X DATA_PT_previewDATA_PT_previewPreview\DATAX X X DATA_PT_lampDATA_PT_lampLampU\DATAX X X DATA_PT_shadowDATA_PT_shadowShadow\DATAX X X DATA_PT_custom_props_lampDATA_PT_custom_props_lampCustom Propertiest\DATAX  X X WORLD_PT_context_worldWORLD_PT_context_world[$DATA X !X X WORLD_PT_previewWORLD_PT_previewPreview[ DATA!X "X  X WORLD_PT_worldWORLD_PT_worldWorld[j DATA"X #X !X WORLD_PT_ambient_occlusionWORLD_PT_ambient_occlusionAmbient Occlusion[[$ DATA#X $X "X WORLD_PT_environment_lightingWORLD_PT_environment_lightingEnvironment Lighting[$ DATA$X %X #X WORLD_PT_indirect_lightingWORLD_PT_indirect_lightingIndirect Lighting[$ DATA%X &X $X WORLD_PT_gatherWORLD_PT_gatherGather6[DATA&X 'X %X WORLD_PT_mistWORLD_PT_mistMist[DATA'X (X &X WORLD_PT_starsWORLD_PT_starsStarsDATA(X )X 'X WORLD_PT_custom_propsWORLD_PT_custom_propsCustom Properties[DATA)X *X (X MATERIAL_PT_previewMATERIAL_PT_previewPreview[DATA*X +X )X MATERIAL_PT_diffuseMATERIAL_PT_diffuseDiffuseg[?DATA+X ,X *X MATERIAL_PT_specularMATERIAL_PT_specularSpecular[SDATA,X -X +X MATERIAL_PT_shadingMATERIAL_PT_shadingShading[PDATA-X .X ,X MATERIAL_PT_transpMATERIAL_PT_transpTransparency)[SDATA.X /X -X MATERIAL_PT_mirrorMATERIAL_PT_mirrorMirror[DATA/X 0X .X MATERIAL_PT_sssMATERIAL_PT_sssSubsurface Scattering[DATA0X 1X /X MATERIAL_PT_strandMATERIAL_PT_strandStrand[DATA1X 2X 0X MATERIAL_PT_optionsMATERIAL_PT_optionsOptions[ DATA2X 3X 1X MATERIAL_PT_shadowMATERIAL_PT_shadowShadow[!DATA3X 4X 2X MATERIAL_PT_custom_propsMATERIAL_PT_custom_propsCustom Properties["DATA4X 5X 3X DATA_PT_context_cameraDATA_PT_context_camera\$DATA5X 6X 4X DATA_PT_lensDATA_PT_lensLens \DATA6X 7X 5X DATA_PT_cameraDATA_PT_cameraCamera\VDATA7X 8X 6X DATA_PT_camera_dofDATA_PT_camera_dofDepth of FieldF\=DATA8X 9X 7X DATA_PT_camera_displayDATA_PT_camera_displayDisplay\|DATA9X :X 8X DATA_PT_custom_props_cameraDATA_PT_custom_props_cameraCustom Properties\DATA:X ;X 9X TR RENDER_PT_freestyleRENDER_PT_freestyleFreestyle[JDATA;X :X TEXTURE_PT_context_textureTEXTURE_PT_context_texturemDATAX BX S |W DATA$4>X d?X qDADADADA?? $b@ z z ws DATA$d?X @X 4>X 7`@ DATA$@X AX d?X "`@ DATA$AX BX @X 7[@ DATA$BX AX 7%D[@ lW > $DX DATAX$DX ͟>?AHM?a}%xI%a}%C6gcyxIcy?B6gO&Dvj|??_}%xIa}%A6gcy?xI%cyC6ǵ4?͟>ߦ%IxIwѷ$^y?cy?`:?¬g>B6g>f%¿p@|@X0@.& %F P?P)A4֟xI /6g>(@DjihW>o>pG46gcyHB?hf?I?IyLXWNx?W=p= f_y?cy?3>@ +@I@Kי\1TਿTਿopK?+`?߭4HB?*@?F?jH!͘ A2;?? ~>Cy?ץ>DATA,GX ,U 333?L>\ ?? B? #<zD DATA$HX IX `DADA`DA`DA?? DATA$IX HX @~CHBXg(CHB?HB|HHB= AH3DATA,U GX HX IX ?DATA`d ,4 Z 6 ^ \q ܆Q nW@ |MX |MX KX LLX Sr \uY DATA$KX LLX CAĎA7CAmCACA??  nn n&nX@ | | p q DATA$LLX KX Cټ7C\n[[?? n\ n'nTX@ , X , X ,s sV DATA|MX 3 3 \ se Sculpt DATA \ Q Q / DATA{/ Q Ly Ly Ly Ly $  vz \  Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly  Ly  Ly  Ly  Ly  Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly  Ly !Ly "Ly #Ly $Ly %Ly &Ly 'Ly (Ly )Ly *Ly +Ly ,Ly -Ly .Ly /Ly 0Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly  Ly  Ly  Ly  Ly  Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly Ly  Ly !Ly "Ly #Ly $Ly %Ly &Ly 'Ly (Ly O{ ,Y{ b{ k{ Lu{ ~{  { l{ ̚{ ,{ { { L{ {  { l{ { ,{ { | L | |  | l'| 0| ,:| C| L| LV| _| O{ O{ O{ O{ O{ O{ O{ O{ O{  O{  O{  O{  O{  O{ O{ O{ O{ O{ O{ O{ O{ O{ O{ O{ O{ O{ O{ O{ O{ O{ O{ O{  O{ !O{ "O{ #O{ $O{ %O{ &O{ 'O{ (O{ )O{ *O{ +O{ ,O{ -O{ .O{ /O{ 0O{ 1O{ 2O{ 3O{ 4O{ 5O{ 6O{ 7O{ 8O{ 9O{ :O{ ;O{ <O{ =O{ >O{ ?O{ @O{ AO{ BO{ CO{ DO{ EO{  vz \   $q V <> t 5 l(W =' 4 $ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{  ,Y{  ,Y{  ,Y{  ,Y{  ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{ ,Y{  ,Y{ !,Y{ ",Y{ #,Y{ $,Y{ %,Y{ &,Y{ ',Y{ (,Y{ ),Y{ *,Y{ +,Y{ ,,Y{ -,Y{ .,Y{ /,Y{ 0,Y{ 1,Y{ 2,Y{ 3,Y{ 4,Y{ 5,Y{ 6,Y{ 7,Y{ 8,Y{ 9,Y{ :,Y{ ;,Y{ <,Y{ =,Y{ >,Y{ ?,Y{ @,Y{ A,Y{ B,Y{ C,Y{ D,Y{ E,Y{ b{ b{ b{ b{ b{ b{ b{ b{ b{  b{  b{  b{  b{  b{ b{ b{ b{ b{ b{ b{ b{ b{ b{ b{ b{ b{ b{ b{ b{ b{ b{ b{  b{ !b{ "b{ #b{ $b{ %b{ &b{ 'b{ (b{ )b{ *b{ +b{ ,b{ -b{ .b{ /b{ 0b{ 1b{ 2b{ 3b{ 4b{ 5b{ 6b{ 7b{ 8b{ 9b{ :b{ ;b{ <b{ =b{ >b{ ?b{ @b{ Ab{ Bb{ Cb{ Db{ Eb{ k{ k{ k{ k{ k{ k{ k{ k{ k{  k{  k{  k{  k{  k{ k{ k{ k{ k{ k{ k{ k{ k{ k{ k{ k{ k{ k{ k{ k{ k{ k{ k{  k{ !k{ "k{ #k{ $k{ %k{ &k{ 'k{ (k{ )k{ *k{ +k{ ,k{ -k{ .k{ /k{ 0k{ 1k{ 2k{ 3k{ 4k{ 5k{ 6k{ 7k{ 8k{ 9k{ :k{ ;k{ <k{ =k{ >k{ ?k{ @k{ Ak{ Bk{ Ck{ Dk{ Ek{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{  Lu{  Lu{  Lu{  Lu{  Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{ Lu{  Lu{ !Lu{ "Lu{ #Lu{ $Lu{ %Lu{ &Lu{ 'Lu{ (Lu{ )Lu{ *Lu{ +Lu{ ,Lu{ -Lu{ .Lu{ /Lu{ 0Lu{ 1Lu{ 2Lu{ 3Lu{ 4Lu{ 5Lu{ 6Lu{ 7Lu{ 8Lu{ 9Lu{ :Lu{ ;Lu{ <Lu{ =Lu{ >Lu{ ?Lu{ @Lu{ ALu{ BLu{ CLu{ DLu{ ELu{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{  ~{  ~{  ~{  ~{  ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{ ~{  ~{ !~{ "~{ #~{ $~{ %~{ &~{ '~{ (~{ )~{ *~{ +~{ ,~{ -~{ .~{ /~{ 0~{ 1~{ 2~{ 3~{ 4~{ 5~{ 6~{ 7~{ 8~{ 9~{ :~{ ;~{ <~{ =~{ >~{ ?~{ @~{ A~{ B~{ C~{ D~{ E~{  {  {  {  {  {  {  {  {  {   {   {   {   {   {  {  {  {  {  {  {  {  {  {  {  {  {  {  {  {  {  {  {   { ! { " { # { $ { % { & { ' { ( { ) { * { + { , { - { . { / { 0 { 1 { 2 { 3 { 4 { 5 { 6 { 7 { 8 { 9 { : { ; { < { = { > { ? { @ { A { B { C { D { E { l{ l{ l{ l{ l{ l{ l{ l{ l{  l{  l{  l{  l{  l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{  l{ !l{ "l{ #l{ $l{ %l{ &l{ 'l{ (l{ )l{ *l{ +l{ ,l{ -l{ .l{ /l{ 0l{ 1l{ 2l{ 3l{ 4l{ 5l{ 6l{ 7l{ 8l{ 9l{ :l{ ;l{ <l{ =l{ >l{ ?l{ @l{ Al{ Bl{ Cl{ Dl{ El{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{  ̚{  ̚{  ̚{  ̚{  ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{ ̚{  ̚{ !̚{ "̚{ #̚{ $̚{ %̚{ &̚{ '̚{ (̚{ )̚{ *̚{ +̚{ ,̚{ -̚{ .̚{ /̚{ 0̚{ 1̚{ 2̚{ 3̚{ 4̚{ 5̚{ 6̚{ 7̚{ 8̚{ 9̚{ :̚{ ;̚{ <̚{ =̚{ >̚{ ?̚{ @̚{ A̚{ B̚{ C̚{ D̚{ E̚{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{  ,{  ,{  ,{  ,{  ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{  ,{ !,{ ",{ #,{ $,{ %,{ &,{ ',{ (,{ ),{ *,{ +,{ ,,{ -,{ .,{ /,{ 0,{ 1,{ 2,{ 3,{ 4,{ 5,{ 6,{ 7,{ 8,{ 9,{ :,{ ;,{ <,{ =,{ >,{ ?,{ @,{ A,{ B,{ C,{ D,{ E,{ { { { { { { { { {  {  {  {  {  { { { { { { { { { { { { { { { { { { {  { !{ "{ #{ ${ %{ &{ '{ ({ ){ *{ +{ ,{ -{ .{ /{ 0{ 1{ 2{ 3{ 4{ 5{ 6{ 7{ 8{ 9{ :{ ;{ <{ ={ >{ ?{ @{ A{ B{ C{ D{ E{ { { { { { { { { {  {  {  {  {  { { { { { { { { { { { { { { { { { { {  { !{ "{ #{ ${ %{ &{ '{ ({ ){ *{ +{ ,{ -{ .{ /{ 0{ 1{ 2{ 3{ 4{ 5{ 6{ 7{ 8{ 9{ :{ ;{ <{ ={ >{ ?{ @{ A{ B{ C{ D{ E{ L{ L{ L{ L{ L{ L{ L{ L{ L{  L{  L{  L{  L{  L{ L{ L{ L{ L{ L{ L{ L{ L{ L{ L{ L{ L{ L{ L{ L{ L{ L{ L{  L{ !L{ "L{ #L{ $L{ %L{ &L{ 'L{ (L{ )L{ *L{ +L{ ,L{ -L{ .L{ /L{ 0L{ 1L{ 2L{ 3L{ 4L{ 5L{ 6L{ 7L{ 8L{ 9L{ :L{ ;L{ <L{ =L{ >L{ ?L{ @L{ AL{ BL{ CL{ DL{ EL{ { { { { { { { { {  {  {  {  {  { { { { { { { { { { { { { { { { { { {  { !{ "{ #{ ${ %{ &{ '{ ({ ){ *{ +{ ,{ -{ .{ /{ 0{ 1{ 2{ 3{ 4{ 5{ 6{ 7{ 8{ 9{ :{ ;{ <{ ={ >{ ?{ @{ A{ B{ C{ D{ E{  {  {  {  {  {  {  {  {  {   {   {   {   {   {  {  {  {  {  {  {  {  {  {  {  {  {  {  {  {  {  {  {   { ! { " { # { $ { % { & { ' { ( { ) { * { + { , { - { . { / { 0 { 1 { 2 { 3 { 4 { 5 { 6 { 7 { 8 { 9 { : { ; { < { = { > { ? { @ { A { B { C { D { E { l{ l{ l{ l{ l{ l{ l{ l{ l{  l{  l{  l{  l{  l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{ l{  l{ !l{ "l{ #l{ $l{ %l{ &l{ 'l{ (l{ )l{ *l{ +l{ ,l{ -l{ .l{ /l{ 0l{ 1l{ 2l{ 3l{ 4l{ 5l{ 6l{ 7l{ 8l{ 9l{ :l{ ;l{ <l{ =l{ >l{ ?l{ @l{ Al{ Bl{ Cl{ Dl{ El{ { { { { { { { { {  {  {  {  {  { { { { { { { { { { { { { { { { { { {  { !{ "{ #{ ${ %{ &{ '{ ({ ){ *{ +{ ,{ -{ .{ /{ 0{ 1{ 2{ 3{ 4{ 5{ 6{ 7{ 8{ 9{ :{ ;{ <{ ={ >{ ?{ @{ A{ B{ C{ D{ E{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{  ,{  ,{  ,{  ,{  ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{ ,{  ,{ !,{ ",{ #,{ $,{ %,{ &,{ ',{ (,{ ),{ *,{ +,{ ,,{ -,{ .,{ /,{ 0,{ 1,{ 2,{ 3,{ 4,{ 5,{ 6,{ 7,{ 8,{ 9,{ :,{ ;,{ <,{ =,{ >,{ ?,{ @,{ A,{ B,{ C,{ D,{ E,{ { { { { { { { { {  {  {  {  {  { { { { { { { { { { { { { { { { { { {  { !{ "{ #{ ${ %{ &{ '{ ({ ){ *{ +{ ,{ -{ .{ /{ 0{ 1{ 2{ 3{ 4{ 5{ 6{ 7{ 8{ 9{ :{ ;{ <{ ={ >{ ?{ @{ A{ B{ C{ D{ E{ | | | | | | | | |  |  |  |  |  | | | | | | | | | | | | | | | | | | |  | !| "| #| $| %| &| '| (| )| *| +| ,| -| .| /| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| :| ;| <| =| >| ?| @| A| B| C| D| E| L | L | L | L | L | L | L | L | L |  L |  L |  L |  L |  L | L | L | L | L | L | L | L | L | L | L | L | L | L | L | L | L | L | L |  L | !L | "L | #L | $L | %L | &L | 'L | (L | )L | *L | +L | ,L | -L | .L | /L | 0L | 1L | 2L | 3L | 4L | 5L | 6L | 7L | 8L | 9L | :L | ;L | <L | =L | >L | ?L | @L | AL | BL | CL | DL | EL | | | | | | | | | |  |  |  |  |  | | | | | | | | | | | | | | | | | | |  | !| "| #| $| %| &| '| (| )| *| +| ,| -| .| /| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| :| ;| <| =| >| ?| @| A| B| C| D| E|  |  |  |  |  |  |  |  |  |   |   |   |   |   |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |   | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? | @ | A | B | C | D | E | l'| l'| l'| l'| l'| l'| l'| l'| l'|  l'|  l'|  l'|  l'|  l'| l'| l'| l'| l'| l'| l'| l'| l'| l'| l'| l'| l'| l'| l'| l'| l'| l'| l'|  l'| !l'| "l'| #l'| $l'| %l'| &l'| 'l'| (l'| )l'| *l'| +l'| ,l'| -l'| .l'| /l'| 0l'| 1l'| 2l'| 3l'| 4l'| 5l'| 6l'| 7l'| 8l'| 9l'| :l'| ;l'| <l'| =l'| >l'| ?l'| @l'| Al'| Bl'| Cl'| Dl'| El'| 0| 0| 0| 0| 0| 0| 0| 0| 0|  0|  0|  0|  0|  0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0|  0| !0| "0| #0| $0| %0| &0| '0| (0| )0| *0| +0| ,0| -0| .0| /0| 00| 10| 20| 30| 40| 50| 60| 70| 80| 90| :0| ;0| <0| =0| >0| ?0| @0| A0| B0| C0| D0| E0| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:|  ,:|  ,:|  ,:|  ,:|  ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:| ,:|  ,:| !,:| ",:| #,:| $,:| %,:| &,:| ',:| (,:| ),:| *,:| +,:| ,,:| -,:| .,:| /,:| 0,:| 1,:| 2,:| 3,:| 4,:| 5,:| 6,:| 7,:| 8,:| 9,:| :,:| ;,:| <,:| =,:| >,:| ?,:| @,:| A,:| B,:| C,:| D,:| E,:| C| C| C| C| C| C| C| C| C|  C|  C|  C|  C|  C| C| C| C| C| C| C| C| C| C| C| C| C| C| C| C| C| C| C|  C| !C| "C| #C| $C| %C| &C| 'C| (C| )C| *C| +C| ,C| -C| .C| /C| 0C| 1C| 2C| 3C| 4C| 5C| 6C| 7C| 8C| 9C| :C| ;C| <C| =C| >C| ?C| @C| AC| BC| CC| DC| EC| L| L| L| L| L| L| L| L| L|  L|  L|  L|  L|  L| L| L| L| L| L| L| L| L| L| L| L| L| L| L| L| L| L| L|  L| !L| "L| #L| $L| %L| &L| 'L| (L| )L| *L| +L| ,L| -L| .L| /L| 0L| 1L| 2L| 3L| 4L| 5L| 6L| 7L| 8L| 9L| :L| ;L| <L| =L| >L| ?L| @L| AL| BL| CL| DL| EL| LV| LV| LV| LV| LV| LV| LV| LV| LV|  LV|  LV|  LV|  LV|  LV| LV| LV| LV| LV| LV| LV| LV| LV| LV| LV| LV| LV| LV| LV| LV| LV| LV| LV|  LV| !LV| "LV| #LV| $LV| %LV| &LV| 'LV| (LV| )LV| *LV| +LV| ,LV| -LV| .LV| /LV| 0LV| 1LV| 2LV| 3LV| 4LV| 5LV| 6LV| 7LV| 8LV| 9LV| :LV| ;LV| <LV| =LV| >LV| ?LV| @LV| ALV| BLV| CLV| DLV| ELV| _| _| _| _| _| _| _| _| _|  _|  _|  _|  _|  _| _| _| _| _| _| _| _| _| _| _| _| _| _| _| _| _| _| _|  _| !_| "_| #_| $_| %_| &_| '_| (_| )_| *_| +_| ,_| -_| ._| /_| 0_| 1_| 2_| 3_| 4_| 5_| 6_| 7_| 8_| 9_| :_| ;_| <_| =_| >_| ?_| @_| A_| B_| C_| D_| E_|                                vz vz vz vz vz vz vz vz vz  vz  vz  vz  vz  vz vz vz vz vz vz vz vz vz vz vz vz vz vz vz vz vz vz \ \ \ \ \ \ \ \ \  \  \  \  \  \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  \ !\ "\ #\ $\ %\ &\ '\ (\ )\ *\ +\ ,\ -\ .\ /\ 0\ 1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ :\ ;\ <\ =\ >\ ?\ @\ A\ B\ C\ D\ E\ F\ G\ H\ I\ J\ K\ L\ M\ N\ O\ P\ Q\ R\ S\ T\ U\ V\ W\ X\ Y\ Z\ [\ \\ ]\ ^\ _\ `\                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ `            $q $q $q $q $q $q $q $q $q  $q V V V V V V V V V  V <> <> <> <> <> <> <> <> <>  <> t 5 t 5 t 5 t 5 t 5 t 5 t 5 t 5 t 5  t 5 l(W l(W l(W l(W l(W l(W l(W l(W l(W  l(W =' =' =' =' =' =' =' =' ='  =' 4 4 4 4 4 4 4 4 4  4  4 $ $ $ $ $ $ $ $ $  $  $  $  $  $ $ $ $ $ $ $ $ ĝ  ĝ ĝ ĝ ĝ ĝ \ \ \     T z    , , , $ ! l  z , , , , ,  ,     ,  ܊ Ly Ly DATA`,4 d lQ $Ps ^ L# 9Z@ 4YX dw DSX XX > , DATA$DSX tTX qDADADADA??  9R(b@ , , J V DATA$tTX UX DSX 0C0Cð?@*)`@ D.  ˨    L $!>  N DATA˨  L VIEW3D_PT_tools_transformVIEW3D_PT_tools_transformTransforme&DATA  ˨ 4 VIEW3D_PT_tools_objectVIEW3D_PT_tools_objectEditDATA  lP VIEW3D_PT_tools_historyVIEW3D_PT_tools_historyHistoryDATAH ToolsDATA$UX VX tTX CC CC?@S)*"`@ d d zs | DATAd la@ VIEW3D_PT_last_operatorVIEW3D_PT_last_operatorLink Nodes'DATA$VX XX UX "C"CĢ?@kS+[@ ^ t[ ܊ T/^ $zs DATA܊ ܋ $\@ VIEW3D_PT_transformVIEW3D_PT_transformTransform|l&DATA܋ < ܊ ]@ VIEW3D_PT_gpencilVIEW3D_PT_gpencilGrease PencilUDATA< < ܋ ؐ VIEW3D_PT_view3d_propertiesVIEW3D_PT_view3d_propertiesViewDATA< l < lڐ VIEW3D_PT_view3d_cursorVIEW3D_PT_view3d_cursor3D Cursor~`DATAl l < Tܐ VIEW3D_PT_view3d_nameVIEW3D_PT_view3d_nameItemB$DATAl DZ l <ސ VIEW3D_PT_view3d_displayVIEW3D_PT_view3d_displayDisplay*DATADZ |z l $ VIEW3D_PT_view3d_shadingVIEW3D_PT_view3d_shadingShadingDATA|z r DZ VIEW3D_PT_view3d_motion_trackingVIEW3D_PT_view3d_motion_trackingMotion TrackingDATAr T/^ |z VIEW3D_PT_background_imageVIEW3D_PT_background_imageBackground ImagesDATAT/^ r VIEW3D_PT_transform_orientationsVIEW3D_PT_transform_orientationsTransform Orientations DATA$XX VX jS,D[@ O N Dw DATAXDw t2>U;>o??3?33G׿Jq??3?3BG??t2>F2n;T;>ꉖt22ʪ׾/?R@4@CBG??DjooCj>o-5Gj4IB?&?&?lPqoꉖ.&G=/*ݳo3n;>j&>/?3(k?3(k?3(k?HB?*@?5?5*@֪H<3B3G׿A5?5=??DATA,4YX w 333?? AL>\ ?? B?=zD4(1 DATA$NX OX @jDADADADA?? 9Rq@ DATA$OX PX NX S n@ DATA$PX RX OX Slq@ DATA$RX PX BB3x.4xn@]@Sm@ DATA$)w dw 4YX NX RX @az Ly dA>d>ddd/@DATA$w w VDADADADA?? l@ DATA$w w w pC%pCt?@L@ g/ L- DATA$w 4w w DHBe6DHB1DDBDDB?? 2222@ DATA$4w w MCbDc??~@ DATA<dw w w 4w w 4 Y DATAw Save As Imageile/home/philipp/projekte/toastfreeware/confclerk/src/icons/alarm-off.png 0SN<> t 5 V SRGame Logic.001W L \Z Lk/ :4 5 Ly DATAW |^ DATA|^ @3 W DATA@3  >[ |^ ~DATA >[ pV @3 ~DATApV $z >[ DATA$z lsV pV ~DATAlsV <. $z DATA<. \Eo lsV DATA\Eo  <. DATA 5[ \Eo ~DATA5[    @DATA  , 5[ @DATA, L  DDATAL , DDATA\Z $\Z @3 |^ DATA$\Z D\Z \Z pV |^ DATAD\Z TX $\Z @3 $z DATATX tX D\Z pV $z DATAtX X TX pV lsV DATAX L$? tX lsV <. DATAL$? l$? X >[ \Eo DATAl$? $? L$? <. \Eo DATA$? \ l$? lsV W DATA\ | $? W \Eo DATA|  \ $z  DATA ԚV | >[  DATAԚV V  <. DATAV V ԚV 5[  DATAV R V $z  DATAR R V 5[  DATAR S R lsV , DATAS  k/ R 5[ , DATA k/ ,k/ S pV L DATA,k/ Lk/ k/  L DATALk/ ,k/ , L DATA`:4 y pV |^ @3 $z ~T T 5 5 DATA$5 5 DADA~DADA?? ~DATA$5 5 mED@poo?? pDATA`y | :4 \Eo <.  >[ !~^< < 5 D5 DATA$5 D5 CACA]CACA?? ^^!~r^DATA$D5 5 C=CM^qNLq?@ ^rMr!~q^rt 5 w DATAt 5 t 5 BUTTONS_PT_contextBUTTONS_PT_contextContextL$DATAt 5 w t 5 RENDER_PT_renderRENDER_PT_renderRenderL=DATAw w t 5 RENDER_PT_layersRENDER_PT_layersLayersoLDATAw w w RENDER_PT_dimensionsRENDER_PT_dimensionsDimensionsLDATAw w w RENDER_PT_antialiasingRENDER_PT_antialiasingAnti-Aliasing:L:DATAw w w RENDER_PT_motion_blurRENDER_PT_motion_blurSampled Motion Blur"LDATAw w w RENDER_PT_shadingRENDER_PT_shadingShading LDATAw w w RENDER_PT_performanceRENDER_PT_performancePerformanceLDATAw w w RENDER_PT_post_processingRENDER_PT_post_processingPost ProcessingLDATAw w w RENDER_PT_stampRENDER_PT_stampStampL DATAw w w RENDER_PT_outputRENDER_PT_outputOutput(L DATAw w RENDER_PT_bakeRENDER_PT_bakeBakeL DATA< DATA`|  y W lsV <. \Eo  $w $w w w DATA$w w JCADADADA??   DATA$w w w \CKCqq?@ rrrw w DATAw LOGIC_PT_propertiesLOGIC_PT_propertiesProperties$DATA$w w DpCPDƶ¸C3Dq22q??FF?? Dr3`DrDATA4$w DATA`  | 5[  $z  A~ >]w w dw w DATA$dw w CADA=@DA@DA?? >>A~>DATA$w dw CCDVD=B #<zD >C>CA~>CDATAw  DATA` 5 , L  5[ E?]dT dT \w w DATA$\w w @qDA~DA~DA~DA?? E?DATA$w w \w C@FCF++?@ ,EECDATA$w w w CfCww?@ xfE?"DATA$w w w 4Cm#Cmã?@ ??DATA$w w E?CT DATAXT #=K(=o?????????#=K(=o?5ApykA?????#=K(=o?t@t@t@??5A9P=A\>7?8˔?DATA,dT 333?? AL>\ ?? B?=zD DATA`5  lsV pV L , CD]T T T T DATA$T T CACACCACA?? DDCDDATA$T T CC@ 3DB22B?? DC31CDCDATAT WV DATA WV | DATA| Ly Ly Ly Ly $  vz \  Ly SNt 5 l(W <> SRScriptingg.001lY . . W V Lz Ly DATAlY  mY DATA mY ,mY lY DATA,mY l mY ~DATAl 4l ,mY ~DATA4l Tl l DATATl 9 4l ~DATA9 9 Tl DATA9 : 9 DATA: uY 9 hDATAuY uY : hDATAuY uY uY hDATAuY . uY DATA. . uY ~DATA. . DATA. = mY ,mY DATA= > . mY 4l DATA> <> = ,mY Tl DATA<>  > 4l Tl DATA  <> 9 Tl DATA < 9 l DATA<   lY : DATA ̹ < : 4l DATA̹  uY 9 DATA $5 ̹ uY 9 DATA$5 D5 uY : DATAD5 d5 $5 uY uY DATAd5 #i D5 uY 9 DATA#i #i d5 uY 9 DATA#i $i #i Tl . DATA$i | #i l . DATA|  $i uY . DATA  | 4l . DATA W  9 . DATAW W  uY . DATAW W W uY : DATAW W lY 9 DATA`V T 4l mY ,mY Tl ~] lT T DATA$lT T DADA~DADA?? ~DATA$T lT DBDBnBomB?? CnC~CDATA`T T V 9 uY . l ~4G 4G 4T dT DATA$4T dT CACACACA?? ~DATA$dT 4T C=C4}~|?@ }~T T DATAT T BUTTONS_PT_contextBUTTONS_PT_contextContext|$DATAT T T RENDER_PT_renderRENDER_PT_renderRender|=DATAT T T RENDER_PT_layersRENDER_PT_layersLayerso|DATAT T T RENDER_PT_dimensionsRENDER_PT_dimensionsDimensions|DATAT T T RENDER_PT_antialiasingRENDER_PT_antialiasingAnti-Aliasing:|:DATAT T T RENDER_PT_motion_blurRENDER_PT_motion_blurSampled Motion Blur"|DATAT T T RENDER_PT_shadingRENDER_PT_shadingShading |DATAT T T RENDER_PT_performanceRENDER_PT_performancePerformance|DATAT T T RENDER_PT_post_processingRENDER_PT_post_processingPost Processing|DATAT T T RENDER_PT_stampRENDER_PT_stampStamp| DATAT T T RENDER_PT_outputRENDER_PT_outputOutput(| DATAT T RENDER_PT_bakeRENDER_PT_bakeBake| DATA4G DATA`T r T uY . 9 uY i?p p T Tl DATA$T ,T @qDA=DA=DA=DA?? iDATA$,T \T T C@FCF++?@ ,%DATA$\T $k ,T CfCww?@ xf"DATA$$k Tl \T #C#Cyy?@ zhDATA$Tl $k %m DATAXm ?J?PףD>3;Q?Fwi?JF>#,TY!e?*=>o?E>Fwi?TY5;JF>!e?Q?#,+=>`DAoy@?>ޠQQuZ?> .>#,>m6uU?F +!>?`5hąC% ÈG6DWѦCGBD>3;Q?Fwi?JF>#,TY!e?*=>o?>ޠQQuZ?> .>#,>m7?8˔oAk;?DATA,p 333?? AL>\ ?? B? #<C DATA`r |v T lY : uY 9 gh u u r s DATA$r s CADADADA?? DATA$s r D3CDCMM?? NNgNDATAt 4#> DATA4#> DATAh u t t >>> pythonDATA`|v Lz r uY 9 Tl . ~Dy Dy v x DATA$v x CACACACA?? ~DATA$x v CC}||?? }~DATADy  DATA T DATAT Ly Ly Ly Ly $  vz \  Ly DATA`Lz |v : 4l . uY i ?} } z { DATA$z { CA>DA=DA=DA?? iDATA${ z DDD)dD.>CC$ #<zD %%%DATA}  =z||SNl(W =' t 5 SRUV EditingdW   T T Ly DATAdW W DATAW W dW DATAW   W ~DATA  ,  W ~DATA,  L   DATAL   ,  ~DATA  L  DATA  DATA d>ddd?DATA`T     L   ~,<' ,<'  č DATA$ 4 @qDAmDA@mDA@mDA?? ~DATA$4 d  CVCVWW?@ XXhXd d DATAd VIEW3D_PT_tools_objectmodeVIEW3D_PT_tools_objectmodeObject ToolsDATA$d  4 !CfC[Zww?@ xxhx"  DATA VIEW3D_PT_last_operatorVIEW3D_PT_last_operatorOperatorDATA$ č d #C~#C~  ?@  ~~DATA$č  i~ DATAX H?? JLD>3;Q?Fwi?JF>#,TY!e?*=>_?E>Fwi?TY4;JF>!e?Q?#,+=>6@_?? ?0QQ?X>?>#,>ՒΜz?T*=dbR@_@y\>,? (K5>}Q?sMd@JWA.Xj@-@D>3;Q?Fwi?JF>#,TY!e?*=>_? ?0QQ?X>?>#,>ՒΜz?T*=dbR@_@>>>?\>7?8˔_@r:?DATA,,<' 333?? AL>\ ?? B?=C SN=' l(W SRVideo Editing\>' ?' ?' A' T T' Ly DATA\>' |>' DATA|>' >' \>' DATA>' >' |>' DATA>' >' >' DATA>' >' >' DATA>' ?' >' DATA?' ' \DATA' >' DATA?' @' ?' |>' >' DATA@' <@' ?' >' >' DATA<@' \@' @' >' >' DATA\@' |@' <@' >' ?' DATA|@' @' \@' \>' ' \?' DATA@' @' @' ' ?' DATA\A' |A' ' >' DATAA' A' |A' >' \?' DATAA' A' A' ?' ?' DATAA' A' A' >' |?' DATAA' A' ?' |?' DATA`T |D' >' |>' >' >' Z' Z' B' LC' DATA$B' LC' DA DADADA?? DATA$LC' B' mEmEpoo?? pDATA`|D'  H' T \>' ' CDDG' DG' D' F' DATA$D' F' DA DADADA?? DATA$F' D' @~CHBpF}CHB)?HB|HHB= AH*C*DATADG' DATA` H' 4N' |D' ' \?' ?' /]0f\S' \S' N' ,R' DATA$N' O' @YDAA7 DA/ DA DA?? 00/]v0DATA$O' P' N' HCpHCKK?? L:wLDATA$P' ,R' O' //wDATA$,R' P' C@zC AKVVKo:o:|HPCGiWL/wWLDATA\S' ' ?' 1]fY' Y' U' X' DATA$ U' ??_???BLENDER_RENDER Z//@D?fC??pQ @ X LV < ?=>L>I?fff?@?@Aff?AA@?A <@@L???&NoneDefault?sRGBsRGBDATAl_ doZ doZ DATAldoZ cyclesd d DATAld volume_bouncesDATA D . DATAD 0  z DATA0 <0 D , DATA<0 d0 0  DATAd0 d <0 T DATAd  d0 zJĝ DATA  d Z` DATA W .\ DATAW W $ DATAW W . DATAH[' d%W %W V ?o:=o:L| P2 HB2 B2 HB2 HB2 HB2 HB2 HB>? #<==ff??AHz?=???C#y??#y???1I?=¸=I??I@DATA0d%W ̚{ DATA0%W ̚{ DATADV | ddDATA4 Y With SkyerrDATAY 4 No Skyayer?=(@DATADT]' k NTCompositing Nodetree> CompositorNodeTreeC%UC^' $8z `z l2 $DATA^' fb' Z CompositorNodeDilateErodeDilate/Erode???<`' <`' |a' |a' ϋ   Z9Cz9CCB(BZ9ChCpBz9CBZCChCDATA4<`' e MaskMask> NodeSocketFloatFactorZ9CBq l2 ?DATAq ?DATA4|a' e  MaskMask<> NodeSocketFloathCq=C  DATA  DATA  j^' ^' <`' |a' DATAϋ DATAb' fh' ^' K ͨ CompositorNodeCompositeComposited???Td' f' :CCC9C(B:CD]CC:CIDCCDATA4Td' ee' $ ImageImage> NodeSocketColor:CC `z ??DATA ?DATA4e' ef' Td' zW AlphaAlpha> NodeSocketFloatFactor:CC az ??DATA ??DATA4f' ee' @ ZZ> NodeSocketFloatFactor:C33lCDd ,az ??DATADd ??DATAh' f$8z b' \ @ CompositorNodeRLayersRender Layers&???z 6z Ly ZoCCB(BZ,TCoCCP,33C33CDATA4z eDz ImageImage> NodeSocketColor,C ??DATA ?DATA4Dz ez z tY AlphaAlpha<> NodeSocketFloat,šC, ?DATA, ?DATA4z ez Dz $. ZZ <> NodeSocketFloat,šC ?DATA ?DATA4z e$z z - NormalNormall> NodeSocketVectorz ?DATAz ?DATA4$z ez z V UVUVl> NodeSocketVectordz ?DATAdz ?DATA4z ez $z LjV SpeedSpeedl> NodeSocketVectorz ?DATAz ?DATA4z e$z z Y ColorColor> NodeSocketColorT ??DATAT ?DATA4$z edz z 4\* DiffuseDiffuse> NodeSocketColor3 ??DATA3 ?DATA4dz ez $z  SpecularSpecular> NodeSocketColorUZ ??DATAUZ ?DATA4z ez dz Z ShadowShadow> NodeSocketColorr ??DATAr ?DATA4z e$z z ,3 AOAO> NodeSocketColorV ??DATAV ?DATA4$z ed z z ReflectReflect> NodeSocketColorV ??DATAV ?DATA4d z e!z $z  RefractRefract> NodeSocketColor ??DATA ?DATA4!z e"z d z \ ? IndirectIndirect> NodeSocketColorZ ??DATAZ ?DATA4"z e$$z !z ? IndexOBIndexOB<> NodeSocketFloat( ?DATA( ?DATA4$$z ed%z "z $ IndexMAIndexMA<> NodeSocketFloatdJ ?DATAdJ ?DATA4d%z e&z $$z d MistMist<> NodeSocketFloatY ?DATAY ?DATA4&z e'z d%z ,V EmitEmit> NodeSocketColor\1 ??DATA\1 ?DATA4'z e$)z &z lV EnvironmentEnvironment> NodeSocketColord ??DATAd ?DATA4$)z ed*z 'z < Diffuse DirectDiffuse Direct> NodeSocketColorr ??DATAr ?DATA4d*z e+z $)z | Diffuse IndirectDiffuse Indirect> NodeSocketColor ??DATA ?DATA4+z e,z d*z X Diffuse ColorDiffuse Color> NodeSocketColor ??DATA ?DATA4,z e$.z +z X Glossy DirectGlossy Direct> NodeSocketColor~4 ??DATA~4 ?DATA4$.z ed/z ,z L* Glossy IndirectGlossy Indirect> NodeSocketColorDuY ??DATADuY ?DATA4d/z e0z $.z + Glossy ColorGlossy Color> NodeSocketColorT+; ??DATAT+; ?DATA40z e1z d/z r Transmission DirectTransmission Direct> NodeSocketColor7; ??DATA7; ?DATA41z e$3z 0z r Transmission IndirectTransmission Indirect> NodeSocketColor ??DATA ?DATA4$3z ed4z 1z <4 Transmission ColorTransmission Color> NodeSocketColor ??DATA ?DATA4d4z e5z $3z |4 Subsurface DirectSubsurface DirectH> NodeSocketColor{ DATA{ DATA45z e6z d4z d Subsurface IndirectSubsurface IndirectH> NodeSocketColorW DATAW DATA46z e5z  Subsurface ColorSubsurface ColorH> NodeSocketColorLsZ DATALsZ DATA$8z fh'  @ CompositorNodeRLayersRender Layers.0017 ???9z _z Ly W@1CCB(BW@1CCMBDATA49z e:z D ImageImage> NodeSocketColor _C ??DATA ?DATA4:z e< NodeSocketFloatffB ?DATA ?DATA4< NodeSocketFloatffB0 ?DATA0 ?DATA4|=z e>z < NodeSocketVector>z ?DATA>z ?DATA4>z e<@z |=z T% UVUVl> NodeSocketVector@z ?DATA@z ?DATA4<@z eAz >z <= SpeedSpeedl> NodeSocketVector|Az ?DATA|Az ?DATA4Az eBz <@z |= ColorColor> NodeSocketColor,2> ??DATA,2> ?DATA4Bz eDz Az NodeSocketColortY ??DATAtY ?DATA4Dz e\Ez Bz |Z SpecularSpecular> NodeSocketColor ??DATA ?DATA4\Ez eFz Dz 8 ShadowShadow> NodeSocketColorT ??DATAT ?DATA4Fz eGz \Ez $: AOAO> NodeSocketColor ??DATA ?DATA4Gz eIz Fz P* ReflectReflect> NodeSocketColorL4 ??DATAL4 ?DATA4Iz e\Jz Gz LQ* RefractRefract> NodeSocketColor|, ??DATA|, ?DATA4\Jz eKz Iz N IndirectIndirect> NodeSocketColorW ??DATAW ?DATA4Kz eLz \Jz N IndexOBIndexOB<> NodeSocketFloatRr ?DATARr ?DATA4Lz eNz Kz ]5 IndexMAIndexMA<> NodeSocketFloatt ?DATAt ?DATA4Nz e\Oz Lz _5 MistMist<> NodeSocketFloat ?DATA ?DATA4\Oz ePz Nz D[ EmitEmit> NodeSocketColorvY ??DATAvY ?DATA4Pz eQz \Oz [ EnvironmentEnvironment> NodeSocketColor0 ??DATA0 ?DATA4Qz eSz Pz [ Diffuse DirectDiffuse Direct> NodeSocketColorY ??DATAY ?DATA4Sz e\Tz Qz Ħ Diffuse IndirectDiffuse Indirect> NodeSocketColor ??DATA ?DATA4\Tz eUz Sz  Diffuse ColorDiffuse Color> NodeSocketColor! ??DATA! ?DATA4Uz eVz \Tz D Glossy DirectGlossy Direct> NodeSocketColor6> ??DATA6> ?DATA4Vz eXz Uz zT Glossy IndirectGlossy Indirect> NodeSocketColor,r ??DATA,r ?DATA4Xz e\Yz Vz |T Glossy ColorGlossy Color> NodeSocketColorW ??DATAW ?DATA4\Yz eZz Xz \}T Transmission DirectTransmission Direct> NodeSocketColor8 ??DATA8 ?DATA4Zz e[z \Yz ~T Transmission IndirectTransmission Indirect> NodeSocketColorWZ ??DATAWZ ?DATA4[z e]z Zz C* Transmission ColorTransmission Color> NodeSocketColorLW ??DATALW ?DATA4]z e\^z [z D* Subsurface DirectSubsurface DirectH> NodeSocketColord. DATAd. DATA4\^z e_z ]z NodeSocketColorR DATAR DATA4_z e\^z |G* Subsurface ColorSubsurface ColorH> NodeSocketColor DATA DATA `z jaz h' b' z Td' DATA az j,az `z ^' b' |a' e' DATA ,az jl2 az h' b' z f' DATA l2 j,az $8z ^' :z <`' IM(az IMRender Result$ ڃX??DATA(  ` `fz  DATAfz DATA CA CACameraamera.001?=B B@?BALAvz "܊ LALamp ????@A6?>??txz .?A?@@L=@ ???o:??????@????? AL DATAPtxz ????C?55?55?yz ??????DATAyz ??DATA(L LA܊ "vz 6@LALamp.001 ????@A6?>??| .?A?@@L=@ ???o:??????@????? A DATAP| ????C?55?55?ԍ ??????DATAԍ ??DATA( WO$ $tWOWorld???6$<6$<6$<??A @A@pA A?L= ף;>? ף;̏ DATA(̏   OB  OBball.disabled, ˨    ! ! 4q =?> A\B??????@???T=U d &DATA4q , DATAH1*f>??????????o?l˱Yj1?)Yj>o? :2>?? "? ?~"?~?O0.[+?????o?1Yj>l˱?Yj[`o?Y-?n2}?o?cy2Xj>íB6gch?٧=cyWY-?́0}?d? #=?>=?> A\B??????@???xT=d  &DATADs  DATAd DATAp:Z SSubsurfLy p] OB, ĝ  OBbody.disabled #[    $W X R* *@???????????"? ?~"? ~?O0).[퓫?-D45ӻ+ӻ+?-D4*@5`+?????? "? ?~"?~?O0.[+??_}%Ip3}%A6gcy?I%cyC6gO0́4?d? #=?>=?> A\B??????@???0 ,q &DATA , DATAR* DATA|$W vX "ScrewLy @DATApX S$W SubsurfLy p OBĝ \ , OBbody.enabledT ~    8i L*Z ,z L5> HB?*@??????????o?l˱Yj1?0Yj>o?H1*f>?-D45ӻ+ӻ+?-D4*@5`+?????o?1Yj>l˱?Yj[`o?}="I?o?cy2Xj>íC6gch?ا=cyW}=́I?d? #=?>=?> A\B??????@???z z &DATA,z  DATAL5> DATA|8i vL*Z "ScrewLy @DATApL*Z S8i SubsurfLy x OB\  ĝ OBCameraamera.001   ́??????6?xI%a}%?????a}%xIa}%C6gcy?xI%cyC6ǵ??????!0/,1?]2q1m:?!/5??a}%xI%a}%C6gcyxIcy?B6gO&Dvj|??/5 j/5?Yj!?t pB8r F3?d???>6 ?u=> A\B?????4^ DATA4^ ??=L> ף<OB  \ OBLamp vz   HԎ% R??????{&?W+b=?????6씾t? bfE9L"?%?_>oK?HԎ% R??????22?3?'4'?5씾fE&?t?:L_> b"?oK?#@:Ws@?6씾fE%?YP"? 9?kL|n=,Ⱦ(V#:n@?Dd?<?>">u=> A\B??@???,d DATA,d ??=L> ף<OB $  OBLamp.001 ܊   &@JuJ @??????{&?W+b=?????6씾t? bfE9L"?%?_>oK?&@JuJ @??????22?3?'4'?5씾fE$?t?7L_> b$?oK?DU@-P?6씾fE'?YP"? 9?kJ|n=.ȾHk>瓴'L?Dd?<?>">u=> A\B??@???, DATA, ??=L> ף<OB$   OBPlane\ !P!   P < &\́??????_71V,I?????5?}#6X0?5}#6X0?UcyD6gC&??????????5?5E(\2}#}#cy5X0?6X0?B6g%%&%E(ܿ?5?55?5?CTeo2,1?s3F3@?d? #=?>=?> A\B??????@???PP&DATAP DATA< OB T $ OBring.disabledDY z   Y X *@??????ɿ?????-D45ӻ+-D4ӻ+?*@?????????-D45ӻ+ӻ+?-D4*@5`+?.D45Ի+cyI6gH6g>kP5cy*@ܗ6́?d? #=?>=?> A\B??????@???2f> dN &DATAY , DATAX OBT  OBring.enabledl z   2 d HB?*@??????ɿ4?ٱ????Dj1oo$*Dj>G?v4HB?*@?????????DjoG1$*?oDj>v4<@|9?Djo0gh>,6gW>rcy=@ź?d? #=?>=?> A\B??????@???#f>k Z &DATA2  DATAd MA, &, MABronzel.001L?"???????????L??????????????? #<2L>??L>???2?? ף; ף;C@C@ ????????@?=?==???>X ???????L==ff?????DATA(>X  FG$ DATA$ 33ff33         f3         f  !!     f %(**+)(&$!    f%,0!2#3#3$2#1"0!- +)%"    f)2#6&9(:););):(9(7'5%3#0!-)&#   f$5%;*?,A-B.B.B.A-@->+<*9(6&3$0",)%!  3 f8'@,D0G2I3J4J4I3H3G1E0C/@-=+:(6&2#/!+'"  6&B.H3M6O7Q8Q9Q8P8O7M6K5I3F1C/?,<*8'4%1",(#  ffC.L5Q9T;W=X=X>X>W=V<T;R9O7L5I3E0A.>+:(6&1#-(#  1"L5T;Y>\@^B_C_C_B^B]A[?X>U<R9O7K5G2C/?,;)7&2#-("   fF1U<\AaDdFfGfHgHfGeFcEaD^B[@X>T;Q8M5H3D0@-;)7&2#,'  ffP8]AdFhIkKmLmMmLmLkKjJgHdFaD^BZ?V<R9M6I3E0@-;)6&1"+$ fY>dFkKpNrPtQtQtQsQrPpOnMkKhIdF`C\@W=S:N7I3D0?,:)4%. (! . _CkKrPvSyUzV{V{VzVzVxUvSrQnNjJeGaD\AW=S:N6I3D/>,8'2#,$ /!eFqOxT}WYZ[\\]^]}ZxUqPlLgHaD\@W=R9M6H2B.<*6%/!' 0!jJvS~X[^_`beknnia|YsRlLfHaD\@W=Q9K5E0?,9(1"*!  fmL{V\_bcejr~)-(se|YrQkKeG`CZ?U;O7H3B.;)4$,#  3nMY_cehks Ø3ԪGدṆE1tbyVpOjJcF^BX=R9L5E0>+6&. %fkK[bfikp|(ۯFcoḅE(k[uRnMgHaD[@U;N7G2@-7'/!%3A-Zchlntǘ+Oo|pܲP.p_yVqOjJdF^BW=P8I3A-9(0!& 3XdjnquƖ&EaoeٮI*q`|WuRnMgH`CY?R9J4B.9(0!# ]A̍ckoru| ѡ/ENHț4m aYwSpNiIbEZ?S:K4B.9(. 3^ipsuy ȗ&ʚ+Ô'wi`ZyUrPkKcE[@S:J4A.7&)31"fensuwz~ ~v nf`[zUsPkKcE[?R9I3?,2#N6hptvwwwvtoje`[{VsPjJbDY?P8F1:(3P8iptuutrpmid_ZyUqOiI`CV<L5?,&3N7gnqrqpnkgc^YwSnMeF[?P8B. 3^gklkjgc_[zUrPhI]AQ86&fI3gH̉`bb`]YxTqOfH[?@-f3. fH2H3\@X=Q86&#f 3MA,, &l  MAinactive1N=́=ɠ=??????????L??????????????? #<2L>??L>???2?? ף; ף;G@G@ ????????@?=?==???>X ???????L==ff?????DATA(>X  d DATAd 33 ff33  f3  f f  f ff 3f ff  fff f    f 3f3  3   33f  3  3  3 f   f3f    f3MA,l &, MANoeriale&?e&?e&???????????L??????????????? #<2L>??L>???2?? ף; ף;G@G@ ????????@?=?==??? ???????L==ff?????DATA(    DATA !!!3!!!3cccccccccBBBfBBBf!!!3!!!3ccc̦BBBf!!!3cccBBBf̦BBBfccccccBBBfcccBBBfBBBf̦!!!3BBBfBBBfBBBf̦BBBfBBBfBBBfcccBBBfccccccccccccBBBfccc!!!3BBBf!!!3cccccc!!!3ccc̦!!!3!!!3BBBfccccccccc!!!3ccc!!!3cccccc!!!3BBBfccc̦BBBf!!!3BBBfcccccc̅̅cccBBBf!!!3ME 1 MEballheres  l  t  t     l  *xPO???C ?DATAs DATAt t DATAHt 7*)d>d· g\<۾ g8 g<> gld>d·> g\JC<>۾ g>`#>9d캾d· g>b=9d캾d·> g>bJC=9<>> g>`#l>98 > g>{r=9)?eݧ0)۾5[>w۾p6s>оχ!t[>w>۾p6'2>qχl χq۾ƱL)uχeݧ0)>۾5?ƱL)>uχ?>>χ!gi>>y'i>ys֗>о;Ks)֗оŴsiEsi>E'֗>Ŵg)?֗>>;KgƱ>L)uχ>XJCоχ>[tJC2۾qχ>JC>χ>[ތgJCƱ>L)>uχ>X?JC χ>q>JCleݧ=0)>l[w>sl[w>>ɍ'leݧ=0)>>?lDATA  DATA 4x # # # ################# ### ############# ## ## # #!#!#"#"# #### $# $# %# %#&# &#'# '# (#(# )# )# # # # # ### # ###################### ## #!##!#"##"######$##$# &# %#%&#!'#!&#&'#"(#"'#'(##)##(#()#$%#$)#%)#DATAl  NGon Face-Vertexl  DATAl  : < = ><>   = ? @A? A @  BC DB D   CEFGEG  FHIJHJIKLMK ML NOPNPO QRSQSR "TUVT#V!U 'WXYW &Y$X% (Z[\ Z ) \[!*]^_!]+!_^"-!`ab"`,"ba #. $cde#c/#e#d%"$1 fgh$f 0$h&g'&4( i j%k&i 5&k%3%j ) 2'6*!l!m&n'l 7'n&5&m!+4(9-"o"p'q(o 8(q'7'p",6): .#r#s(t)r ;)t(8(s#/9%2 1$u$v)w%u 3%w);)v$0 :DATA NGon Face DATA 9P  !$'*-0369<?BEHKNQTWZ]`cfilorux{~ME 1!  MEbodyTOr q l    ???O ?DATATOr DATA q DATAq 7 ?4ہ>}D?3[%?T`f~?~4=/dL?4\%?Iic>4? {4ί?]? 3?%Rzɦ>Ӽ3b?~߾3P@?4>i3 p?Mz4UDATA l DATAxl 4   ME! 1z  MEPlane[ lOs  L  L& L(  z  z ???C ?DATA[ l DATAL& L DATAPL 7Ap?>=81Ap?>ҽ2Ep>ҽ8ñ>p>=DATAL(  DATA0 4####DATAz NGon Face-Vertex DATA  :DATAz NGon FacelOs DATA lOs 9MEz 1! MEring.001lV  DB{ <{ z 4z z 4z  D@{  <{  @ >>=C ?DATA DATAz z DATAz 7 >>L=o>43>\=Bm>=>\= pބZ>L=ޑ8AL>ga#ބZ>LޑȾ>\>̽ 43>\BY>Lo+V>H={ !$2>N=L=k> >=\=?m]>==Fw>탄=\=: pS>=:b=L=8AWE>IT=ha#^S>=:b=LȾFw>탄=\:]>=̽  >=\?Y$2>N=Lk+\>L>n?k>E>L=`7>1>633>\=-9!m>>=caֳ]>>\=h p5>=>=L=8A\1>=ga#'5>=>=LȾֳ]>>\h>>̽ca 1>633>\-9!Yk>E>L`7+А>А>ZZ>>L=NN>Tm}>Vm}>\=..m#9Y>%9Y>=5>5>\=>> p*>+>L= 8A>>ga#*>+>L Ⱦ5>5>\>>#9Y>%9Y>̽ Tm}>Vm}>\..Y>>LNN+L>\>?nE>k>L=7`>333>1>\=!-9m>>=ac=׳]>\=h p݄=6>=>L=Ƞ8A=\1>ga#'݄=6>=>LȠȾ=׳]>\h>>̽ac 333>1>\!-9YE>k>L7`+H=U> !{N=#2>L=k>= >\=?m=]>=탄=Fw>\=: p<:b=S>L=㟕8AIT=VE>fa#^<:b=S>L㟕Ⱦ탄=Fw>\:=]>̽ = >\?YN=#2>Lk+2>uH&3>L=o> 353>\=Bm 2>=2>\= pGc|2ބZ>L=ޑ8AXl2L>ha#Gc|2ބZ>LޑȾ2>\ 2>̽  353>\BYuH&3>Lo+DԽV>ޢ{J̽$2>L=$k>| >\=?m]>=JꃄFw>\=: p::bS>L=8AETWE>ha# !^::bS>LȾꃄFw>\:]>̽J | >\?YJ̽$2>L$k+L\>nEk>L=?Ȓ`>2331>\=-9m>=cٳ]>\=h pۄڽ8>=>L=78A̽\1>ha#?'ۄڽ8>=>L7Ⱦٳ]>\h>̽c 2331>\-9YEk>L?Ȓ`+АА>Z >L='N>Ym}Pm}>\=Qѯ.m'9Y 9Y>= 55>\=+> p-(>L=M 8A>ga#Z-(>LM Ⱦ55>\+>'9Y 9Y>̽  Ym}Pm}>\Qѯ.Y >L'N+\L>'?kE>L=n7>1:33>\=!m>=aֳ]>\=5 p5>==L=`_8A\1=ha#n5>==L`_Ⱦֳ]>\5>̽a 1:33>\!YkE>Ln7+VžC=^ !$2I=L=J> {=\=:m]==VFwꃄ=\=; pS8:b=L=aj8AWEDT=ga#{S8:b=LajȾFwꃄ=\;]=̽V  {=\:Y$2I=LJ+̾03ž&)3L=}>43j3\=mkI2=>.2\== pބZ@2L="n8AL02ga#ބZ@2L"nȾ.2\=kI2̽> 43j3\Yž&)3L}+VžCԽ^$2I̽L=J$> {\=:m]=VJFwꃄ\=; pS8:bL=aj8AWEDTga#{ !S8:bLajȾFwꃄ\;]̽VJ  {\:Y$2I̽LJ$+\L'kEL=n?>1033\=ާm=ڳ]\=5 p8>=ڄڽL=`_78A\1̽ha#n?8>=ڄڽL`_7Ⱦڳ]\5̽ 1033\YkELn?+АА L=''>Ym}Pm}\=QQѧm'9Y 9Y= 55\=++ p-(L=MM8Aga#ZZ-(LMMȾ55\++'9Y 9Y̽ Ym}Pm}\QQY L''+L\'EkL=?n>2331\=Ƨm=ٳ]\=5 pۄڽ8>=L=7`_8A̽\1ha#?nۄڽ8>=L7`_Ⱦٳ]\5̽ 2331\YEkL?n+ZԽTž^`̽"2L=$J> \=:m]=JVFw\=; pP:bSL=aj8A\TUEga# !{P:bSLajȾFw\;]̽JV  \:Y`̽"2L$J+2̾uH&3žL=}> 353\=m 2=>2\== pGc|2ބZL="n8AXl2Lha#Gc|2ބZL"nȾ2\= 2̽>  353\YuH&3žL}+4=Wž !^8=$2L=J>l= \=:m=]=V߃=Fw\=; p':b=SL=aj8A2T=WEga#ޢ{':b=SLajȾ߃=Fw\;=]̽V l= \:Y8=$2LJ+L>\?'E>kL=7n>333>1\=!Ƨm>=a=׳]\=5 p݄=6>=L=`_8A=\1ga#n݄=6>=L`_Ⱦ=׳]\5>̽a 333>1\!YE>kL7n+А>АZ >L=N'>Mm}>_m}\=.Qѧm9Y>-9Y= 5>5\=>+ p%>1L= M8A>ha#Z%>1L MȾ5>5\>+9Y>-9Y̽ Mm}>_m}\.QY >LN'+\>Lnk>EL=`?>1>633\=-9ާm>=cֳ]>\=h p5>=>ڽL=78A\1>̽ga#'?5>=>ڽL7Ⱦֳ]>\h>̽c 1>633\-9Yk>EL`?+V>;Խ{$2>A̽L=k$> >t\=?m]>=JFw>僄\=: pS>/:bL=8AWE><Tga#^ !S>/:bLȾFw>僄\:]>̽J  >t\?Y$2>A̽Lk$+DATA4z 4z DATA4z 4@## ###NZ####de#.:#DE#O[###cd#kw#$%##CD###########AB###/;#Q]#P\###t#bc###########@A#BC##"#####ab##0<#1=#R^##### !##!"#### #`a####2>#S_##my#### ##+7####ij#gh#)*#v# #'(## ##lm#JV###4@#}~#HI####u## ######FG# ###ef##~#%&###<=# ####LX#-9##"##  ### ##FR##fr#\]##]^###Ua#-.#T_### ##### # #EQ####?@#%1#####jv######*+##JK## ###IU#`k#(4#)5# #z{#KL######gs# ##op#######  ## #89#co#YZ###;G#3?####T`#&####tu## ###st####hi# ####RS######NO##&'#y###Xd# #!-#vw##0;#######12#x###BN#####uv##MY###7C#,8# ######~#TU#^j##>J#*###67# ###45####34####_k##56#+#VW##?K##yz########UV### ###no#rs#x#####}###9:#]i#\h#|##78#=I#<H##(#)#{|########CO####[g##pq##'####XY####dp#z#|}####:F#$0#mn# #Z[#%##########./#`l##23######Ye# # ,##AM#8D#QR#OP#6B#####Wc#jk#### ###bn###=>#".#<G#5A##01####Vb#########&2#######,-##>?#LM###s#MN#####eq# #  ###!##$/#^_#######  # ### #ht#iu#xy#HT###+,##'3#####GS#qr##lx#w#####{#WX###KW###/##:;##IJ###nz######DP#########Zf# #*6##()#$##o{##fg####am# ###[\#@L#9E##HS##EF#p|#q}##### ###PQ#######r~###lw##DATA<{ NGon Face-Vertex<{ DATA$<{ : Q 5F5h6h #w0( o Ia a?  H 1 1 8877KKU#U 0 B!(!D"I"5#?#; H$%~~%|& &'kk'_(YY()ZZ)\*""*+44+, ,-!B!-."D"./#5#/$;$z01%%12&|&23''3-4(_(4)5))536*\*6%7V++V7U8,,89--9P: .. :;!//!;0z$0;<=<11<=>M22M>?33?@g4-4g@2A5)5AB636B3C7%7CD8U8D E&99&E*Fy:P:yFuG;;G<;0<WHiIV==VIJ!>>!JK7??7KL%@@%LMA2AMN BB NOcC3CcOP DD P4QE EQRF*FRSGuGS(HW<HTUIiIU@VdJJdV5WKKWXLLXoYMMYZNNZ}[ OO [$\#PP#\]"Q4Q"]^=RR=^_NSSN_TH(T`IaUUa9bV@Vb'cW5WcdXXd eYoYeyfZZfgg[}[gg[hR\$\RhiQ]]QiZj^^jk1__1k`T`lcm aIa m{nb9bnFoc'copsddspiqe eqrfyfrGsggsth[htuiiuvjZjvwkkw>l`lxyPmcmPy9zn{nz{oFo{[|+pp+|u},qiq,}h~;rr;~{sGs&tt&muum8]vv]-wwxl>xHyytz9ztp{{S|[|SeM}u}M~h~/{/282f-fHxp #eBXX=xxv))99  n$,,@@RR :#(B=<7vfdd3$nNOOL  nn:(j_<_7fl`N3 6L*CCXrr^// j..l`S> -6*?qXq:  b^bj JJbKK++S>-aa?.:jbWWAzl==++ *.*%??L]tt11..zA~lq %ALG]>YY)~'88OOEEDqDkkAG>)<'0Jpp`""44  6xx$^ C<C  0  &J&  `  || '' \\6$ ^ :T  T,  v  vm!  !00w //EEQ22F:6T,Teme rrwsws}}o     DATAD@{ NGon FaceDB{ DATA DB{ 9   $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|BRO{ ,Y{ BRAddh.001?W{ ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAPW{ ????C?~6=~.=X{ ??????DATA0X{ ?>k?@? ף=?BR,Y{ b{ O{ BRBlob001?`{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>?>>>>?CCCCCCCCDATAP`{ ????C?._raTb{ ??????DATA0Tb{ ?>ףp?@?u=?BRb{ k{ ,Y{ BRBlur.004?\j{ ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP\j{ ????C?~6=~.=k{ ??????DATA0k{ ?>k?@? ף=?BRk{ Lu{ b{ BRBrush?s{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=??????>!!!L>?>>>>?CCCCCCCCDATAPs{ ????C?._rau{ ??????DATA0u{ ?>ףp?@?u=?BRLu{ ~{ k{ BRClay001?}{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>?>>>>?CCCCCCCCDATAP}{ ????C?._rat~{ ??????DATA0t~{ ?>ףp?@?u=?BR~{  { Lu{ BRClone001?|{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=???333???>!!!>L>???CCCCCCCCDATAP|{ ????C?~6=~.=ԇ{ ??????DATA0ԇ{ ?>k?@? ף=?BR { l{ ~{ BRCrease001?܏{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???>??>!!!>L>?>>>>?CCCCCCCCDATAP܏{ ????C?a2p? 4{ ??????DATA04{ ?>?@? #=?BRl{ ̚{ { BRDarken06?<{ ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP<{ ????C?~6=~.={ ??????DATA0{ ?>k?@? ף=?BR̚{ ,{ l{ BRDraw.001?{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=??????>!!!>L>?>>>>?CCCCCCCCDATAP{ ????C?._ra{ ??????DATA0{ ?>ףp?@?u=?BR,{ { ̚{ BRFill/Deepen001?{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???? ??>!!!>L>??>>??CCCCCCCCDATAP{ ????C?._raT{ ??????DATA0T{ ?>ףp?@?u=?BR{ { ,{ BRFlatten/Contrast001?\{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>??>>??CCCCCCCCDATAP\{ ????C?._ra{ ??????DATA0{ ?>ףp?@?u=?BR{ L{ { BRGrab001?{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????K Kfff?=???L>??>!!!>L>>?>CCCCCCCCDATAP{ ????C?._ra{ ??????DATA0{ ?>ףp?@?u=?BRL{ { { BRInflate/Deflate001?{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>@?@?@?>>>CCCCCCCCDATAP{ ????C?._rat{ ??????DATA0t{ ?>ףp?@?u=?BR{  { L{ BRLayer001?|{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>?>>CCCCCCCCDATAP|{ ????C?._ra{ ??????DATA0{ ?>ףp?@?u=?BR { l{ { BRLighten5?{ ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP{ ????C?~6=~.=4{ ??????DATA04{ ?>k?@? ף=?BRl{ { { BRMixh?<{ ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???333???>!!!>L>???CCCCCCCCDATAP<{ ????C?~6=~.={ ??????DATA0{ ?>k?@? ף=?BR{ ,{ l{ BRMultiply?{ ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP{ ????C?~6=~.={ ??????DATA0{ ?>k?@? ף=?BR,{ { { BRNudge001?{ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???? ??>!!!>L>>?>CCCCCCCCDATAP{ ????C?._raT{ ??????DATA0T{ ?>ףp?@?u=?BR{ | ,{ BRPinch/Magnify001?\| ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>@?@?@?>>>CCCCCCCCDATAP\| ????C?._ra| ??????DATA0| ?>ףp?@?u=?BR| L | { BRPolish001? | ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???????>!!!>L>??>>??CCCCCCCCDATAP | ????C?._ra | ??????DATA0 | ?>ףp?@?u=?BRL | | | BRScrape/Peaks001?| ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???? ??>!!!>L>??>>??CCCCCCCCDATAP| ????C?._rat| ??????DATA0t| ?>ףp?@?u=?BR|  | L | BRSculptDraw?|| ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!wN?L>?>>>>?CCCCCCCCDATAP|| ????C?._ra| ??????DATA0| ?>ףp?@?u=?BR | l'| | BRSmear001?%| ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP%| ????C?~6=~.=4'| ??????DATA04'| ?>k?@? ף=?BRl'| 0| | BRSmooth001?????????????????????????????????E???????L>?????????????????????????????????#Kfff?=??????>!!!>L>@?@?@?CCCCCCCCDATAPףp?@?u=?BR0| ,:| l'| BRSnake Hook001?8| ??????????L>????????????????????????????????E???????L>?????????????????????????????????K Kfff?=???? ??>!!!>L>>?>CCCCCCCCDATAP8| ????C?._ra9| ??????DATA09| ?>ףp?@?u=?BR,:| C| 0| BRSoften01?A| ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=???L>??>!!!>L>???CCCCCCCCDATAPA| ????C?~6=~.=TC| ??????DATA0TC| ?>k?@? ף=?BRC| L| ,:| BRSubtract?\K| ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP\K| ????C?~6=~.=L| ??????DATA0L| ?>k?@? ף=?BRL| LV| C| BRTexDraw?T| ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=???333???>!!!>L>???>>?CCCCCCCCDATAPT| ????C?._raV| ??????DATA0V| ?>ףp?@?u=?BRLV| _| L| BRThumb001?^| ??????????L>????????????????????????????????E???????L>?????????????????????????????????K Kfff?=???? ??>!!!>L>>?>CCCCCCCCDATAP^| ????C?._rat_| ??????DATA0t_| ?>ףp?@?u=?BR_| LV| BRTwist001?|g| ??????????L>????????????????????????????????E???????L>?????????????????????????????????K Kfff?=??????>!!!>L>>?>CCCCCCCCDATAP|g| ????C?._rah| ??????DATA0h| ?>ףp?@?u=?DNA1d>\Pt SDNANAME\*next*prev*data*first*lastxyzxminxmaxyminymax*pointergroupvalval2typesubtypeflagname[64]saveddatalentotallen*newid*libname[66]usicon_idpad2*propertiesid*idblock*filedataname[1024]filepath[1024]*parent*packedfilew[2]h[2]changed[2]changed_timestamp[2]*rect[2]*gputexture[2]*obblocktypeadrcodename[128]*bp*beztmaxrcttotrctvartypetotvertipoextraprtbitmaskslide_minslide_maxcurval*drivercurvecurshowkeymuteipopadpospad1relativetotelemuidvgroup[64]sliderminslidermax*adt*refkeyelemstr[32]elemsizeblock*ipo*fromtotkeyslurphctimeuidgen*line*formatblen*nameflagsnlineslines*curl*sellcurcselc*undo_bufundo_posundo_len*compiledmtimesizeseekdtxpassepartalphaclipstaclipendlensortho_scaledrawsizesensor_xsensor_yshiftxshiftyYF_dofdist*dof_obsensor_fitpad[7]*sceneframenrframesoffsetsfrafie_imacyclokmulti_indexlayerpass*cache*gputexture*anim*rr*renders[8]render_slotlast_render_slotsourcelastframetpageflagtotbindxrepyreptwstatwendbindcode*repbind*previewlastupdatelastusedanimspeedgen_xgen_ygen_typegen_flaggen_depthaspxaspycolorspace_settingsalpha_modetexcomaptomaptonegblendtype*object*texuvname[64]projxprojyprojzmappingofs[3]size[3]rottexflagcolormodelpmaptopmaptonegnormapspacewhich_outputbrush_map_modergbkdef_varcolfacvarfacnorfacdispfacwarpfaccolspecfacmirrfacalphafacdifffacspecfacemitfachardfacraymirrfactranslfacambfaccolemitfaccolreflfaccoltransfacdensfacscatterfacreflfactimefaclengthfacclumpfacdampfackinkfacroughfacpadensfacgravityfaclifefacsizefacivelfacfieldfacshadowfaczenupfaczendownfacblendfacatotipotypeipotype_huecolor_modepad[1]data[32]*ima*cube[6]imat[4][4]obimat[3][3]stypeviewscalenotlaycuberesdepthrecalclastsizefalloff_typefalloff_softnessradiuscolor_sourcetotpointspdpadpsyspsys_cache_spaceob_cache_space*point_tree*point_datanoise_sizenoise_depthnoise_influencenoise_basispdpad3[3]noise_facspeed_scalefalloff_speed_scalepdpad2*coba*falloff_curveresol[3]interp_typefile_formatextendsmoked_typedata_type_padint_multiplierstill_framesource_path[1024]*datasetcachedframeoceanmod[64]outputnoisesizeturbulbrightcontrastsaturationrfacgfacbfacfiltersizemg_Hmg_lacunaritymg_octavesmg_offsetmg_gaindist_amountns_outscalevn_w1vn_w2vn_w3vn_w4vn_mexpvn_distmvn_coltypenoisedepthnoisetypenoisebasisnoisebasis2imaflagcropxmincropymincropxmaxcropymaxtexfilterafmaxxrepeatyrepeatcheckerdistnablaiuser*nodetree*env*pd*vd*otuse_nodesloc[3]rot[3]mat[4][4]min[3]max[3]cobablend_color[3]blend_factorblend_typepad[3]modetotexshdwrshdwgshdwbshdwpadenergydistspotsizespotblendhaintatt1att2*curfalloffbiassoftcompressthreshbleedbiaspad5bufsizesampbuffersfiltertypebufflagbuftyperay_sampray_sampyray_sampzray_samp_typearea_shapearea_sizearea_sizeyarea_sizezadapt_threshray_samp_methodshadowmap_typetexactshadhalostepsun_effect_typeskyblendtypehorizon_brightnessspreadsun_brightnesssun_sizebackscattered_lightsun_intensityatm_turbidityatm_inscattering_factoratm_extinction_factoratm_distance_factorskyblendfacsky_exposureshadow_frustum_sizesky_colorspacepad4[2]*mtex[18]pr_texturepad6[4]densityemissionscatteringreflectionemission_col[3]transmission_col[3]reflection_col[3]density_scaledepth_cutoffasymmetrystepsize_typeshadeflagshade_typeprecache_resolutionstepsizems_diffms_intensityms_spreadalpha_blendface_orientation*uvnameindexmaterial_typespecrspecgspecbmirrmirgmirbambrambbambgambemitangspectraray_mirroralpharefspeczoffsaddtranslucencyvolgamefresnel_mirfresnel_mir_ifresnel_trafresnel_tra_ifiltertx_limittx_falloffray_depthray_depth_traharseed1seed2gloss_mirgloss_trasamp_gloss_mirsamp_gloss_traadapt_thresh_miradapt_thresh_traaniso_gloss_mirdist_mirfadeto_mirshade_flagmode_lmode2mode2_lflarecstarclinecringchasizeflaresizesubsizeflarebooststrand_stastrand_endstrand_easestrand_surfnorstrand_minstrand_widthfadestrand_uvname[64]sbiaslbiasshad_alphaseptexrgbselpr_typepr_lampml_flagmapflagdiff_shaderspec_shaderroughnessrefracparam[4]rmsdarkness*ramp_col*ramp_specrampin_colrampin_specrampblend_colrampblend_specramp_showpad3rampfac_colrampfac_spec*groupfrictionfhreflectfhdistxyfrictdynamodesss_radius[3]sss_col[3]sss_errorsss_scalesss_iorsss_colfacsss_texfacsss_frontsss_backsss_flagsss_presetmapto_texturedshadowonly_flagline_col[4]line_priorityvcol_alphapaint_active_slotpaint_clone_slottot_slotspad4[3]*texpaintslotgpumaterial*temp_pf*bbselcol1selcol2quat[4]expxexpyexpzradrad2s*mat*imatelemsdisp*editelems**matflag2totcolwiresizerendersizethresh*lastelemvec[3][3]alfaweighth1h2f1f2f3hideeasingbackamplitudeperiodpad[4]vec[4]mat_nrpntsupntsvpad[2]resoluresolvorderuordervflaguflagv*knotsu*knotsvtilt_interpradius_interpcharidxkernwhnurbs*keyindexshapenrnurb*editnurb*bevobj*taperobj*textoncurve*keydrawflagtwist_modetwist_smoothsmallcaps_scalepathlenbevresolwidthext1ext2resolu_renresolv_renactnuactvertspacemodespacinglinedistshearfsizewordspaceulposulheightxofyoflinewidthselstartselendlen_wchar*str*editfontfamily[64]*vfont*vfontb*vfonti*vfontbi*tbtotboxactbox*strinfocurinfobevfac1bevfac2bevfac1_mappingbevfac2_mappingpad2[2]*mselect*mpoly*mtpoly*mloop*mloopuv*mloopcol*mface*mtface*tface*mvert*medge*dvert*mcol*texcomesh*edit_btmeshvdataedatafdatapdataldatatotedgetotfacetotselecttotpolytotloopact_facesmoothreshcd_flagsubdivsubdivrsubsurftypeeditflag*mr*tpageuv[4][2]col[4]transptileunwrapv1v2v3v4edcodecreasebweightdef_nr*dwtotweightco[3]no[3]loopstartveuv[2]fis[255]s_lentotdisplevel(*disps)()*hiddenv[4]midv[2]*faces*colfaces*edges*vertslevelslevel_countcurrentnewlvledgelvlpinlvlrenderlvluse_col*edge_flags*edge_creasesradius[3]stackindex*errormodifier*texture*map_objectuvlayer_name[64]uvlayer_tmptexmappingsubdivTyperenderLevels*emCache*mCachestrengthdefaxispad[6]startlengthrandomizeseed*ob_arm*start_cap*end_cap*curve_ob*offset_oboffset[3]scale[3]merge_distfit_typeoffset_typecountaxistolerance*mirror_obsplit_anglevalueresval_flagslim_flagse_flagsmatprofilebevel_angledefgrp_name[64]*domain*flow*colltimedirectionmidlevel*projectors[10]*imagenum_projectorsaspectxaspectyscalexscaleypercentiterdelimitangleface_countfacrepeat*objectcenterstartxstartyheightnarrowspeeddampfallofftimeoffslifetimedeformflagmulti*prevCossubtarget[64]parentinv[4][4]cent[3]*indexartotindexforce*clothObject*sim_parms*coll_parms*point_cacheptcaches*x*xnew*xold*current_xnew*current_x*current_v*mfacesnumvertsnumfacestime_xtime_xnew*bvhtree*v*dmcfraoperationvertextotinfluencegridsize*bindinfluences*bindoffsets*bindcagecostotcagevert*dyngrid*dyninfluences*dynvertsdyngridsizedyncellmin[3]dyncellwidthbindmat[4][4]*bindweights*bindcos(*bindfunc)()*psystotdmverttotdmedgetotdmfacepositionrandom_position*facepavgroupprotectlvlsculptlvltotlvlsimple*fss*target*auxTargetvgroup_name[64]keepDistshrinkTypeshrinkOptsprojLimitprojAxissubsurfLevels*originfactorlimit[2]offset_facoffset_fac_vgoffset_clampcrease_innercrease_outercrease_rimmat_ofsmat_ofs_rim*ob_axisstepsrender_stepsscrew_ofs*ocean*oceancacheresolutionspatial_sizewind_velocitysmallest_wavewave_alignmentwave_directionwave_scalechop_amountfoam_coveragebakestartbakeendcachepath[1024]foamlayername[64]cachedgeometry_moderefreshrepeat_xrepeat_yfoam_fade*object_from*object_tofalloff_radiusedit_flagsdefault_weight*cmap_curveadd_thresholdrem_thresholdmask_constantmask_defgrp_name[64]mask_tex_use_channel*mask_texture*mask_tex_map_objmask_tex_mappingmask_tex_uvlayer_name[64]pad_i1defgrp_name_a[64]defgrp_name_b[64]default_weight_adefault_weight_bmix_modemix_setpad_c1[6]proximity_modeproximity_flags*proximity_ob_targetmin_distmax_distpad_s1*canvas*brushthresholdscalehermite_numbranch_smoothingsymmetry_axesquad_methodngon_methodlambdalambda_borderaxis_uaxis_vcenter[2]*object_srcbone_src[64]*object_dstbone_dst[64]time_modeplay_modeforward_axisup_axisflip_axisinterpdeform_modeframe_startframe_scaleeval_frameeval_timeeval_factoranchor_grp_name[64]total_verts*vertexco*cache_systemcrease_weight*lattpntswopntsuopntsvopntswtypeutypevtypewactbpfufvfwdudvdw*def*editlattvec[8][3]*sourcedistance*sculptpartypepar1par2par3parsubstr[64]*track*proxy*proxy_group*proxy_from*action*poselib*pose*gpdavs*mpathconstraintChannelseffectdefbasemodifiersrestore_mode*matbitsactcoldloc[3]orig[3]dsize[3]dscale[3]drot[3]dquat[4]rotAxis[3]drotAxis[3]rotAngledrotAngleobmat[4][4]constinv[4][4]imat_ren[4][4]laycolbitstransflagprotectflagtrackflagupflagnlaflagipoflagscaflagscavisflagdepsflagdupondupoffdupstadupendmassdampinginertiaformfactorrdampingmarginmax_velmin_velobstacleRadstep_heightjump_speedfall_speedcol_groupcol_maskrotmodeboundtypecollision_boundtypedtempty_drawtypeempty_drawsizedupfacescapropsensorscontrollersactuatorssfactdefgameflaggameflag2*bsoftrestrictflagsoftflaganisotropicFriction[3]constraintsnlastripshooksparticlesystem*soft*dup_groupbody_typeshapeflag*fluidsimSettings*curve_cache*derivedDeform*derivedFinallastDataMaskcustomdata_maskstateinit_stategpulamppc_ids*duplilist*rigidbody_object*rigidbody_constraintima_ofs[2]*iuserlodlevels*currentlodcurindexactiveorco[3]no_drawanimatedpersistent_id[8]*particle_systemdeflectforcefieldshapetex_modekinkkink_axiszdirf_strengthf_dampf_flowf_sizef_powermaxdistmindistf_power_rmaxradminradpdef_damppdef_rdamppdef_permpdef_frictpdef_rfrictpdef_sticknessabsorptionpdef_sbdamppdef_sbiftpdef_sboftclump_facclump_powkink_freqkink_shapekink_ampfree_endtex_nabla*rngf_noise*f_sourceweight[14]global_gravityrt[3]totdataframetotpointdata_types*data[8]*cur[8]extradatastepsimframestartframeendframeeditframelast_exactlast_validcompressionprev_name[64]info[64]path[1024]*cached_framesmem_cache*edit(*free_edit)()linStiffangStiffvolumeviterationspiterationsditerationsciterationskSRHR_CLkSKHR_CLkSSHR_CLkSR_SPLT_CLkSK_SPLT_CLkSS_SPLT_CLkVCFkDPkDGkLFkPRkVCkDFkMTkCHRkKHRkSHRkAHRcollisionflagsnumclusteriterationsweldingtotspring*bpoint*bspringmsg_lockmsg_valuenodemassnamedVG_Mass[64]gravmediafrictrklimitphysics_speedgoalspringgoalfrictmingoalmaxgoaldefgoalvertgroupnamedVG_Softgoal[64]fuzzynessinspringinfrictnamedVG_Spring_K[64]efraintervallocalsolverflags**keystotpointkeysecondspringcolballballdampballstiffsbc_modeaeroedgeminloopsmaxloopschokesolver_IDplasticspringpreload*scratchshearstiffinpush*pointcache*effector_weightslcom[3]lrot[3][3]lscale[3][3]last_framevel[3]*fmdthreadsshow_advancedoptionsresolutionxyzpreviewresxyzrealsizeguiDisplayModerenderDisplayModeviscosityValueviscosityModeviscosityExponentgrav[3]animStartanimEndbakeStartbakeEndframeOffsetgstarmaxRefineiniVelxiniVelyiniVelz*orgMesh*meshBBsurfdataPath[1024]bbStart[3]bbSize[3]typeFlagsdomainNovecgenvolumeInitTypepartSlipValuegenerateTracersgenerateParticlessurfaceSmoothingsurfaceSubdivsparticleInfSizeparticleInfAlphafarFieldSize*meshVelocitiescpsTimeStartcpsTimeEndcpsQualityattractforceStrengthattractforceRadiusvelocityforceStrengthvelocityforceRadiuslastgoodframeanimRatemistypehorrhorghorbzenrzengzenbexposureexprangelinfaclogfacgravityactivityBoxRadiusskytypeocclusionResphysicsEngineticratemaxlogicstepphysubstepmaxphystepmisimiststamistdistmisthistarrstargstarbstarkstarsizestarmindiststardiststarcolnoisedofstadofenddofmindofmaxaodistaodistfacaoenergyaobiasaomodeaosampaomixaocolorao_adapt_threshao_adapt_speed_facao_approx_errorao_approx_correctionao_indirect_energyao_env_energyao_pad2ao_indirect_bouncesao_padao_samp_methodao_gather_methodao_approx_passes*aosphere*aotablesselcolsxsy*lpFormat*lpParmscbFormatcbParmsfccTypefccHandlerdwKeyFrameEverydwQualitydwBytesPerSeconddwFlagsdwInterleaveEveryavicodecname[128]*cdParms*padcdSizeqtcodecname[128]codecTypecodecSpatialQualitycodeccodecFlagscolorDepthcodecTemporalQualityminSpatialQualityminTemporalQualitykeyFrameRatebitRateaudiocodecTypeaudioSampleRateaudioBitDepthaudioChannelsaudioCodecFlagsaudioBitRateaudio_codecvideo_bitrateaudio_bitrateaudio_mixrateaudio_channelsaudio_padaudio_volumegop_sizerc_min_raterc_max_raterc_buffer_sizemux_packet_sizemux_ratemixratemainspeed_of_sounddoppler_factordistance_model*mat_override*light_overridelay_zmasklay_excludelayflagpassflagpass_xorsamplespass_alpha_thresholdfreestyleConfigimtypeplanesqualitycompressexr_codeccineon_flagcineon_whitecineon_blackcineon_gammajp2_flagjp2_codecview_settingsdisplay_settingsim_formatcage_extrusionnormal_swizzle[3]normal_spacesave_modecage[64]*avicodecdata*qtcodecdataqtcodecsettingsffcodecdatasubframepsfrapefraimagesframaptoframelenblurfacedgeRedgeGedgeBfullscreenxplayyplayfreqplayattribframe_stepstereomodedimensionspresetmaximsizepad6xschyschxpartsypartstilextileysubimtypedisplaymodeuse_lock_interfacepad7scemoderaytrace_optionsraytrace_structureocrespad4alphamodeosafrs_secedgeintsafetyborderdisprectlayersactlaymblur_samplesxaspyaspfrs_sec_basegausscolor_mgt_flagpostgammaposthuepostsatdither_intensitybake_osabake_filterbake_modebake_flagbake_normal_spacebake_quad_splitbake_maxdistbake_biasdistbake_samplesbake_padbake_user_scalebake_pad1pic[1024]stampstamp_font_idstamp_udata[768]fg_stamp[4]bg_stamp[4]seq_prev_typeseq_rend_typeseq_flagpad5[5]simplify_flagsimplify_subsurfsimplify_shadowsamplessimplify_particlessimplify_aossscineonwhitecineonblackcineongammajp2_presetjp2_depthrpad3domeresdomemodedomeangledometiltdomeresbuf*dometextline_thickness_modeunit_line_thicknessengine[32]bakepreview_start_resolutionname[32]particle_percsubsurf_maxshadbufsample_maxao_errortiltresbuf*warptextcol[3]cellsizecellheightagentmaxslopeagentmaxclimbagentheightagentradiusedgemaxlenedgemaxerrorregionminsizeregionmergesizevertsperpolydetailsampledistdetailsamplemaxerrorframingplayerflagrt1rt2aasamplesdomestereoflageyeseparationrecastDatamatmodeexitkeyvsyncobstacleSimulationraster_storagelevelHeightdeactivationtimelineardeactthresholdangulardeactthreshold*camera*palette*paint_cursorpaint_cursor_col[4]num_input_samplessymmetry_flagspaintmissing_dataseam_bleednormal_anglescreen_grab_size[2]*paintcursor*stencil*clonestencil_col[3]inverttotrekeytotaddkeybrushtypebrush[7]emitterdistselectmodeedittypedraw_stepfade_framesradial_symm[3]detail_sizesymmetrize_directiongravity_factorconstant_detail*gravity_object*pad2*vpaint_prev*wpaint_prevmat[3][3]unprojected_radiusrgb[3]secondary_rgb[3]last_rake[2]brush_rotationdraw_anchoredanchored_sizedraw_invertedpad3[7]overlap_factoranchored_initial_mouse[2]stroke_activesize_pressure_valuetex_mouse[2]mask_tex_mouse[2]do_linear_conversion*colorspacepixel_radius_pad1[2]overhang_axisoverhang_minoverhang_maxthickness_minthickness_maxthickness_samples_pad2[3]distort_mindistort_maxsharp_minsharp_max*vpaint*wpaint*uvsculptvgroup_weightdoublimitnormalsizeautomergeunwrapperuvcalc_flaguv_flaguv_selectmodeuvcalc_marginautoik_chainlengpencil_flagspad[5]imapaintparticleproportional_sizeselect_threshautokey_modeautokey_flagmultires_subdiv_typepad3[1]skgen_resolutionskgen_threshold_internalskgen_threshold_externalskgen_length_ratioskgen_length_limitskgen_angle_limitskgen_correlation_limitskgen_symmetry_limitskgen_retarget_angle_weightskgen_retarget_length_weightskgen_retarget_distance_weightskgen_optionsskgen_postproskgen_postpro_passesskgen_subdivisions[3]skgen_multi_level*skgen_templatebone_sketchingbone_sketching_convertskgen_subdivision_numberskgen_retarget_optionsskgen_retarget_rollskgen_side_string[8]skgen_num_string[8]edge_modeedge_mode_live_unwrapsnap_modesnap_node_modesnap_uv_modesnap_flagsnap_targetproportionalprop_modeproportional_objectsproportional_maskauto_normalizemultipaintweightuservgroupsubsetuse_uv_sculptuv_sculpt_settingsuv_sculpt_tooluv_relax_methodsculpt_paint_settingssculpt_paint_unified_sizesculpt_paint_unified_unprojected_radiussculpt_paint_unified_alphaunified_paint_settingsstatvistotobjtotlamptotobjseltotcurvetotmeshtotarmaturescale_lengthsystemsystem_rotationgravity[3]quick_cache_step*world*setbase*basact*obeditcursor[3]twcent[3]twmin[3]twmax[3]layactlay_updated*ed*toolsettings*statsaudiomarkerstransform_spaces*sound_scene*sound_scene_handle*sound_scrub_handle*speaker_handles*fps_info*theDagdagflagsactive_keyingsetkeyingsetsgmunitphysics_settings*clipcustomdata_mask_modalsequencer_colorspace_settings*rigidbody_worldcuserblendviewwinmat[4][4]viewmat[4][4]viewinv[4][4]persmat[4][4]persinv[4][4]viewmatob[4][4]persmatob[4][4]clip[6][4]clip_local[6][4]*clipbb*localvd*ri*render_engine*depths*gpuoffscreen*sms*smooth_timertwmat[4][4]viewquat[4]camdxcamdypixsizecamzoomis_perspperspviewlockviewlock_quadofs_lock[2]twdrawflagrflaglviewquat[4]lpersplviewgridviewtw_idot[3]rot_anglerot_axis[3]regionbasespacetypeblockscaleblockhandler[8]bundle_sizebundle_drawtypelay_prevlay_used*ob_centrerender_borderbgpicbase*bgpicob_centre_bone[64]drawtypeob_centre_cursorscenelockaroundgridnearfarmatcap_icongridlinesgridsubdivgridflagtwtypetwmodetwflagafterdraw_transpafterdraw_xrayafterdraw_xraytranspzbufxraypad3[5]*properties_storage*defmaterialverthormaskmin[2]max[2]minzoommaxzoomscrollscroll_uikeeptotkeepzoomkeepofsalignwinxwinyoldwinxoldwiny*tab_offsettab_numtab_currpt_maskv2dmainbmainbomainbuserre_alignpreviewtexture_contexttexture_context_prev*pathpathflagdataicon*pinid*texusertree*treestoresearch_string[32]search_tseoutlinevisstoreflagsearch_flags*treehash*adsghostCurvesautosnapcursorVal*arraycachescache_displayrender_sizechanshownzebrazoomoverlay_typescopes*maskdraw_flagdraw_typeoverlay_modetitle[96]dir[1056]file[256]renamefile[256]renameedit[256]filter_glob[64]active_filesel_firstsel_lastsortdisplayf_fpfp_str[8]scroll_offset*params*files*folders_prev*folders_next*op*smoothscroll_timer*layoutrecentnrbookmarknrsystemnr*cumapsample_line_histcursor[2]centxcentypincurtilelockdt_uvstickydt_uvstretchmask_info*texttopviewlinesmenunrlheightcwidthlinenrs_totleftshowlinenrstabnumbershowsyntaxline_hlightoverwritelive_editpix_per_linetxtscrolltxtbarwordwrapdopluginsfindstr[256]replacestr[256]margin_columnlheight_dpi*drawcachescroll_accum[2]*py_draw*py_event*py_button*py_browsercallback*py_globaldictlastspacescriptname[1024]scriptarg[256]*script*but_refsparent_keyview_center[2]node_name[64]*idaspecttreepath*edittreetree_idname[64]treetypetexfromshaderfromlinkdraglen_alloccursorscrollbackhistoryprompt[256]language[32]sel_startsel_endfilter_typefilter[64]xlockofylockofuserpath_lengthloc[2]stabmat[4][4]unistabmat[4][4]postproc_flaggpencil_srcfilename[1024]blf_iduifont_idr_to_lhintingpointskerningitalicboldshadowshadxshadyshadowalphashadowcolorpaneltitlegrouplabelwidgetlabelwidgetpanelzoomminlabelcharsminwidgetcharscolumnspacetemplatespaceboxspacebuttonspacexbuttonspaceypanelspacepanelouteroutline[4]inner[4]inner_sel[4]item[4]text[4]text_sel[4]shadedshadetopshadedownalpha_checkinner_anim[4]inner_anim_sel[4]inner_key[4]inner_key_sel[4]inner_driven[4]inner_driven_sel[4]header[4]back[4]show_headershow_backgradient[4]high_gradient[4]show_gradwcol_regularwcol_toolwcol_textwcol_radiowcol_optionwcol_togglewcol_numwcol_numsliderwcol_menuwcol_pulldownwcol_menu_backwcol_menu_itemwcol_tooltipwcol_boxwcol_scrollwcol_progresswcol_list_itemwcol_pie_menuwcol_statepanelmenu_shadow_facmenu_shadow_widthiconfile[256]icon_alphaxaxis[4]yaxis[4]zaxis[4]title[4]text_hi[4]header_title[4]header_text[4]header_text_hi[4]tab_active[4]tab_inactive[4]tab_back[4]tab_outline[4]button[4]button_title[4]button_text[4]button_text_hi[4]list[4]list_title[4]list_text[4]list_text_hi[4]panelcolorsgradientsshade1[4]shade2[4]hilite[4]grid[4]view_overlay[4]wire[4]wire_edit[4]select[4]lamp[4]speaker[4]empty[4]camera[4]active[4]group[4]group_active[4]transform[4]vertex[4]vertex_select[4]vertex_unreferenced[4]edge[4]edge_select[4]edge_seam[4]edge_sharp[4]edge_facesel[4]edge_crease[4]face[4]face_select[4]face_dot[4]extra_edge_len[4]extra_edge_angle[4]extra_face_angle[4]extra_face_area[4]normal[4]vertex_normal[4]loop_normal[4]bone_solid[4]bone_pose[4]bone_pose_active[4]strip[4]strip_select[4]cframe[4]freestyle_edge_mark[4]freestyle_face_mark[4]nurb_uline[4]nurb_vline[4]act_spline[4]nurb_sel_uline[4]nurb_sel_vline[4]lastsel_point[4]handle_free[4]handle_auto[4]handle_vect[4]handle_align[4]handle_auto_clamped[4]handle_sel_free[4]handle_sel_auto[4]handle_sel_vect[4]handle_sel_align[4]handle_sel_auto_clamped[4]ds_channel[4]ds_subchannel[4]keytype_keyframe[4]keytype_extreme[4]keytype_breakdown[4]keytype_jitter[4]keytype_keyframe_select[4]keytype_extreme_select[4]keytype_breakdown_select[4]keytype_jitter_select[4]keyborder[4]keyborder_select[4]console_output[4]console_input[4]console_info[4]console_error[4]console_cursor[4]console_select[4]vertex_sizeoutline_widthfacedot_sizenoodle_curvingsyntaxl[4]syntaxs[4]syntaxb[4]syntaxn[4]syntaxv[4]syntaxc[4]syntaxd[4]syntaxr[4]nodeclass_output[4]nodeclass_filter[4]nodeclass_vector[4]nodeclass_texture[4]nodeclass_shader[4]nodeclass_script[4]nodeclass_pattern[4]nodeclass_layout[4]movie[4]movieclip[4]mask[4]image[4]scene[4]audio[4]effect[4]transition[4]meta[4]editmesh_active[4]handle_vertex[4]handle_vertex_select[4]pad2[4]handle_vertex_sizemarker_outline[4]marker[4]act_marker[4]sel_marker[4]dis_marker[4]lock_marker[4]bundle_solid[4]path_before[4]path_after[4]camera_path[4]hpad[3]preview_back[4]preview_stitch_face[4]preview_stitch_edge[4]preview_stitch_vert[4]preview_stitch_stitchable[4]preview_stitch_unstitchable[4]preview_stitch_active[4]uv_shadow[4]uv_others[4]match[4]selected_highlight[4]skin_root[4]anim_active[4]anim_non_active[4]nla_tweaking[4]nla_tweakdupli[4]nla_transition[4]nla_transition_sel[4]nla_meta[4]nla_meta_sel[4]nla_sound[4]nla_sound_sel[4]info_selected[4]info_selected_text[4]info_error[4]info_error_text[4]info_warning[4]info_warning_text[4]info_info[4]info_info_text[4]info_debug[4]info_debug_text[4]paint_curve_pivot[4]paint_curve_handle[4]solid[4]tuitbutstv3dtfiletipotinfotacttnlatseqtimatexttoopsttimetnodetlogictuserpreftconsoletcliptarm[20]active_theme_areamodule[64]*proppath[768]spec[4]mouse_speedwalk_speedwalk_speed_factorview_heightjump_heightteleport_timeversionfilesubversionfiledupflagsavetimetempdir[768]fontdir[768]renderdir[1024]render_cachedir[768]textudir[768]pythondir[768]sounddir[768]i18ndir[768]image_editor[1024]anim_player[1024]anim_player_presetv2d_min_gridsizetimecode_styleversionsdbl_click_timegameflagswheellinescrolluiflaguiflag2languageuserprefviewzoommixbufsizeaudiodeviceaudiorateaudioformataudiochannelsdpiencodingtransoptsmenuthreshold1menuthreshold2themesuifontsuistyleskeymapsuser_keymapsaddonsautoexec_pathskeyconfigstr[64]undostepsundomemorygp_manhattendistgp_euclideandistgp_erasergp_settingstb_leftmousetb_rightmouselight[3]tw_hotspottw_flagtw_handlesizetw_sizetextimeouttexcollectratewmdrawmethoddragthresholdmemcachelimitprefetchframesframeserverportpad_rot_angleobcenter_diarvisizervibrightrecent_filessmooth_viewtxglreslimitcurssizecolor_picker_typeipo_newkeyhandles_newgpu_select_methodscrcastfpsscrcastwaitwidget_unitanisotropic_filteruse_16bit_texturesuse_gpu_mipmapndof_sensitivityndof_orbit_sensitivityndof_flagogl_multisamplesimage_draw_methodglalphacliptext_renderpad9coba_weightsculpt_paint_overlay_col[3]gpencil_new_layer_col[4]tweak_thresholdnavigation_modeauthor[80]font_path_ui[1024]compute_device_typecompute_device_idfcu_inactive_alphapixelsizepie_interaction_typepie_initial_timeoutpie_animation_timeoutpie_menu_radiuspie_menu_thresholdwalk_navigationvertbaseedgebaseareabase*newsceneredraws_flagfulltempwiniddo_drawdo_refreshdo_draw_gesturedo_draw_paintcursordo_draw_dragswapmainwinsubwinactive*animtimer*context*newvvec*v1*v2*typepanelname[64]tabname[64]drawname[64]ofsxofsysizexsizeylabelofsruntime_flagcontrolsnapsortorder*paneltab*activedataidname[64]list_id[64]layout_typelist_scrolllist_griplist_last_lenlist_last_activeifilter_byname[64]filter_flagfilter_sort_flag*dyn_datapreview_id[64]pad1[3]*v3*v4*fullbutspacetypeheadertyperegion_active_winspacedatahandlersactionzoneswinrctdrawrctswinidregiontypealignmentdo_draw_overlayoverlapuiblockspanelspanels_category_activeui_listsui_previewspanels_category*regiontimer*headerstr*regiondatasubvstr[4]subversionpadsminversionminsubversionwinpos*curscreen*curscenefileflagsglobalfbuild_commit_timestampbuild_hash[16]name[256]orig_widthorig_heightbottomrightxofsyofslift[3]gamma[3]gain[3]dir[768]tcbuild_size_flagsbuild_tc_flagsdonestartstillendstill*stripdata*crop*transform*color_balance*tmpstartofsendofsmachinestartdispenddispsatmulhandsizeanim_preseekstreamindexmulticam_sourceclip_flag*strip*scene_cameraeffect_faderspeed_fader*seq1*seq2*seq3seqbase*sound*scene_soundpitchpanstrobe*effectdataanim_startofsanim_endofsblend_modeblend_opacity*oldbasep*parseq*seqbasepmetastack*act_seqact_imagedir[1024]act_sounddir[1024]over_ofsover_cfraover_flagover_borderedgeWidthforwardwipetypefMinifClampfBoostdDistdQualitybNoCompScalexIniScaleyInixIniyInirotIniinterpolationuniform_scale*frameMapglobalSpeedlastValidFramesize_xsize_ymask_input_type*mask_sequence*mask_idcolor_balancecolor_multiplycurve_mapping*reference_ibuf*zebra_ibuf*waveform_ibuf*sep_waveform_ibuf*vector_ibuf*histogram_ibufbuttypeuserjitstaendtotpartnormfacobfacrandfactexfacrandlifeforce[3]vectsizemaxlendefvec[3]mult[4]life[4]child[4]mat[4]texmapcurmultstaticstepomattimetexspeedtexflag2negvertgroup_vvgroupname[64]vgroupname_v[64]*keysminfacnrusedusedelem*poinresetdistlastvalpropname[64]matname[64]*makeyqualqual2targetName[64]toggleName[64]value[64]maxvalue[64]delaydurationmaterialName[64]damptimeraxisflagposechannel[64]constraint[64]*fromObjectsubject[64]body[64]otypepulsefreqtotlinks**linkstapjoyindexaxis_singleaxisfbuttonhathatfprecisionstr[128]*mynewinputstotslinks**slinksvalostate_mask*actframeProp[64]blendinpriorityend_resetstrideaxisstridelengthlayer_weightmin_gainmax_gainreference_distancemax_distancerolloff_factorcone_inner_anglecone_outer_anglecone_outer_gainsndnrpad3[2]sound3Dpad6[1]*melinVelocity[3]angVelocity[3]localflagdyn_operationforceloc[3]forcerot[3]linearvelocity[3]angularvelocity[3]*referenceminmaxrotdampminloc[3]maxloc[3]minrot[3]maxrot[3]matprop[64]butstabutenddistributionint_arg_1int_arg_2float_arg_1float_arg_2toPropName[64]*toObjectbodyTypefilename[64]loadaniname[64]int_argfloat_arginfluence*subtargetfacingaxisvelocityaccelerationturnspeedupdateTime*navmeshobject_axis[2]threshold[2]sensitivity[2]limit_x[2]limit_y[2]go*handle*newpackedfileattenuation*waveform*playback_handle*lamprengobjectdupli_ofs[3]childbaserollhead[3]tail[3]bone_mat[3][3]arm_head[3]arm_tail[3]arm_mat[4][4]arm_rollxwidthzwidthease1ease2rad_headrad_tailsegmentsbonebasechainbase*edbo*act_bone*act_edbone*sketchgevertdeformerlayer_usedlayer_protectedghostepghostsizeghosttypepathsizeghostsfghostefpathsfpathefpathbcpathac*pointsstart_frameend_frameghost_sfghost_efghost_bcghost_acghost_typeghost_stepghost_flagpath_typepath_steppath_viewflagpath_bakeflagpath_sfpath_efpath_bcpath_acikflagagrp_indexconstflagselectflagpad0[6]*bone*childiktreesiktree*custom*custom_txeul[3]chan_mat[4][4]pose_mat[4][4]pose_head[3]pose_tail[3]limitmin[3]limitmax[3]stiffness[3]ikstretchikrotweightiklinweight*tempchanbase*chanhashproxy_layerstride_offset[3]cyclic_offset[3]agroupsactive_groupiksolver*ikdata*ikparamproxy_act_bone[64]numiternumstepminstepmaxstepsolverfeedbackmaxveldampmaxdampepschannelscustomColcscurvesgroupsactive_markeridroot*filter_grpsearchstr[64]filterflagrenameIndexadstimeslide*grpname[30]ownspacetarspaceenforceheadtaillin_errorrot_error*tarmatrix[4][4]spacerotOrdertarnumtargetsiterationsrootbonemax_rootbone*poletarpolesubtarget[64]poleangleorientweightgrabtarget[3]numpointschainlenxzScaleModereserved1reserved2minmaxflagstuckcache[3]lockflagfollowflagvolmodeplaneorglengthbulgepivXpivYpivZaxXaxYaxZminLimit[6]maxLimit[6]extraFzinvmat[4][4]fromtomap[3]expofrom_min[3]from_max[3]to_min[3]to_max[3]from_min_rot[3]from_max_rot[3]to_min_rot[3]to_max_rot[3]from_min_scale[3]from_max_scale[3]to_min_scale[3]to_max_scale[3]rotAxiszminzmaxprojAxisSpacetrack[64]frame_methodobject[64]*depth_obchannel[32]no_rot_axisstride_axiscurmodactstartactendactoffsstridelenblendoutstridechannel[32]offs_bone[32]hasinputhasoutputdatatypesockettypeis_copyexternal*new_sockidentifier[64]*storagelimitin_out*typeinfolocxlocy*default_valuestack_indexstack_typeown_indexto_index*groupsock*linkns*new_nodelastycolor[3]outputs*originalinternal_linksminiwidthoffsetxoffsetyupdatelabel[64]custom1custom2custom3custom4need_execexec*threaddatatotrbutrprvrpreview_xsizepreview_ysize*blocktaghash_entry*rectxsizeysize*fromnode*tonode*fromsock*tosock*interface_typenodeslinksinitcur_indexis_updatingnodetypeedit_qualityrender_qualitychunksizeviewer_border*previewsactive_viewer_key*execdata(*progress)()(*stats_draw)()(*test_break)()(*update_draw)()*tbh*prh*sdh*udhvalue[3]value[4]value[1024]label_sizecyclicmoviegammagainliftmastershadowsmidtoneshighlightsstartmidtonesendmidtonesflapsroundingcatadioptriclensshiftrotationpass_indexpass_flagmaxspeedminspeedcurvedpercentxpercentybokehimage_in_widthimage_in_heightcenter_xcenter_yspinwrapsigma_colorsigma_spacehuebase_path[1024]formatactive_inputuse_render_formatuse_node_formatlayer[30]t1t2t3fstrengthfalphakey[4]algorithmchannelx1x2y1y2fac_x1fac_x2fac_y1fac_y2colname[64]bktypepad_c1gamcono_zbuffstopmaxblurbthreshpad_f1*dict*nodecolmodmixfadeangle_ofsmcjitprojfitslope[3]power[3]limchanunspilllimscaleuspillruspillguspillbtex_mappingcolor_mappingsky_modelsun_direction[3]turbidityground_albedocolor_spaceprojectionprojection_blendoffset_freqsquash_freqsquashgradient_typecoloringmusgrave_typewave_typeconvert_fromconvert_totracking_object[64]screen_balancedespill_factordespill_balanceedge_kernel_radiusedge_kernel_toleranceclip_blackclip_whitedilate_distancefeather_distancefeather_falloffblur_preblur_posttrack_name[64]wrap_axisplane_track_name[64]bytecode_hash[64]*bytecodedirection_typeuv_map[64]source[2]ray_lengthshortymintablemaxtableext_in[2]ext_out[2]*curve*table*premultablepremul_ext_in[2]premul_ext_out[2]presetchanged_timestampcurrcliprcm[4]black[3]white[3]bwmul[3]sample[3]x_resolutiondata_luma[256]data_r[256]data_g[256]data_b[256]data_a[256]co[2][2]sample_fullsample_linesaccuracywavefrm_modewavefrm_alphawavefrm_yfacwavefrm_heightvecscope_alphavecscope_heightminmax[3][2]hist*waveform_1*waveform_2*waveform_3*vecscopewaveform_totlook[64]view_transform[64]*curve_mappingdisplay_device[64]offset[2]clonemtexmask_mtex*toggle_brush*icon_imbuf*gradient*paint_curveicon_filepath[1024]normal_weightob_modemask_pressurejitterjitter_absoluteoverlay_flagssmooth_stroke_radiussmooth_stroke_factorratesculpt_planeplane_offsetgradient_spacinggradient_stroke_modegradient_fill_modesculpt_toolvertexpaint_toolimagepaint_toolmask_toolautosmooth_factorcrease_pinch_factorplane_trimtexture_sample_biastexture_overlay_alphamask_overlay_alphacursor_overlay_alphasharp_thresholdblur_kernel_radiusblur_modefill_thresholdadd_col[3]sub_col[3]stencil_pos[2]stencil_dimension[2]mask_stencil_pos[2]mask_stencil_dimension[2]colorsdeletedactive_colorbezpressuretot_pointsadd_indexactive_rndactive_cloneactive_mask*layerstypemap[41]totlayermaxlayertotsize*pool*externalrot[4]ave[3]*groundwander[3]rest_lengthparticle_index[2]delete_flagnumparentpa[4]w[4]fuv[4]foffsetprev_state*hair*boiddietimenum_dmcachesphdensityhair_indexalivespring_kplasticity_constantyield_ratioplasticity_balanceyield_balanceviscosity_omegaviscosity_betastiffness_kstiffness_knearrest_densitybuoyancyspring_frames*boids*fluiddistrphystypeavemodereacteventdrawdraw_asdraw_sizechildtyperen_assubframesdraw_colren_stephair_stepkeys_stepadapt_angleadapt_pixintegratorrotfrombb_alignbb_uv_splitbb_animbb_split_offsetbb_tiltbb_rand_tiltbb_offset[2]bb_size[2]bb_vel_headbb_vel_tailcolor_vec_maxsimplify_refsizesimplify_ratesimplify_transitionsimplify_viewporttimetweakcourant_targetjitfaceff_hairgrid_randps_offset[1]grid_reseffector_amounttime_flagtime_pad[3]partfactanfactanphasereactfacob_vel[3]avefacphasefacrandrotfacrandphasefacrandsizeacc[3]dragfacbrownfacrandlengthchild_nbrren_child_nbrparentschildsizechildrandsizechildradchildflatclumppowkink_flatkink_amp_clumprough1rough1_sizerough2rough2_sizerough2_thresrough_endrough_end_shapeclengthclength_thresparting_facparting_minparting_maxbranch_thresdraw_line[2]path_startpath_endtrail_countkeyed_loopsdupliweights*eff_group*dup_ob*bb_ob*pd2use_modifier_stack*part*particles**pathcache**childcachepathcachebufschildcachebufs*clmd*hair_in_dm*hair_out_dm*target_ob*lattice_deform_datatree_framebvhtree_framechild_seedtotunexisttotchildtotcachedtotchildcachetarget_psystotkeyedbakespacebb_uvname[3][64]vgroup[12]vg_negrt3*renderdata*effectors*fluid_springstot_fluidspringsalloc_fluidsprings*tree*pdddt_fracCdisCvistructuralbendingmax_bendmax_structmax_shearmax_sewingavg_spring_lentimescaleeff_force_scaleeff_wind_scalesim_time_oldvelocity_smoothcollider_frictionvel_dampingshrink_minshrink_maxstepsPerFrameprerollmaxspringlensolver_typevgroup_bendvgroup_massvgroup_structvgroup_shrinkshapekey_restpresetsreset*collision_listepsilonself_frictionselfepsilonrepel_forcedistance_repelself_loop_countloop_countvgroup_selfcolthicknessinittimestrokesframenum*actframegstepcolor[4]info[128]sbuffer_sizesbuffer_sflag*sbufferlistprintlevelstorelevel*reporttimer*windrawable*winactivewindowsinitializedfile_savedop_undo_depthoperatorsqueuereportsjobspaintcursorsdragskeyconfigs*defaultconf*addonconf*userconftimers*autosavetimeris_interface_lockedpar[7]*ghostwingrabcursor*screen*newscreenscreenname[64]posxposywindowstatemonitorlastcursormodalcursoraddmousemove*eventstate*curswin*tweakdrawmethoddrawfail*drawdatamodalhandlerssubwindowsgesturepropvalue_str[64]propvalueshiftctrlaltoskeykeymodifiermaptype*ptr*remove_item*add_itemitemsdiff_itemsspaceidregionidkmi_id(*poll)()*modal_itemsbasename[64]actkeymap*customdata*py_instance*reportsmacro*opm*coefficientsarraysizepoly_orderphase_multiplierphase_offsetvalue_offsetmidvalbefore_modeafter_modebefore_cyclesafter_cyclesrectphasemodificationstep_size*rna_pathpchan_name[32]transChanidtypetargets[8]num_targetsvariablesexpression[256]*expr_compvec[2]*fptarray_indexprev_norm_factorfrom[128]to[128]mappingsstrips*remapfcurvesstrip_timeblendmodeextendmode*speaker_handlegroup[64]groupmodekeyingflagpathsdescription[240]typeinfo[64]active_path*tmpactnla_tracks*actstripdriversoverridesact_blendmodeact_extendmodeact_influenceruleoptionsfear_factorsignal_idlook_aheadoloc[3]queue_sizewanderflee_distancehealthstate_idrulesconditionsactionsruleset_typerule_fuzzinesslast_state_idlanding_smoothnessbankingaggressionair_min_speedair_max_speedair_max_accair_max_aveair_personal_spaceland_jump_speedland_max_speedland_max_accland_max_aveland_personal_spaceland_stick_forcestates*smd*fluid_mutex*fluid_group*coll_group*wt*tex_wt*tex_shadow*tex_flame*shadowp0[3]p1[3]dp0[3]cell_size[3]global_size[3]prev_loc[3]shift[3]shift_f[3]obj_shift_f[3]base_res[3]res_min[3]res_max[3]res[3]total_cellsdxadapt_marginadapt_resadapt_thresholdbetaamplifymaxresviewsettingsnoisediss_percentdiss_speedres_wt[3]dx_wtcache_compcache_high_comp*point_cache[2]ptcaches[2]border_collisionstime_scalevorticityactive_fieldsactive_color[3]highres_samplingburning_rateflame_smokeflame_vorticityflame_ignitionflame_max_tempflame_smoke_color[3]*noise_texture*verts_oldvel_multivel_normalvel_randomfuel_amountvolume_densitysurface_distanceparticle_sizetexture_sizetexture_offsetvgroup_densitytexture_typevolume_maxvolume_mindistance_maxdistance_referencecone_angle_outercone_angle_innercone_volume_outerrender_flagbuild_size_flagbuild_tc_flaglastsize[2]tracking*tracking_contextproxyframe_offsetuse_track_masktrack_preview_heightframe_widthframe_heightundist_marker*track_search*track_previewtrack_pos[2]track_disabledtrack_locked*markerslide_scale[2]error*intrinsicsdistortion_modelsensor_widthpixel_aspectfocalunitsprincipal[2]k1k2k3division_k1division_k2pos[2]pattern_corners[4][2]search_min[2]search_max[2]pat_min[2]pat_max[2]markersnrlast_marker*markersbundle_pos[3]pat_flagsearch_flagframes_limitpattern_matchmotion_modelalgorithm_flagminimum_correlationcorners[4][2]**point_trackspoint_tracksnrimage_opacitydefault_motion_modeldefault_algorithm_flagdefault_minimum_correlationdefault_pattern_sizedefault_search_sizedefault_frames_limitdefault_margindefault_pattern_matchdefault_flagmotion_flagkeyframe1keyframe2reconstruction_flagrefine_camera_intrinsicsclean_framesclean_actionclean_errorobject_distancetot_trackact_trackmaxscale*rot_tracklocinfscaleinfrotinflast_cameracamnr*camerastracksplane_tracksreconstructionmessage[256]tot_segment*segmentsmax_segmenttotal_framescoveragesort_methodcoverage_segmentstot_channelsettingscamerastabilization*act_track*act_plane_trackobjectsobjectnrtot_objectdopesheet*brush_groupcurrent_framedisp_typeimage_fileformateffect_uipreview_idinit_color_typepad_simage_resolutionsubstepsinit_color[4]*init_textureinit_layername[64]dry_speedcolor_dry_thresholddepth_clampdisp_factorspread_speedcolor_spread_speedshrink_speeddrip_veldrip_accinfluence_scaleradius_scalewave_dampingwave_speedwave_timescalewave_springwave_smoothnessimage_output_path[1024]output_name[64]output_name2[64]*pmdsurfacesactive_surerror[64]collisionwetnessparticle_radiusparticle_smoothpaint_distance*paint_ramp*vel_rampproximity_falloffray_dirwave_factorwave_clampmax_velocitysmudge_strengthmasklayersmasklay_actmasklay_totid_typeparent[64]sub_parent[64]parent_orig[2]parent_corners_orig[4][2]ubezttot_uw*uwoffset_modeweight_interptot_point*points_deformtot_vertsplinessplines_shapes*act_spline*act_pointblend_flag**objects*constraintsltimenumbodiessteps_per_secondnum_solver_iterations*physics_world*physics_object*physics_shapecol_groupsmesh_sourcerestitutionlin_dampingang_dampinglin_sleep_threshang_sleep_threshorn[4]pos[3]*ob1*ob2breaking_thresholdlimit_lin_x_lowerlimit_lin_x_upperlimit_lin_y_lowerlimit_lin_y_upperlimit_lin_z_lowerlimit_lin_z_upperlimit_ang_x_lowerlimit_ang_x_upperlimit_ang_y_lowerlimit_ang_y_upperlimit_ang_z_lowerlimit_ang_z_upperspring_stiffness_xspring_stiffness_yspring_stiffness_zspring_damping_xspring_damping_yspring_damping_zmotor_lin_target_velocitymotor_ang_target_velocitymotor_lin_max_impulsemotor_ang_max_impulse*physics_constraintselectionqiqi_startqi_endedge_typesexclude_edge_types*linestyleis_displayedmodulesraycasting_algorithmsphere_radiusdkr_epsiloncrease_anglelinesets*color_rampvalue_minvalue_maxrange_minrange_maxmat_attrsamplingwavelengthoctavesfrequencybackbone_lengthtip_lengthroundsrandom_radiusrandom_centerrandom_backbonepivotscale_xscale_ypivot_upivot_xpivot_ymin_thicknessmax_thicknessorientationthickness_positionthickness_ratiocapschainingsplit_lengthmin_anglemax_anglemin_lengthmax_lengthsplit_dash1split_gap1split_dash2split_gap2split_dash3split_gap3sort_keyintegration_typetexstepdash1gap1dash2gap2dash3gap3color_modifiersalpha_modifiersthickness_modifiersgeometry_modifiersTYPEcharucharshortushortintlongulongfloatdoubleint64_tuint64_tvoidLinkLinkDataListBasevec2svec2fvec3frctirctfIDPropertyDataIDPropertyIDLibraryFileDataPackedFilePreviewImageGPUTextureIpoDriverObjectIpoCurveBPointBezTripleIpoKeyBlockKeyAnimDataTextLineTextCameraImageUserSceneImageMovieCacheanimRenderResultColorManagedColorspaceSettingsMTexTexCBDataColorBandEnvMapImBufPointDensityCurveMappingVoxelDataOceanTexbNodeTreeTexMappingColorMappingLampVolumeSettingsGameSettingsTexPaintSlotMaterialGroupVFontVFontDataMetaElemBoundBoxMetaBallNurbCharInfoTextBoxEditNurbGHashCurveEditFontMeshMSelectMPolyMTexPolyMLoopMLoopUVMLoopColMFaceMTFaceTFaceMVertMEdgeMDeformVertMColBMEditMeshCustomDataMultiresMDeformWeightMFloatPropertyMIntPropertyMStringPropertyOrigSpaceFaceOrigSpaceLoopMDispsMultiresColMultiresColFaceMultiresFaceMultiresEdgeMultiresLevelMRecastGridPaintMaskMVertSkinFreestyleEdgeFreestyleFaceModifierDataMappingInfoModifierDataSubsurfModifierDataLatticeModifierDataCurveModifierDataBuildModifierDataMaskModifierDataArrayModifierDataMirrorModifierDataEdgeSplitModifierDataBevelModifierDataSmokeModifierDataSmokeDomainSettingsSmokeFlowSettingsSmokeCollSettingsDisplaceModifierDataUVProjectModifierDataDecimateModifierDataSmoothModifierDataCastModifierDataWaveModifierDataArmatureModifierDataHookModifierDataSoftbodyModifierDataClothModifierDataClothClothSimSettingsClothCollSettingsPointCacheCollisionModifierDataBVHTreeSurfaceModifierDataDerivedMeshBVHTreeFromMeshBooleanModifierDataMDefInfluenceMDefCellMeshDeformModifierDataParticleSystemModifierDataParticleSystemParticleInstanceModifierDataExplodeModifierDataMultiresModifierDataFluidsimModifierDataFluidsimSettingsShrinkwrapModifierDataSimpleDeformModifierDataShapeKeyModifierDataSolidifyModifierDataScrewModifierDataOceanModifierDataOceanOceanCacheWarpModifierDataWeightVGEditModifierDataWeightVGMixModifierDataWeightVGProximityModifierDataDynamicPaintModifierDataDynamicPaintCanvasSettingsDynamicPaintBrushSettingsRemeshModifierDataSkinModifierDataTriangulateModifierDataLaplacianSmoothModifierDataUVWarpModifierDataMeshCacheModifierDataLaplacianDeformModifierDataWireframeModifierDataEditLattLatticebDeformGroupLodLevelSculptSessionbActionbPosebGPdatabAnimVizSettingsbMotionPathBulletSoftBodyPartDeflectSoftBodyCurveCacheRigidBodyObRigidBodyConObHookDupliObjectRNGEffectorWeightsPTCacheExtraPTCacheMemPTCacheEditSBVertexBodyPointBodySpringSBScratchFluidVertexVelocityWorldBaseAviCodecDataQuicktimeCodecDataQuicktimeCodecSettingsFFMpegCodecDataAudioDataSceneRenderLayerFreestyleConfigImageFormatDataColorManagedViewSettingsColorManagedDisplaySettingsBakeDataRenderDataRenderProfileGameDomeGameFramingRecastDataGameDataTimeMarkerPaintBrushPaletteImagePaintSettingsParticleBrushDataParticleEditSettingsSculptUvSculptVPaintTransformOrientationUnifiedPaintSettingsColorSpaceMeshStatVisToolSettingsbStatsUnitSettingsPhysicsSettingsEditingSceneStatsDagForestMovieClipRigidBodyWorldBGpicMovieClipUserRegionView3DRenderInfoRenderEngineViewDepthsSmoothView3DStorewmTimerView3DSpaceLinkView2DSmoothView2DStoreSpaceInfoSpaceButsSpaceOopsBLI_mempoolTreeStoreElemSpaceIpobDopeSheetSpaceNlaSpaceTimeCacheSpaceTimeSpaceSeqSequencerScopesMaskSpaceInfoMaskFileSelectParamsSpaceFileFileListwmOperatorFileLayoutSpaceImageScopesHistogramSpaceTextScriptSpaceScriptbNodeTreePathbNodeInstanceKeySpaceNodeSpaceLogicConsoleLineSpaceConsoleSpaceUserPrefSpaceClipMovieClipScopesuiFontuiFontStyleuiStyleuiWidgetColorsuiWidgetStateColorsuiPanelColorsuiGradientColorsThemeUIThemeSpaceThemeWireColorbThemebAddonbPathCompareSolidLightWalkNavigationUserDefbScreenScrVertScrEdgePanelPanelTypeuiLayoutPanelCategoryStackuiListuiListTypeuiListDynuiPreviewScrAreaSpaceTypeARegionARegionTypeFileGlobalStripElemStripCropStripTransformStripColorBalanceStripProxyStripSequencebSoundMetaStackWipeVarsGlowVarsTransformVarsSolidColorVarsSpeedControlVarsGaussianBlurVarsSequenceModifierDataColorBalanceModifierDataCurvesModifierDataHueCorrectModifierDataBrightContrastModifierDataSequencerMaskModifierDataEffectBuildEffPartEffParticleWaveEffTreeStorebPropertybNearSensorbMouseSensorbTouchSensorbKeyboardSensorbPropertySensorbActuatorSensorbDelaySensorbCollisionSensorbRadarSensorbRandomSensorbRaySensorbArmatureSensorbMessageSensorbSensorbControllerbJoystickSensorbExpressionContbPythonContbActuatorbAddObjectActuatorbActionActuatorSound3DbSoundActuatorbEditObjectActuatorbSceneActuatorbPropertyActuatorbObjectActuatorbIpoActuatorbCameraActuatorbConstraintActuatorbGroupActuatorbRandomActuatorbMessageActuatorbGameActuatorbVisibilityActuatorbTwoDFilterActuatorbParentActuatorbStateActuatorbArmatureActuatorbSteeringActuatorbMouseActuatorGroupObjectBonebArmatureEditBonebMotionPathVertbPoseChannelbIKParambItascbActionGroupSpaceActionbActionChannelbConstraintChannelbConstraintbConstraintTargetbPythonConstraintbKinematicConstraintbSplineIKConstraintbTrackToConstraintbRotateLikeConstraintbLocateLikeConstraintbSizeLikeConstraintbSameVolumeConstraintbTransLikeConstraintbMinMaxConstraintbActionConstraintbLockTrackConstraintbDampTrackConstraintbFollowPathConstraintbStretchToConstraintbRigidBodyJointConstraintbClampToConstraintbChildOfConstraintbTransformConstraintbPivotConstraintbLocLimitConstraintbRotLimitConstraintbSizeLimitConstraintbDistLimitConstraintbShrinkwrapConstraintbFollowTrackConstraintbCameraSolverConstraintbObjectSolverConstraintbActionModifierbActionStripbNodeStackbNodeSocketbNodeSocketTypebNodeLinkbNodebNodeTypeuiBlockbNodeInstanceHashEntrybNodePreviewbNodeTreeTypeStructRNAbNodeInstanceHashbNodeTreeExecbNodeSocketValueIntbNodeSocketValueFloatbNodeSocketValueBooleanbNodeSocketValueVectorbNodeSocketValueRGBAbNodeSocketValueStringNodeFrameNodeImageAnimColorCorrectionDataNodeColorCorrectionNodeBokehImageNodeBoxMaskNodeEllipseMaskNodeImageLayerNodeBlurDataNodeDBlurDataNodeBilateralBlurDataNodeHueSatNodeImageFileNodeImageMultiFileNodeImageMultiFileSocketNodeChromaNodeTwoXYsNodeTwoFloatsNodeGeometryNodeVertexColNodeDefocusNodeScriptDictNodeGlareNodeTonemapNodeLensDistNodeColorBalanceNodeColorspillNodeDilateErodeNodeMaskNodeTexBaseNodeTexSkyNodeTexImageNodeTexCheckerNodeTexBrickNodeTexEnvironmentNodeTexGradientNodeTexNoiseNodeTexVoronoiNodeTexMusgraveNodeTexWaveNodeTexMagicNodeShaderAttributeNodeShaderVectTransformTexNodeOutputNodeKeyingScreenDataNodeKeyingDataNodeTrackPosDataNodeTranslateDataNodePlaneTrackDeformDataNodeShaderScriptNodeShaderTangentNodeShaderNormalMapNodeShaderUVMapNodeSunBeamsCurveMapPointCurveMapBrushClonePaintCurvePaletteColorPaintCurvePointCustomDataLayerCustomDataExternalHairKeyParticleKeyBoidParticleBoidDataParticleSpringChildParticleParticleTargetParticleDupliWeightParticleDataSPHFluidSettingsParticleSettingsBoidSettingsParticleCacheKeyLatticeDeformDataKDTreeParticleDrawDataLinkNodebGPDspointbGPDstrokebGPDframebGPDlayerReportListwmWindowManagerwmWindowwmKeyConfigwmEventwmSubWindowwmGesturewmKeyMapItemPointerRNAwmKeyMapDiffItemwmKeyMapwmOperatorTypeFModifierFMod_GeneratorFMod_FunctionGeneratorFCM_EnvelopeDataFMod_EnvelopeFMod_CyclesFMod_PythonFMod_LimitsFMod_NoiseFMod_SteppedDriverTargetDriverVarChannelDriverFPointFCurveAnimMapPairAnimMapperNlaStripNlaTrackKS_PathKeyingSetAnimOverrideIdAdtTemplateBoidRuleBoidRuleGoalAvoidBoidRuleAvoidCollisionBoidRuleFollowLeaderBoidRuleAverageSpeedBoidRuleFightBoidStateFLUID_3DWTURBULENCESpeakerMovieClipProxyMovieClipCacheMovieTrackingMovieTrackingMarkerMovieTrackingTrackMovieReconstructedCameraMovieTrackingCameraMovieTrackingPlaneMarkerMovieTrackingPlaneTrackMovieTrackingSettingsMovieTrackingStabilizationMovieTrackingReconstructionMovieTrackingObjectMovieTrackingStatsMovieTrackingDopesheetChannelMovieTrackingDopesheetCoverageSegmentMovieTrackingDopesheetDynamicPaintSurfacePaintSurfaceDataMaskParentMaskSplinePointUWMaskSplinePointMaskSplineMaskLayerShapeMaskLayerFreestyleLineSetFreestyleLineStyleFreestyleModuleConfigLineStyleModifierLineStyleColorModifier_AlongStrokeLineStyleAlphaModifier_AlongStrokeLineStyleThicknessModifier_AlongStrokeLineStyleColorModifier_DistanceFromCameraLineStyleAlphaModifier_DistanceFromCameraLineStyleThicknessModifier_DistanceFromCameraLineStyleColorModifier_DistanceFromObjectLineStyleAlphaModifier_DistanceFromObjectLineStyleThicknessModifier_DistanceFromObjectLineStyleColorModifier_MaterialLineStyleAlphaModifier_MaterialLineStyleThicknessModifier_MaterialLineStyleGeometryModifier_SamplingLineStyleGeometryModifier_BezierCurveLineStyleGeometryModifier_SinusDisplacementLineStyleGeometryModifier_SpatialNoiseLineStyleGeometryModifier_PerlinNoise1DLineStyleGeometryModifier_PerlinNoise2DLineStyleGeometryModifier_BackboneStretcherLineStyleGeometryModifier_TipRemoverLineStyleGeometryModifier_PolygonalizationLineStyleGeometryModifier_GuidingLinesLineStyleGeometryModifier_BlueprintLineStyleGeometryModifier_2DOffsetLineStyleGeometryModifier_2DTransformLineStyleThicknessModifier_CalligraphyTLEN  ldt (\$H8$(@0`TP8LD8X,|pTh@  ,<  @ ( `pplht$@`|0 xl0xthh`| LLpXXphpx Px0xXtL` @D (@Hh88T|LD0p|(H 88TX,(0 `  <x$)((\P4hXpx 4L8 *HP`$8, l   `h`x8 TPLHLHlp\L\ DxlXX (,0(h(`,h\TLLLDd`LLT` TT <,4 h( ,@  H@@@0LHD@ <pLd84@D` hd0LX`h0D8\@8`@H4(lH,|`  ppDX\dldlthpxddl``hhpp````phxhSTRC7                  !"#$%&'()*+,-./0 123-.45678  9:;<=!>?-@AB"""C<DEFG HIJ#$K"LMNBO!PQRSTU%%%VWX&YZ[\%]%^_`abc defg '$Khijklmnopqrs!Ptuv()wxyz{|}~B*&"+,--~%.v/A0v81C?2?13*4jk~5 267    B ~8B0?$K !"#$%&'()*+,-./012345678 |yz{9:D(;9<!P*23=5>7?8@Av: BCDEF,; 2GHIJK<K$KLMNOPQRSTUVWX6YjkZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!P/A9<=>D?*B@$K=>LpAB22/9<!PA     ?B"C%DDDEF$K !!P@"#$BBC%&'D( )*+6,-./01234567*+.1BGGG819:;<=>?@ABC0 1DEFHG8BIHIJJKKL6LF$KEMJNOPQ!P#R@"BCSTUVWX$YZ[<=\]^_6\`DabcdefghijCklmnMopBqBrBsBtIuvwHxHyTz{|}~N1$KE!P#R@"OPQRSTUVWXYZ[N\]]]]]5BCSB$^W LU8Y_+Z_X[P8BRQ*LBSTOV*L`abcdefgfh8;ij jjhgi5BX^X]]klBmnKoKp ppLB)wqp0rpZ  sp6tpupvpHLw pZxpypZz pZB{p|}~ p0B p*ZB p  B L p p fp0BYDp p !pp)w"#$%& pX'X(X)X*X+X,U-./012pX'X3425.p6B7+z8p9;:;<5=>?@A8BCDEF GpH4IJKBp,BLMpNOPpQRSTZ;pU% pVWXYZ[D\]^;p_X`aL;p pzbcdBefghi pjkl m Bpnopqrstuvwxyz{|}~fBp06Yp60p0p0pBpLBp;pBpD pXp`v#p K pzbch;L6$K9:!P#RZHvEBZ$K$!PE L@"$BC B    h !"#$%&'()*+,-.>/A012L3456 7 89:;<=>?@(ABC$D DE! ,DFGHIJ)KLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl0mnoApqrBs  tuv w xyz{|}~Bu8 76uB{R&6DNN!P5L$KMp     L !"#$%&'()*+,-./0123456789:;<=>?@A!P/A;9<BCD E FGHIJKLMNOBP Q RSTUVWXYZ[\]^_`abcdDWefghijklZmnopq rstuvB@wAxyz{|}~ #YKw5{bfLD&B DL &D     D$L !t"# $%Z&' ()*+,L -*.*/*0Dfz12345 -68789:)w (Z;<=>?@ A((BBZC -DBfE+FGHIJKLMNOPQRSTUV WXYZ[\]^_`abKcdefghi7jklmnopqrstuvwxyz{|}~^58)0$K")A9<      8 .*(;hifB)E SK6SK"     #l~ @!?"#$%&'()*+,-./0123456v789:;.<=>v ?@AB C7D EF GHIJ K 7 LMLNO  NB L7P 7QR7hi8STUVWXYZ[\]^_`abcdefghijklmnopqrst*(;6uXvwhiVxyLzB{|}~!&Z6       Z ZD 9< B!7QDhiVw9<9" B###V$B%K&hiV'XL Bw((() .***))))B+ ,B-B./++++++++++++++++++,-   B  0 !-".#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~1+0B222/000000000000000001B333444v5B76K7r                  5              ! " # $ % & ' ( ) * D+ , - . / 0 1 2 3 4 5 6 vw7 8 29 : ; < = B> ? @ A B C D E F G H 6I 8J K L )w)M N DO P Q R S T U V W X Y BZ [ 9999\ ] :::9^ 9_ B;;;<` =qa b c d e f g h Bi j k l ;m n >>>o ???@` p q r s t u v w x Ay BBBz { CCC9^ 9_ 9| 9} 8~ 3 /0 S  P BD`    EEE7  /0   df g R  W  ;F`         G      8 )   H   I  J  K   BL _,   M MM   H LI J K .N4NN               M !P)w Y,  N N N  O        {KPPP N    N    B Q    R      S       TBU  Z V  W WW BN  XWK  YW6 ZW6 [W\W4 4 4 4 4 4 ]]] 8^^^ 8{_-__     R      :  B           #     ` Aaaa Y    bF! ccc " dS# $ BeDL% & f@' SBg( ) * + , hB- . iBj/ 0 Bk1 2 Ll m/ n% & LD3 o4 5 p6 7 8 qqq9 : ; < D r= ,1> Bs ? @ A B C D E tF u&LrrrrG H < 9 I  v= qJ K L wB,xM   N O P Q R  S T yU V W X Y Z [ \ z ] D^  O y_ ^` {,Na b c  d e B|DB)w"}B- ,~ 9  f g K{ h i j    N D,k l  D Lm Bn o p q r    K?s t u v w x y % z { 7 | D8   } ~ 6  &;,$4 5 + BV  q S    V      v vvvG 9   ,O"%  !P  U V ZB , A  $         S+       $K       B@                              (+   $     B B           K B DT         E            1      B  A   B 7  LN  !PP !P    B  !P       &          +  LS        ZB          z~ D!    k l M  "  B zb#  $ % & '   ( ) * + , - . / 0 BD # B1  2 3 4 5 6 7 8 9 : ; < = > ? @ A  B    C D #   C D #   C D # S[LBVSZ]E \6F G H "I BBH 1 " J  K ,LL M !PM  N O P Q O R S T  7k l U V W X Y Z ;[ \  ] ^ _ ` o a b c d e B f g h i j /k ` o B l d  m H n $ ] o p a b Yq r s t u v w x y z { | } ~      (  B   B    B9$$K` o      t        H n   B  k l k l K k l  B  y{ B   B            YB YB  f g ~  E    b        V  B   B  "{ { B  D ~    d               < ~           f;     ( z      B           v  : ;     (;      z (;   B B B BB  B                 E  L#         !  u" # $ % & ' ( ) * 6 ?+ , - . / 0 1 2 3   4 5 6 7 8 9   L: ~; < = > ? @ A B C D E F G H I J BBK L  6M AN .*O B9P 6& /Q /R S 4T 2U V W X Y +fZ [ \ ] a^ _ ` FGa b Bc d e f g h i j k l m n o p Eq r s t u v w x y z F{ | } B ~      zE   G  ]       +B      8         8,L0 ,8 9     R     f B                K$K  82  p    D      9          OP                                           f             jhi                    /A0 A   !P>  K3             $ 5             ! " # &$ % & ' ( 2) *  *+ ,  - c. / 0 1 2 3 4 5 6 7 8 9 : ; < = Z> ? @ A B C D E F G 6H I J K L M ZN O AP B  RQ R S T  yU Q V W X Y Z [ \ ] ^ B_ !` !a b c d e f g h i j k l "m "n "o p q r s ! !! t Q u B8v 8w x y z f g { | E} ~  # $ %   g     &&&o         B' (((& & ) ))  o     """o   o *` '    =qK+ ++  {O R ,   L-4   .k l .//.5 k l 0    1&2 B3f z 4 z  5   6665  <7 < 8 B999 7= 18 5<  m  B: ;;;V <<< M ;     N O O R   D === > >>   B   ? ?? o    @@@  $  ;  <      A$KBBBCB ,    DB   EB ,B 5  FB  8GB     LHHH              =             |>{ I A A A J          Z !"#$%&'()*}{ 4H0+,.-./m 0P 123 45B67Z~{ 4,.BK$KO 89:; <=> { xS?L  @A$K"B,MNC DLE F.'~GHIJOK4L4MNOPxPOQRQxSDR TUBVWXYDZ[\]^_O`abcxPPPdebcO fgOhiSjkm lmnop+BSqxT TTPrsBShf*tgUuvwxyz{|}~SV P~WSQX XXWYZ ZZPB[[[  B\~ BN URWVPTY\]2]]^A& Z  B04ZB4H@Z22 B $K{B_`Ha B`_ b bba _ accctvdddbav(AAB&    MB DB      eeeZDAfggg& K!L"Z#$%&hhh Zih2'jh6& ZBkh6& Z()Blh2'*+mh6& Z*+Bnh6& Z*+()BohV2'*+phV6& Z*+Bq hV6& Z*+()Brh2'Z,sh6& Z,th6& Z(),uh-BvhSBwh.4 Bxh4/Zyh04 /Dzh04 /D{h1B|h2B}hSB~hzBhZ31456h  h789 :;<Bh=>?Bf,$KQ @ABC3DEFGHIJKLMNOPQpABRSTUVW /9<XYZ[ENDBconfclerk-0.6.4/src/icons/collapse.svg0000664000175000017500000001211613212517317017213 0ustar gregoagregoa image/svg+xml confclerk-0.6.4/src/icons/today.png0000664000175000017500000000331513212517317016517 0ustar gregoagregoaPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<JIDATXWmlSU~νX{{{G;c\DF01 #QI4c0  1BC@؀t0]:0Mޜ{y{=̶mF)ۃ[188ȗfL!{J+7q64m,H$IW;B!lڼ!+|<uu#\N]z0lllwPpqgn-|Rdw7ǹsgQ5 ضc[w>FM7b\ǔ)RgFP\\$an"P<|NΛNq `GBgW'ڮs}~#x< cJH2w`kV._%UͫvW= c{%%Ę&ݣ#@h~#WzZ8@ӭ!4*r d3C_|(LOOx553FZ[3^m|2sX6+1aw o+;w`kӖZdxaQ\lm?/BU5< %\פVp"gAu8])4_L+m:y 衮)29\x1Sppg5ߖykpe5&T4ehxO]#Ӎjr"U4^YAUBtrނ"-d$4l~In"h'D4Ieܳr.ڈ1_mPB[QɹBgWǥe$v83LZּC5™Y.k(?^B;_E`U/UjVtRYONE6 J]ӑN\jP|&K3\nkL<2(rj΁UU12]bBɢQY C&Zw\[GnCERaƨ (ۉHZX0t:" +VG7V?`r gz$%LJ )Kʧ}|L?% `jcv,D Dg_У2$mU;@~́+1Rcl.U8SPe&n04,*zԌk[qsꡖ1K20LP (\c`@G1^{߾c[QM  K2^Ddo隅I|twM4la[t[A=1sqʅOIENDB`confclerk-0.6.4/src/icons/alarm-off.png0000664000175000017500000000247513212517317017251 0ustar gregoagregoaPNG  IHDR szz pHYs  IDATXŖkLWwuubE"N60/L蜙fp|]jbcb6cٲ _Fa1X/\ڷ{兞}eR0$'ysĸd"55^_ܑyɁ͆#& qe*xY4|!g_Na6>.,$ᘀfRRR"/OܧyZYQɍ߾ x__VKI>gI ¸lT' X]ZO0 ^v nߡP(\ylӁ' ;{n4ښE`lt&m@R<rlW.?x\& f hqUUI@޵k4sxT\W}Em!Ĭޞ &(xNwH맪 M6e@~t1|zӥV_ ~&byˇ'##cNHBC==ZYQa HZd2"%n-\Hj5dd0o޼nFBrO 2iiiėߛ?؄(f`(ÌPTGw:lX,jdY| L4{6Mz.es7a:6(Uq\Hplg IDATX{LSwu8Kl.sόmٲ?4,1Kf*m*8e`E>ҢrQ<йրt>łŶBT^r;?[R),'9s~weL/BJ@E啲r@0UT*dy |if47 i!;'K0ޞ\>b\B~Q^ϓ'O{(:[,<qivN&#PQq~ɴAkAzhhh584F%eأ[ ?#ܪfNcquN2DԶߛ|P]c꬯o ]OO7~!uTUUM!eouP'Nf5~׺puw$/R,LݤnS3Zp.%Ek l6*rKRȱwgthTIT& `9gzP+:\u6'y +ͯlV1u}8t,\OXo?s,֞{n.܅. Kb颠1: w @n%Y]`'.l+qM8H$c]{SkuZe} V~+h@u{#n#vG3K@jjm)[ &':O9ns )w4D֮_k" b?. P|Z~ڌPx:D/脔inhV-0v/x2&fRv\qv)allUV.G.7d侺дBUddΐ ʓ ~5٫WP?˄3 oʼn_6C S f3X48Ōo%?  W\~1+0J4Y9w .v!w@Yp2- YAhZEVu溂Jf˯jxOEl+@U4~{+ osGIENDB`confclerk-0.6.4/src/icons/expand.png0000664000175000017500000000073013212517317016654 0ustar gregoagregoaPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<UIDATX=j@# 9@. 0VPBDV>B*UZ_! 8"VIȎFڙ}FT1a۹ cǁGa뷆)Q Ee6nö,!\VͦQ/CT8;㴿C^1F|q\c@Gͽ"Z^ Ӯ@ݙ{UFȂ:,1Z,h 0>_hJ:ՙVBZWƦQ1@T$I:7`۶"XLYnYp\=hfY+pu.a񠺇Idk yTڐ` ૮` w} IENDB`confclerk-0.6.4/src/icons/favourite.blend0000664000175000017500000210030013212517317017675 0ustar gregoagregoaBLENDER_v272RENDH uSceneTEST ƿƿCBA@?>mS@ſmS@;<<<==CBA@?><:kR@ſkR@:;;<<<<=CBAA@?=;97hQ@ſjR@99::;;<<<=CBBA@?=;9764eP@jRA78899:;;;<<<DCBA@@><:864207678899:;;;<<<EDCBA@><:86531.aN@ĿgQ@55677889::;;;<<FEDCA@?=;97531/-+_M@gQA34456778899:;;;<<HGEDCB?=;97531/-+)'2234456677899::;;;<IHGFDCA><:86420-+)'%[K@ÿdO@01233455667889:::;;;JIHGFDC@=;86420.,*(&$"//01123445667889:::;;;L K IHGFDB?<:7420.,*(&$"! ¿--./001233455677899:::;;L K JHGFCA>;9631/-+)'%#!  UI@¿_M@+,-../012234556678999:::M L K JIGEB@=:852/-+)'%#!    SH@¿]L@()+,,-./0112344556789999::N!M!L K JIGDA?<9741.,*(&$"      RG@¿3%&()*+,-./00123345567889999:P!O!M!L K JHFC@>;8630-+(&$"              !#$&()*+,-../01123445677889999P!O!N!L K JGEB?=:752/,)'%#!            !#$&')*+,--./0012334566788899Q"P"O!N!L K IFDA><9631.+(&$!           !#$&')*++,-.//012234556778888R"Q"P"O!N!L J HEC@=;852/,*'%#            !#$&'()*+,-../011234456777888T#R"Q"P"O!N!L IGDB?<9641.+)&$"           !"$%'()*+,,-./001233456677788Z@T#R#Q"P"O!M!K HFCA>;852/-*(%#!           !"$%'()**+,-../0122345566777hQ?T#S#R#Q"P"O!L JGEB?<:741.,)'$"          !"$%&'()*+,--./0012344566677ȿU$T#S#R#Q"P"N!K IFDA>;8530-+(&$"         !"$%&'()*++,-../012334556666ľV$U$T#S#R#Q"O"M!J HEC@=:741/,*'%#!        !!"#%&''()*+,--./012234555566[@V$U$T#S#R#P"N!L IGDA>;9630.+)&$#!      !!"#$%&'()*++,-./00123344555gP?W$V$U$T#S#Q"O!M JHFC@=:742/-*(&$"      !"#$%&'()**+,-../0112334445ȿX%W$V$U#S#R#P"N!L IGEB?<9631.,)'%$"    !!#$%&'())*+,,-./0011233344ľY%X$V$U$T#S#Q"O!M JHFC@=:8520-+)'%#!!  !""$%&'(()**+,-../001122333X%W$W$V$U#T#R"P!N K IGEB?<9741/,*(&$"""!  !!""#%&''())*+,--../00112222[@W$V$V$U#U#S#Q"O!M JHFDA>;8530.,*(&$##"!!!!"##$%&'(()*+,,--../000111dN?W$V$U$U#T#S#R"P!N K IGEB?<:752/-+)'%%$"!!!!"#$$%&'(())*+,,--..//////V$U$U#T#S#S#R"P"N!M JHFDA>;9641/-*(&%$#"""""#$%%&'((()**++,--.......V$U$T#T#S#R"Q"Q"O!M K IGEC@=;8631.,*(&%$###""#$%%&'''())**++,,,,,,,,,T#T#T#S#R#R"Q"P"O!M!K JHFDA?<:7520.,*('&$$$###$%%&'''(())***+++++++++Q"R#R#R"R"Q"P"P"O!N!L JHFDB@>;96420-+*)'&%%$$$$%%&&''''(())*****)))))O!P!Q"P"P"P"P"O!N!M!L JHFECA?=;8641/-,*)''&%%%%%%&&&'''''(())((((((''L L M N!O!N!N!O!O!N!M!L J IGFDB@><:8631/-,*)('&&&&&%&&&''''''''((('&&&%$$IIJK L M M M N!M L K J IHGEDA?=<:86310.,+*)(((('&&&&''''''''''&%$$##""¿tV@FGHHIJKK L L L K JIHGFECA?><:86420/--,***)(''''''''&&&&&&%$#""!! WI@BCDEFGHIJJKK KJIHGFFDCB@><:865310/.,++*)(((('''&&&&&%$#""!     ¿?@ABCDFGGHHIJJIIIHHGFDCA@?=;9754210.-,++))((('''&&%%$##"!      nTA>?@ABCDEEFGHIJKJJIIHGFEDCB@><:865320//.-+*)(((''&&&%$#"!!       UI@mSA=>>?@AABCDFGHIJK K KKJJIHGFEDCA?=;98653210/-,+*))(((('%$##"!        UI@mSA<==>?@AABCDFGHIJK L L L K L KJIHGFEDB@>=;:865421/.-,,+**))'&%$#"!!        VJ@lSA;<==>?@ABCDEFGHIJKL M M M M M L K JJIHGECB@>=;98653200/.-+++)('&%$##"!       WJ@lSA;;<<=>?@ABCDEGHIKK L M M!N!N!O!O!O!N M L KJIHFECA@><;97643210/--,+*)(('&$#""!      XK@<<<==>>??@ACDEGHIKL M N!N!O!P"P"P!P!Q"P!O!N N M L KIGFDCA?=<:97643210/.--,+*)('&%$#"!!!!!!!"¾<<==>>??@ABCDEGHIK L M!O!P!P"Q"R#R#R#R"S"R"R"R"Q!P!O!M L JIGFDB@>=;:976543210/.-,+**)('&%$#$$$$##$þ===>>??@@BCDEFGIJK L M!O!P"Q"R#S#T#T$U$U#U#T#T#T#T#S"R"P!O!N L JIGECB@>=<:9876542110/.--,+*)(''&&&&&&%&nTA=>>??@@AABDEFGHIKL M N!O!Q"R#S#T#U$V$V$W%W$W$W$W$W$V$U$T#T#R"P"O!M K JHGECA@?><;:98755432100/.-,+**)((((('''^M@oUA>>??@@AABCDEGHIJK M N!O!P"R"S#T#U$V$W%X%X%Y&Y&Y&Y%Y%Y%X%X%W%V$U$S#Q"P!N!M K JHFDCB@?>=<;:98765433210/..-,+********`N@pUA??@@AABBCDEFGIJKL N O!P!Q"S#T#U$V$W%X%Y%Z&Z&[&\'\'\'\'\'[&Z&Y&X%W%V$T$R#Q"O!M!L JIGFDCBA@?>=<;:998765432110/.-,,,,,,,,bN@ĿAAAAABBCCDEFGIJKL M O!P!Q"R"T#U$V$W%X%Y%Z&[&\'\']'](^(^(^(^(]'\'\&Z&Y%X%V%U$S#Q"O!N!M K JHGFDCBBA@??>=<;:987665432100/......./þCBBBBCCDDEFGHJK L M N!P!Q"R"S#U#V$W%X%Y%Z&[&\']'^'^(_(_(`)`)`)`(_(_(^'\'Z&Y&X%W%U$S#Q"P"O!M!L JIHGFEDDCBAA@?>=<<;:987655432111111112ľDCCDDDDEEFGHIK L M!N!O!Q"R"S#T$V$W%X%Y%Z&[&\']'^'_(`(`)a)a)b*b)a)a)a)a(`(^'\'[&Z&X%W%U$S#R#Q"O"M!L K K JIHGFFEDDCBBA@?>=<;::987654333333334ľEEEEEEFFFGHIJ L M!N!O"P"R"S#T$U$V%X%Y%Z&[&\']'^'_(`(a(b)b)c*c*c*c*c*c)b)b)a(`(^']'[&Y&X%W$U$T#R#Q"O"M!M!M L K KJIHHGGFEEDCBA@@?>=<;:9887655555667~FFFFFFGGGHIJ L M!N!O"P"Q#S#T$U$V$W%X%Y&[&\']'^'_(`(a(b)b)c)d*d*e+e+e+e*d*d*c)b)a(`(^'\'Z&Y&X%W%U$T$R#Q"O"O!N!N!N!M L K KKJJIIHGGFEDCBA@?>>=<;:9888888889ľGGGGGGHHHIJL M N!O"P"Q#R#S$T$V$W%X%Y&Z&['\']'^(`(a(b)c)c)d*d*e+f+f+f+f+f+f*e*d*c)b)a(_(]'['Z&Y&X%V$U$T$S#Q#Q"P"O"O"O!N!M!M M M M L LKJJIHGFEDCBBA@?>=<;;:::::::;žHHHHHIIIIJL M N!O!P"Q"R#S#T$U$V%W%Y&Z&['\']'^(_(`(b)c)d*d*e*e*f+g+g,g,g,g+g+g+f+e*d*b)a)`(^(\'['Z&X%W$V$T$S#R#R#Q"P"P"Q"P"O"O!O!P!P!O!N N M L LKJIHGFFEDCBA@??>=<<<<<<<=žIIIIIJJJKL M N!O!P"Q"R#S#T#U$V$W%X%Y&Z&\']'^(_(`(a)b)d*e*e*f*f+g+g+h,h,h,h,h,h+g+f+e+d*c*b)`)_(](\'Z&Y%W%V$U$T#S#S#R#Q"Q"R#R#Q#Q"R"R"R"R"Q!P!P!O!N N M L KJJIHGFEDDCBA@?>>>>>>>?žJJJJKKKK L M N!O!P!Q"R"S#T#U$V$W%X%Y%Z&[&\']'^(_(`)b)c*d*e*f+g+g+h+h,i,i,i,i,i,i,h,g+g+f+e+c*b)a)_(^(\'[&Y&X%V$U$U$T#T#S#R"R#S#S$S$T$T#T#T#T#S#S"R"Q"Q!P!P!O!O N M LKJIHHGFEDCBAAAAAAAAAJJK K L L L M N O!P!Q"R"S#T#U#V$W$X%Y%Z&[&\']'^(_(`)a)b*c*d*f+f+g+h+h,i,i,j,j,j,j-j-i,i,h,g+f+e*c*b)`)_(](\'[&Y%X%V$U$U$U$T#T#S#S#T#T$U$U$U$U$V$V$V$U#T#T#S#S"S"R"R"Q!P!O!N M L LKJIHGFEDCCCBBBBAžJ K K L L M M N!O!P!Q"S"T#U#V$W$X%Y%Z%[&\&]'^'_(`(a)b)c*d*e+f+g+h,h,i,i,j,j,j-k-k-k-j-j,i,h,g+f+e*c*b)`)_(](\'Z&Y%X%V$U$T#T#T#T#T#T#U$U$V$W%W%W%W%W%X%W$W$V$V$U$U#U#T#T#S"R"Q"P!O!N!M L LJIHGFEDDCCCCB~K K L L L M M N!O!P"R"S"T#U#V$W$X%Y%Z&\&]&^'_'`(a(b)c)d*e*e+f+h,h,i,i,j,j,k-k-k-k-k-k-j-j,i,h,g+f+d*c*b)`(_(]'\'Z&Y%W$V$U#T#T#S#S#S#T#V$V$W$X%X%X%Y%Y%Y&Y%Y%Y%X%X%X$W$W$V$U$T#S#R"Q"P"O!N!M L KJIHGFEDDDDDDuV@L L M M M!N!P!Q"R"S#T#U#V$W$X%Y%Z&[&]&^'_'`(a(b)c)d*e*f+g+h,i,i,j,j-k-k-l-l-l-l-l-k-j-j,i,h,g+e+d*c)b)`(^(]'[&Z&X%W$V$U#T#S"S"S"R"S#T#V$W$Y%Y%Z&Z&Z&[&[&[&[&Z&Z&Y%Y%X%X%W$V$U$T#S#R"Q"P!O!N!M L KJIHGEEEEEsT?ǿM!M!N!N!P!Q"R"S#T#U#V$W$X%Y%Z&[&]&^'_'`(a(b)c)d*e*f+g+h,i,i,j,k-k-l-l-l-l-l-l.k-k-j-j,i,h+f+e*d*c)a)`(^(\'[&Z%X%V$U$T#S#R"R"R"Q"R"S#U#V$X%Y%[&[&[&\&\&\&\&\&[&[&Z&Z%Y%X%X%W$V$U$T#S#R"Q"P!N!M!L K JIHGFFFŽ{Y@P"Q"R"S#T#U#V$W$X%Y%Z&[&\&^'_'`(a(b)c)d*e*f+g+h,h,i,j,j-k-l-l-l-m.m.m.l.k-j-j-i,h,g+f+e*c*b)a(_(^(\'[&Y%W$V$T#S#R"Q"Q"Q"Q!Q"R"T#U$W$X%Z&\&\&\']']']']']'\&\&[&Z&Z&Y%X%W%V$U$T$S#R#Q"P"O!N!M!L K JIuV?Z@V$W$X%Y%Z&[&\&]'_'`(a(b)c)d*d*e+g+h,h,i,j,j-k-l-l-m.m.m.m.m.l.k-j-j-i,h+g+f+d*c)b)`(_(^(\'Z&Y%W$U$T#S"Q"P!P!P!P!P!Q"S"T#V$X%Y%[&]']']'^'^'^'^'^']'\'\&[&Z&Z&Y&X%W%V$U$T#S#R#Q"P"zX?_@d*d*e+f+g,h,i,j-k-k-l-m.m.m.m.m.m.l.l.k-j-i-h,g+f+e*d*b)a)`(^(]'\'Z&X%V$U#S#R"P"O!O!O!O!O!P!R"S#U$W$Y%[&\'^'^'^'^'_(_(_(_'^']']'\?k-l.m.m.m.m.m.m.m.l-k-k-j-i,h,g+f+e*c*b)`(_(^(]'['Y&X%V$T#R#Q"P!N!N N N N O!P!R"T#V$X%Z&\'^'^(_(~m.m.m.m.m.l-l-k-j-j-h,g+f+e*d*c)a)`(_(]'\'[&Y&W%U$S#R"P"O!M L M M M N O!P!R#U$W$Y%[&~m.m.l.l-k-k-j-i,h,g+f*e*c*b)a)_(^']'\'Z&X%V$U$S#Q"O!N!L KKLL L M N!Q"S#U$~b@l-k-k-j-i,h,g+f+e*d*c)b)`(_(^'\'[&Z&X%V$T#R#Q"O!M K JJKKKL M O!|Y?a@k-j,i,h,h,g+f+e*d*b)a)`(^(]'\'Z&Y&W%U$T#R"P"N!M KIIJJJJK yX?ʿj,j,i,h,g+f+e*d*c)b)`(_(^']'[&Z&X%W%U$S#Q"O!N!L JHHHIIIJƾʿi,h,g+f+e*e*d*b)a)`(_(]'\'[&Y&X%V$T$R#Q"O!M K JHGGHHHž`@g+f+f+e*d*c)b)a)_(^(]'[&Z&Y%W%U$T#R#P"N!L KIHGFGGtV?ʿg+f+e*d*c*b)a)`(_(^'\'[&Y&X%W%U$S#Q"O"N!L JHGFEFFƾ`@e+d*c*c)b)a)`(^(]'\'Z&Y%X%V$T$R#Q"O!M!K IHGFEEsU?ʿd*d*c*b)a)`)_(^(\'['Z&X%W%U$T#R#P"N!L J IHGFEDž_@c*b)a)`)_(^(](\'Z&Y&X%V%U$S#Q"O"M!L JHGFEErT?ɿb)a)`)`(_(^(]'['Z&Y&W%V$T$S#Q"O!M!K IHGFEDžb)a)`(_(^(](\'[&Y&X%W%U$T$R#P"N!M K IHGFED`(_(^(](\'['Z&Y&X%V$U$S#R#P"N!L JIHGFE`(_(^(]'\'[&Z&X%W%V$T$S#Q"O"N!L JIHGFE^(]'\'[&Z&Y&X%V$U$T#R#Q"O!M!K JIHGFɿ]'\'[&Z&Y&X%W%V$U$S#R#P"O!M K JIHGFž]@\&[&Z&Y%X%W$U$T#S#Q"P"N!L K JIHGtU?[&Z&Y%X%W%V$U$T#R#Q"O!N!L K JIHG[&Z&X%W%V$V$T#S#R"P"O!M L K JIHGY%X%W%V$U$T#S#Q"P"N!M L KJIH~X%W%V$U$T#S#R"Q"O"N!M L KJIH[@W%V$U$T#S#Q"P"O!M!L L KJIuV?ȿV$U$T#S#R"Q"P"N!M!L L KJIƾU$T$T#S#R"P"O!N!M!L L KJIȾT#S#R"Q"P"O!N!M!L L KJŽ~Z@S#R"Q"O!N!M!M!L K J vV?ȿR"Q"P"O!N!M!M!L K J ƾ}Z@Q"P!N!N!M!M L K wW?ȿP"O!N!M!M L L K ƾO!N!M!M L L ~N!M L L ~ǾM L ƽƾƾGLOB8Lp 0z l unknown/home/philipp/projekte/toastfreeware/confclerk/src/icons/favourite.blendWM z WMWinManz z z z Z \  l k l k |N |N |N DATAz (X z screenW  ,U \ \ 41 -Z SNrZ  SRAnimation.001ݯ l= \ sZ k^ T l DATAݯ  DATA  ݯ aDATA  կ vaDATA կ l  vDATAl ̽ կ FDATA̽ 4 l vFDATA4 " ̽ ,DATA" lϯ 4 ,FDATAlϯ ȯ " ,DATAȯ <Ư lϯ vDATA<Ư dٯ ȯ DATAdٯ ,¯ <Ư ,DATA,¯ ˯ dٯ DATA˯ D ,¯ FDATAD 4 ˯ DATA4  D DATA l= 4 ,dDATAl=  vdDATA\ [  DATA[ |R \ l DATA|R Z [  ̽ DATAZ TX |R l ̽ DATATX deY Z ݯ 4 DATAdeY thY TX կ 4 DATAthY  Q deY ̽ " DATA Q @ thY lϯ 4 DATA@ V Q ȯ կ DATAV |Z @ ȯ lϯ DATA|Z Ӱ V <Ư ݯ DATAӰ T` |Z dٯ " DATAT`  Ӱ dٯ 4 DATA Q T` <Ư dٯ DATAQ l2Y  ,¯ <Ư DATAl2Y D Q ,¯ dٯ DATAD M l2Y l ˯ DATAM ` D ˯ " DATA` 4r` M ,¯ ˯ DATA4r` MZ ` <Ư D DATAMZ lX` 4r` ,¯ 4 DATAlX` rZ MZ 4 D DATArZ rZ lX` lϯ  DATArZ sZ rZ  " DATAsZ 4sZ rZ ̽ l= DATA4sZ TsZ sZ ȯ l= DATATsZ tsZ 4sZ  l= DATAtsZ sZ TsZ l D DATAsZ tsZ ˯ 4 DATA`k^ D. l  ̽ vGaw,|[ ,|[ ͝ DΝ DATA$͝ DΝ DADAvDADA??  wwvG`wDATA$DΝ ͝ mEmEpoo?? paaDATA`D.  k^ 4 lϯ ȯ կ -vJ ̥ DATA$̥  CACAICACA??  JJ-vJDATA$ ̥ CVC9J>8?@ J9-vJsZ DATAsZ , BUTTONS_PT_contextBUTTONS_PT_contextContext9$DATA, , sZ RENDER_PT_renderRENDER_PT_renderRender9=DATA, , , RENDER_PT_layersRENDER_PT_layersLayerso9DATA, , , RENDER_PT_dimensionsRENDER_PT_dimensionsDimensions9DATA, , , RENDER_PT_antialiasingRENDER_PT_antialiasingAnti-Aliasing:9:DATA, , , RENDER_PT_motion_blurRENDER_PT_motion_blurFull Sample Motion Blur"9DATA, , , RENDER_PT_shadingRENDER_PT_shadingShading9fDATA,  , RENDER_PT_outputRENDER_PT_outputOutput 9DATA  , RENDER_PT_performanceRENDER_PT_performancePerformance9DATA  RENDER_PT_post_processingRENDER_PT_post_processingPost Processing9 DATA  RENDER_PT_stampRENDER_PT_stampStamp9 DATA  RENDER_PT_bakeRENDER_PT_bakeBake9 DATA DATA` L D. ݯ <Ư dٯ 4 +, $ T DATA$$ T DADA+DADA??  ,,+,DATA$T $ @~CHBpF}CHB++i?HB|HHB= AH,j+,jDATA DATA`L  lϯ  l= ȯ -vcJ  DATA$  CACAIBCABCA??  JJ-vJcJDATA$  CC9Jl88l??Jm9[-vIJmDATA 4 DATA 4  Z DATA Z l l l l U 4\  W  l DATA`  L ,¯ ˯ " dٯ +E 4 DATA$4 d uDAbDADADA??  +DATA$d  4 C@FCF++?@ ,EDATA$  d CfCww?@ xf+"DATA$  #C`#C`?@ ++EDATA$  +E$ DATAX$ kR?? JLD>3;Q?Fwi?JF>#,TY!e?*=>o?E>Fwi?TY5;JF>!e?Q?#,+=>`DAoy@?Y>0QQA?X>?>#,>& uϜz?T*= lAoA0> O?@fK5>}Q?h3kuQA(ˆy>rB^B@D>3;Q?Fwi?JF>#,TY!e?*=>o?Y>0QQA?X>?>#,>& uϜz?T*= lAoAc @c @c @?\>7?8˔oA+;?DATA, 333?? AL>W ?? B?=C DATA` , <Ư D 4 ,¯   $  DATA$$ T dDA(DAgDAgDA??  DATA$T  $ HCpHC[?? DATA$  T DATA$  C@zC Ao:o:|HPCGiDATA  DATA` @l DATA`, T D l ˯ 4 E $ $   DATA$  jDA(DAgDAgDA??  DATA$   7CHC@#??EDATA$  hD hD@#|H@F #<HBJEDATA($ A l DATA`T ,  " ̽ l= -veEJ| | DATA$  fDAC@AICACA?? JJ-veeDATA$  -veEJ DATAX  @BP@AHMݕ/?U~'?3F:?>T8165e?2>Z& 4?ߕ/?7F:?81W~>85e?'?T2>ne@>M@??"1''?|&??T?ļ*w:@l2R@朿11A 4AF>>Ο;ǽ=ߌ>3x‘B ֟&BŭeA(@ݕ/?U~'?3F:?>T8165e?2>Z& 4??"1''?|&??T?ļ*w:@l2R@朿11A 4AH?N,Z# A3;A??DATA,| 333?? AL>W ?? B? #<C SN z rZ SRCompositingg.001t  4   tϝ l 0wDATAt  DATA  t DATA   DATA   DATA   DATA 4  DATA4 T  D\DATAT t 4 \DATAt  T DDATA  t DATA   DDATA   TDATA   TDATA  DDATA4 T   DATAT t 4   DATAt  T   DATA  t   DATA    T DATA   4 T DATA    t DATA 4   t DATA4 T  4 t DATAT t 4  T DATAt  T   DATA  t t  DATA     DATA     DATA     DATA 4  t  DATA4 T    DATAT t 4   DATAt  T 4  DATA  t   DATA     DATA  t  DATA`      K = = \  DATA$\  DADADADA??  M DATA$ \ mED?|o{?? |L DATA` Q   4 T  E[I\4) L L   k^ <[P DATA$  {DACAHCACA??  IIEII<* DATA$  @~CHB23JуCHBHHA?HB|HHB= AHIBE[IBIB) DATAL DATA`Q |Z`  4 t  T E]I I < <  D 2 DATA$ D CACAHCACA??  IIEIIK DATA$D  C$,-Cvxi!2q1Hq?@IrIr  E]IrIrI t U[ t; , , DATAt t J BUTTONS_PT_contextBUTTONS_PT_contextContext\$&DATAt t t t RENDER_PT_renderRENDER_PT_renderRender\=#DATAt t t RENDER_PT_layersRENDER_PT_layersLayerso $DATAt t t \ RENDER_PT_dimensionsRENDER_PT_dimensionsDimensions\%DATAt t t D RENDER_PT_antialiasingRENDER_PT_antialiasingAnti-AliasingR\:&DATAt t t , RENDER_PT_motion_blurRENDER_PT_motion_blurSampled Motion Blurlur:\'DATAt t t  RENDER_PT_shadingRENDER_PT_shadingShading\f(DATAt t t  RENDER_PT_outputRENDER_PT_outputOutput \)DATAt t t  RENDER_PT_performanceRENDER_PT_performancePerformance\*DATAt t t  RENDER_PT_post_processingRENDER_PT_post_processingPost Processing\+DATAt t t  RENDER_PT_stampRENDER_PT_stampStampta\,DATAt t t  RENDER_PT_bakeRENDER_PT_bakeBake\-DATAt t t # RENDER_PT_freestyleRENDER_PT_freestyleFreestyle\.DATAt t t ( SCENE_PT_sceneSCENE_PT_sceneScenenCVDATAt t t |* SCENE_PT_unitSCENE_PT_unitUnitsC:DATAt t t d, SCENE_PT_keying_setsSCENE_PT_keying_setsKeying SetsC;DATAt t t 40 SCENE_PT_color_managementSCENE_PT_color_managementColor ManagementCDATAt t t 2 SCENE_PT_audioSCENE_PT_audioAudioCDATAt t t 4 SCENE_PT_physicsSCENE_PT_physicsGravity]C$DATAt t! t 5 SCENE_PT_rigid_body_worldSCENE_PT_rigid_body_worldRigid Body WorldEC$ DATAt! t" t ; SCENE_PT_simplifySCENE_PT_simplifySimplifyCP!DATAt" t# t! = SCENE_PT_custom_propsSCENE_PT_custom_propsCustom PropertiesC"DATAt# t$ t"  WORLD_PT_context_worldWORLD_PT_context_worldC$DATAt$ t% t# l! WORLD_PT_previewWORLD_PT_previewPreviewCDATAt% t& t$ T# WORLD_PT_worldWORLD_PT_worldWorldCjDATAt& t' t% <% WORLD_PT_ambient_occlusionWORLD_PT_ambient_occlusionAmbient OcclusionZC$DATAt' t( t& $' WORLD_PT_environment_lightingWORLD_PT_environment_lightingEnvironment LightingBC$DATAt( t) t' ) WORLD_PT_indirect_lightingWORLD_PT_indirect_lightingIndirect LightingC=DATAt) t* t( * WORLD_PT_gatherWORLD_PT_gatherGatherCDATAt* t+ t) , WORLD_PT_mistWORLD_PT_mistMistCDATAt+ t, t* . WORLD_PT_custom_propsWORLD_PT_custom_propsCustom PropertiesCDATAt, t- t+ OBJECT_PT_context_objectOBJECT_PT_context_objectC$DATAt- t. t, OBJECT_PT_transformOBJECT_PT_transformTransform'CyDATAt. t/ t- OBJECT_PT_delta_transformOBJECT_PT_delta_transformDelta TransformCDATAt/ t0 t. OBJECT_PT_transform_locksOBJECT_PT_transform_locksTransform LocksC DATAt0 t1 t/ OBJECT_PT_relationsOBJECT_PT_relationsRelations}Cb DATAt1 t2 t0 OBJECT_PT_groupsOBJECT_PT_groupsGroupsAC$ DATAt2 t3 t1 OBJECT_PT_displayOBJECT_PT_displayDisplayC DATAt3 t4 t2 OBJECT_PT_duplicationOBJECT_PT_duplicationDuplicationXC$ DATAt4 t5 t3 OBJECT_PT_relations_extrasOBJECT_PT_relations_extrasRelations Extras@CDATAt5 t6 t4 OBJECT_PT_motion_pathsOBJECT_PT_motion_pathsMotion Paths(CDATAt6 t7 t5 OBJECT_PT_custom_propsOBJECT_PT_custom_propsCustom PropertiesCDATAt7 t8 t6 $! RENDERLAYER_PT_layersRENDERLAYER_PT_layersLayer Listy\cDATAt8 t9 t7 # RENDERLAYER_PT_layer_optionsRENDERLAYER_PT_layer_optionsLayer\\DATAt9 t: t8 $ RENDERLAYER_PT_layer_passesRENDERLAYER_PT_layer_passesPassesp\DATAt: U[ t9 RENDERLAYER_PT_viewsRENDERLAYER_PT_viewsViews@CDATAU[ t: C TEXTURE_PT_context_textureTEXTURE_PT_context_textureCDATAt; 4<  UI_UL_list_keying_sets DATA4<  t; l RENDERLAYER_UL_renderlayers_ DATA 4< 4B TEXTURE_UL_texslots_1 DATAP, uiPreview_WorldpDATA<  <O _)+DATA`|Z`  L Q     UC* 4G 4G = B TH L1 DATA$= ? bDACA@-DA@-DA??  UC2 DATA$? D@ = C@FCF++?@ ,UU0 DATA$D@ tA ? CfCww?@ xfUUx"x0 DATA$tA B D@ #Cl#C?@ pCC+ DATA$B tA UCrrD+ C DATAXC ># ?A????r@????r=@@?># ?#c#q?67@A?гGe=43<????1?># ?#> 91A??0oA;#< \>7?8˔?DATA,4G 333?? AL>W ?? B?=C DATA` L tϝ |Z`   t  CD\LB K K lH J Z DATA$lH I @hDADAC@DA@DA??  DDCDDTC DATA$I J lH H DATA$J I lCB4S#D9wD@sB1D2DA11A??FFQ= @ DB20CDBDBB DATAPK  @l $??<f1DLnZ LnZ t t CompositorNodeTreeDATA\LnZ t CCSceneDATA`tϝ  L t    ST= P P TM O |[ DATA$TM N @jDA7UDAS(DA(DA??  TTSTTA DATA$N O TM SS > DATA$O N BB\̿|.&@+Ҿ튴?TrSTrTr= DATA$)P @P l dA>d>ddd/@SNz ,  SRDefault Z QZ H[ $v[  l 190wDATA W DATAW  Z  DATA Z D[ W DATAD[ DATA  TEXTURE_PT_cloudsTEXTURE_PT_cloudsCloudsTDATA  TEXTURE_PT_woodTEXTURE_PT_woodWoodSDATA  TEXTURE_PT_pluginTEXTURE_PT_pluginPlugin$RDATA  TEXTURE_PT_voronoiTEXTURE_PT_voronoiVoronoi{QDATA  TEXTURE_PT_pointdensityTEXTURE_PT_pointdensityPoint DensityODATA  TEXTURE_PT_pointdensity_turbulenceTEXTURE_PT_pointdensity_turbulenceTurbulencefPDATA  TEXTURE_PT_musgraveTEXTURE_PT_musgraveMusgraveNDATA  TEXTURE_PT_marbleTEXTURE_PT_marbleMarbleMDATA  TEXTURE_PT_magicTEXTURE_PT_magicMagic$LDATA  TEXTURE_PT_distortednoiseTEXTURE_PT_distortednoiseDistorted NoiselKDATA  TEXTURE_PT_blendTEXTURE_PT_blendBlend=JDATA  TEXTURE_PT_stucciTEXTURE_PT_stucciStucciIDATA  DATA_PT_modifiersDATA_PT_modifiersModifiers7FDATA  DATA_PT_context_meshDATA_PT_context_mesh$<DATA  DATA_PT_custom_props_meshDATA_PT_custom_props_meshCustom Properties=DATA  DATA_PT_normalsDATA_PT_normalsNormalsN:>DATA  DATA_PT_settingsDATA_PT_settingsSettingsv=@DATA  DATA_PT_vertex_groupsDATA_PT_vertex_groupsVertex GroupsOADATA  DATA_PT_shape_keysDATA_PT_shape_keysShape KeyshOBDATA  DATA_PT_uv_textureDATA_PT_uv_textureUV Mapsre;CDATA  DATA_PT_vertex_colorsDATA_PT_vertex_colorsVertex Colors;DDATA  MATERIAL_PT_context_materialMATERIAL_PT_context_material3{0DATA  MATERIAL_PT_previewMATERIAL_PT_previewPreview{1DATA  MATERIAL_PT_diffuseMATERIAL_PT_diffuseDiffuse<{?2DATA  MATERIAL_PT_specularMATERIAL_PT_specularSpecular{S3DATA  MATERIAL_PT_shadingMATERIAL_PT_shadingShadingi{P4DATA  MATERIAL_PT_transpMATERIAL_PT_transpTransparency{5DATA  MATERIAL_PT_mirrorMATERIAL_PT_mirrorMirror{6DATA  MATERIAL_PT_sssMATERIAL_PT_sssSubsurface Scattering{7DATA  MATERIAL_PT_strandMATERIAL_PT_strandStrand{8DATA  MATERIAL_PT_optionsMATERIAL_PT_optionsOptionsR{9DATA  MATERIAL_PT_shadowMATERIAL_PT_shadowShadow{:DATA  MATERIAL_PT_custom_propsMATERIAL_PT_custom_propsCustom Properties"{;DATA  d OBJECT_PT_context_objectOBJECT_PT_context_objectz$$DATA  L OBJECT_PT_transformOBJECT_PT_transformTransform'zy%DATA  4 OBJECT_PT_delta_transformOBJECT_PT_delta_transformDelta Transformz&DATA   OBJECT_PT_transform_locksOBJECT_PT_transform_locksTransform Locksz'DATA   OBJECT_PT_relationsOBJECT_PT_relationsRelations}zb(DATA  L OBJECT_PT_groupsOBJECT_PT_groupsGroupsAz$)DATA  4 OBJECT_PT_displayOBJECT_PT_displayDisplayzi*DATA   OBJECT_PT_duplicationOBJECT_PT_duplicationDuplicationz$+DATA  OBJECT_PT_animationOBJECT_PT_animationAnimation HacksBv-DATA  OBJECT_PT_motion_pathsOBJECT_PT_motion_pathsMotion PathsTz.DATA  ԓ OBJECT_PT_custom_propsOBJECT_PT_custom_propsCustom Propertiesl ?l @l Al Bl Cl Dl El   W 4\ rZ  z , F ĝ   z U                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E , , , , , , , , ,  ,  ,  ,  ,  , , , , , , , , , , , , , , , , , , ,  , !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, @, A, B, C, D, E,                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E L L L L L L L L L  L  L  L  L  L L L L L L L L L L L L L L L L L L L  L !L "L #L $L %L &L 'L (L )L *L +L ,L -L .L /L 0L 1L 2L 3L 4L 5L 6L 7L 8L 9L :L ;L <L =L >L ?L @L AL BL CL DL EL                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E                                                                         !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?  @  A  B  C  D  E  l( l( l( l( l( l( l( l( l(  l(  l(  l(  l(  l( l( l( l( l( l( l( l( l( l( l( l( l( l( l( l( l( l( l(  l( !l( "l( #l( $l( %l( &l( 'l( (l( )l( *l( +l( ,l( -l( .l( /l( 0l( 1l( 2l( 3l( 4l( 5l( 6l( 7l( 8l( 9l( :l( ;l( <l( =l( >l( ?l( @l( Al( Bl( Cl( Dl( El( 1 1 1 1 1 1 1 1 1  1  1  1  1  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  1 !1 "1 #1 $1 %1 &1 '1 (1 )1 *1 +1 ,1 -1 .1 /1 01 11 21 31 41 51 61 71 81 91 :1 ;1 <1 =1 >1 ?1 @1 A1 B1 C1 D1 E1 ,; ,; ,; ,; ,; ,; ,; ,; ,;  ,;  ,;  ,;  ,;  ,; ,; ,; ,; ,; ,; ,; ,; ,; ,; ,; ,; ,; ,; ,; ,; ,; ,; ,;  ,; !,; ",; #,; $,; %,; &,; ',; (,; ),; *,; +,; ,,; -,; .,; /,; 0,; 1,; 2,; 3,; 4,; 5,; 6,; 7,; 8,; 9,; :,; ;,; <,; =,; >,; ?,; @,; A,; B,; C,; D,; E,; D D D D D D D D D  D  D  D  D  D D D D D D D D D D D D D D D D D D D  D !D "D #D $D %D &D 'D (D )D *D +D ,D -D .D /D 0D 1D 2D 3D 4D 5D 6D 7D 8D 9D :D ;D <D =D >D ?D @D AD BD CD DD ED M M M M M M M M M  M  M  M  M  M M M M M M M M M M M M M M M M M M M  M !M "M #M $M %M &M 'M (M )M *M +M ,M -M .M /M 0M 1M 2M 3M 4M 5M 6M 7M 8M 9M :M ;M <M =M >M ?M @M AM BM CM DM EM LW LW LW LW LW LW LW LW LW  LW  LW  LW  LW  LW LW LW LW LW LW LW LW LW LW LW LW LW LW LW LW LW LW LW  LW !LW "LW #LW $LW %LW &LW 'LW (LW )LW *LW +LW ,LW -LW .LW /LW 0LW 1LW 2LW 3LW 4LW 5LW 6LW 7LW 8LW 9LW :LW ;LW <LW =LW >LW ?LW @LW ALW BLW CLW DLW ELW ` ` ` ` ` ` ` ` `  `  `  `  `  ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `  ` !` "` #` $` %` &` '` (` )` *` +` ,` -` .` /` 0` 1` 2` 3` 4` 5` 6` 7` 8` 9` :` ;` <` =` >` ?` @` A` B` C` D` E`  j  j  j  j  j  j  j  j  j   j   j   j   j   j  j  j  j  j  j  j  j  j  j  j  j  j  j  j  j  j  j  j   j ! j " j # j $ j % j & j ' j ( j ) j * j + j , j - j . j / j 0 j 1 j 2 j 3 j 4 j 5 j 6 j 7 j 8 j 9 j : j ; j < j = j > j ? j @ j A j B j C j D j E j ls ls ls ls ls ls ls ls ls  ls  ls  ls  ls  ls ls ls ls ls ls ls ls ls ls ls ls ls ls ls ls ls ls ls  ls !ls "ls #ls $ls %ls &ls 'ls (ls )ls *ls +ls ,ls -ls .ls /ls 0ls 1ls 2ls 3ls 4ls 5ls 6ls 7ls 8ls 9ls :ls ;ls <ls =ls >ls ?ls @ls Als Bls Cls Dls Els | | | | | | | | |  |  |  |  |  | | | | | | | | | | | | | | | | | | |  | !| "| #| $| %| &| '| (| )| *| +| ,| -| .| /| 0| 1| 2| 3| 4| 5| 6| 7| 8| 9| :| ;| <| =| >| ?| @| A| B| C| D| E| , , , , , , , , ,  ,  ,  ,  ,  , , , , , , , , , , , , , , , , , , ,  , !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, @, A, B, C, D, E,                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E L L L L L L L L L  L  L  L  L  L L L L L L L L L L L L L L L L L L L  L !L "L #L $L %L &L 'L (L )L *L +L ,L -L .L /L 0L 1L 2L 3L 4L 5L 6L 7L 8L 9L :L ;L <L =L >L ?L @L AL BL CL DL EL                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E l l l l l l l l l  l  l  l  l  l l l l l l l l l l l l l l l l l l l  l !l "l #l $l %l &l 'l (l )l *l +l ,l -l .l /l 0l 1l 2l 3l 4l 5l 6l 7l 8l 9l :l ;l <l =l >l ?l @l Al Bl Cl Dl El                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E , , , , , , , , ,  ,  ,  ,  ,  , , , , , , , , , , , , , , , , , , ,  , !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, :, ;, <, =, >, ?, @, A, B, C, D, E,                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E                                        ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E L L L L L L L L L  L  L  L  L  L L L L L L L L L L L L L L L L L L L  L !L "L #L $L %L &L 'L (L )L *L +L ,L -L .L /L 0L 1L 2L 3L 4L 5L 6L 7L 8L 9L :L ;L <L =L >L ?L @L AL BL CL DL EL                                                                    W W W W W W W W W  W  W  W  W  W W W W W W W W W W W W W W W W W W W  W !W "W #W $W %W &W 'W (W )W *W +W ,W -W .W /W 0W 1W 2W 3W 4W 5W 6W 7W 8W 9W :W ;W <W =W >W ?W @W AW BW CW DW EW FW GW HW IW JW KW LW MW NW OW PW QW RW SW TW UW VW WW XW YW ZW [W \W ]W ^W _W `W 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\  4\  4\  4\  4\  4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\ 4\  4\ !4\ "4\ #4\ $4\ %4\ &4\ '4\ (4\ )4\ *4\ +4\ ,4\ -4\ .4\ /4\ 04\ 14\ 24\ 34\ 44\ 54\ 64\ 74\ 84\ 94\ :4\ ;4\ <4\ =4\ >4\ ?4\ @4\ A4\ B4\ C4\ D4\ E4\ F4\ G4\ H4\ I4\ J4\ K4\ L4\ M4\ N4\ O4\ P4\ Q4\ R4\ S4\ T4\ U4\ V4\ W4\ X4\ Y4\ Z4\ [4\ \4\ ]4\ ^4\ _4\ `4\ rZ rZ rZ rZ rZ rZ rZ rZ rZ  rZ            z z z z z z z z z  z , , , , , , , , ,  , F F F F F F F F F  F ĝ ĝ ĝ ĝ ĝ ĝ ĝ ĝ ĝ  ĝ             z  z  z  z  z  z  z  z  z   z   z U U U U U U U U U  U  U  U  U  U U U U U U U U p < p p p p  lj lj lj lj lj <   l l  l l  l l l l l l l l  l  l l l `  L  w de \ de de de de l l DATA` 4  >o????` '<>c*ט=????` '>c>*ט?:>>oq:8?O@@_ '>c>*ט????` '>oq:!ɻ?[?[?[?t? @??A.Ne<` '<>c*ט==??DATA, n 333?? AL>W ?? B?=zDL= DATA$i $k @jDA DADADA?? A DATA$$k Tl i  > DATA$Tl m $k lA DATA$m Tl BBAe?A= DATA$)n tW, i m @P l dA>d>dddPA?DATA$  VDADADADA?? lO DATA$ D ^C%^Cgg?@hhhhLP Ϥ DATA$D t  ^C%^Cgg?@hhgh"hLP  DATA$t  D @DDpBDHB1DDlBDDlB?? 2222O DATA$ t MCbDc??N DATA<tW, n ԝ 7O c DATAԝ Save As Image/home/philipp/projekte/toastfreeware/confclerk/src/icons/favourite-no.pnggg 0SN, F z SRGame Logic.001 , L " l DATA  DATA , DATA, L DATAL l , DATAl  L dDATA  l dDATA  DATA  DATA  DATA , DATA, L @DATAL l , @dDATAl  L DDATA l DdDATA  , DATA  l DATA  , DATA , l DATA, L l DATAL l , DATAl  L L DATA  l DATA  DATA  DATA  DATA , L DATA, L DATAL l , , L DATAl  L L DATA  l , DATA  l DATA  , l DATA  l DATA , L DATA,  l DATA`L  l , e| | DATA$  DA DADADA??  e~DATA$  mED@poo?? pDATA`  L L !`  | DATA$|  CACA_CACA??  ``!`DATA$ | CVCO`NN?@ `O!`  DATA  BUTTONS_PT_contextBUTTONS_PT_contextContextN$DATA  RENDER_PT_renderRENDER_PT_renderRenderN=DATA  RENDER_PT_layersRENDER_PT_layersLayersoNDATA  RENDER_PT_dimensionsRENDER_PT_dimensionsDimensionsNDATA  RENDER_PT_antialiasingRENDER_PT_antialiasingAnti-Aliasing:N:DATA  RENDER_PT_motion_blurRENDER_PT_motion_blurSampled Motion Blurlur"NDATA  RENDER_PT_shadingRENDER_PT_shadingShadingNfDATA  RENDER_PT_outputRENDER_PT_outputOutput NDATA  RENDER_PT_performanceRENDER_PT_performancePerformanceNDATA  RENDER_PT_post_processingRENDER_PT_post_processingPost ProcessingN DATA   RENDER_PT_stampRENDER_PT_stampStampN DATA  RENDER_PT_bakeRENDER_PT_bakeBakeN DATA DATA`    R R 4 DATA$4 d JCADA?DA?DA??    DATA$d  4 \CKC?@   DATA LOGIC_PT_propertiesLOGIC_PT_propertiesProperties$DATA$ d DpCPDC3D22??FF?? D3DDATA4R DATA` $  , L Ac @ , \ DATA$, \ CADA?CACA??  @@A@DATA$\ , CCDv?D? #<zD @@Ac@DATA  DATA`$ " l L , E?c  L DATA$  @bDA~DADADA??  E?DATA$   C@FCF++?@ ,EEcDATA$   CfCww?@ xfE?"DATA$ L  4Cm#Cmã?@ ??cL L DATAL L VIEW3D_PT_objectVIEW3D_PT_objectTransformznDATAL L L VIEW3D_PT_gpencilVIEW3D_PT_gpencilGrease PencilPDATAL L L VIEW3D_PT_view3d_propertiesVIEW3D_PT_view3d_propertiesView&DATAL L L VIEW3D_PT_view3d_nameVIEW3D_PT_view3d_nameItem$DATAL L L VIEW3D_PT_view3d_displayVIEW3D_PT_view3d_displayDisplayDATAL L L VIEW3D_PT_background_imageVIEW3D_PT_background_imageBackground ImageshDATAL L VIEW3D_PT_transform_orientationsVIEW3D_PT_transform_orientationsTransform OrientationsPDATA$L  E?c| DATAX| #=Eu=o?????????#=Eu=o?5A A?????#=Eu=o??5A9P=A\>7?8˔?DATA, 333?? AL>W ?? B?=zD DATA`" $ l l CcD$ $ |" # DATA$|" # CACACSCASCA??  DDCDDATA$# |" CC3D22?? D3CcDDATA$ L DATA L b DATAb l l l l U 4\  W  l SNF ĝ , SRScriptingg.001\G H I K K \x l DATA\G |G DATA|G G \G DATAG G |G DATAG G G DATAG G G DATAG H G DATAH 3;Q?Fwi?JF>#,TY!e?*=>o?E>Fwi?TY5;JF>!e?Q?#,+=>`DAoy@?>e` ޠQQuZ?e> .>#,>m%??*=`oAoA>6uU?F pݘ]>3M*? 6hąC% ÈG6DWѦCGBD>3;Q?Fwi?JF>#,TY!e?*=>o?>e` ޠQQuZ?e> .>#,>m%??*=`oAoA\>7?8˔oAk;?DATA,h 333?? AL>W ?? B? #<C DATA`Li % \^ \G \H |H >> python**DATA`% \x Li H H G H Ev v Dt tu DATA$Dt tu CACACACA??  E^DATA$tu Dt CC#~~?? _DATAv 4 DATA 4 |Ӿ DATA|Ӿ l l l l U 4\  W  l DATA`\x % \H G H H  ${ ${ x y DATA$x y CA>DADADA??  DATA$y x DDD)dDq,1CCh #<zD iiiDATA${  =z||SNĝ  F SRUV EditingDNO i ,x l DATADNO ;V DATA;V D DNO aDATAD $5 ;V vaDATA$5 |= D vDATA|= = $5 FDATA= i |= vFDATAi i = FDATAi i DATA  ;V D DATA L& ;V |= DATAL& l& D = DATAl& Y L& |= = DATAY <Y l& |= i DATA<Y w Y DNO i DATAw w <Y DNO |= DATAw w w i i DATAw  x w = i DATA x ,x w $5 i DATA,x  x $5 = DATA`  |= ;V D = vGawL L  DATA$  DADAvDADA??  wwvG`wDATA$  mEmEpoo?? paaDATA`  DNO |= i i EF| | L DATA$  CAqDA)DA)DA??  DATA$ L [C`JC++?@ ,,E,L L DATAL IMAGE_PT_gpencilIMAGE_PT_gpencilGrease Pencil:DATA$L  CC)? @,E,DATA$)| @dA>d>ddd?DATA`  i i = $5 vEFd d  DATA$ D fDAlDADADA??  vDATA$D t  CmCm?@ dEt t DATAt VIEW3D_PT_tools_objectmodeVIEW3D_PT_tools_objectmodeObject Tools*DATA$t  D !CfC[Zww?@ xxdx" DATA VIEW3D_PT_last_operatorVIEW3D_PT_last_operatorOperatorDATA$  t #C~#C~  ?@  vvEDATA$  evE, DATAX :?? JLD>3;Q?Fwi?JF>#,TY!e?*=>_?E>Fwi?TY4;JF>!e?Q?#,+=>6@_???0QQ{?X>?>#,>~Μz?T*=dbR@_@aB>?<`K5>}Q?sMd@JWA.Xj@-@D>3;Q?Fwi?JF>#,TY!e?*=>_??0QQ{?X>?>#,>~Μz?T*=dbR@_@\>7?8˔_@j:?DATA,d 333?? AL>W ?? B?=C SN ĝ SRVideo Editing\  D l DATA\ | DATA|  \ aDATA  | vaDATA  vDATA  FDATA  vFDATA < vDATA< \  dDATA\ | < LFDATA|  \ DATA  | LDATA  vdDATA  | DATA  | DATA < DATA< \  DATA\ | <  DATA|  \ \ < DATA  | \ DATA  < | DATA  | DATA  \ DATA <  DATA< \  DATA\ | < < DATA|  \ \ DATA  | \ DATA   DATA  | DATA   | DATA`  | vGaw DATA$  DADAvDADA??  wwvG`wDATA$  mEmEpoo?? paaDATA`   \ < vcwd DATA$  DADAvDADA??  wwvwDATA$  @~CHBpF}CHBvvI?HB|HHB= AHwJvcwJDATA DATA`   < |  vew  DATA$ D DADAv`DA`DA??  wwve~wDATA$D t  \CKC?@ vt t DATAt SEQUENCER_PT_previewSEQUENCER_PT_previewScene Preview/Render=DATA$t  D ppDDppDD;F;F'7PGDATA$ t zCAzCA A?|HB #<BiDATA @DATA` D | \ KEL5 < DATA$< l dDASDAKgDAgDA??  LLK*LDATA$l  < HCpHC@??  +EDATA$  l KK+EDATA$  C@zC Arro:o:|HPCGisK+EsDATA  DATA` @l DATA`D  \  MvE*5l l < DATA$  CA@DA)@2DA@2DA??  **Mv**DATA$  vv+EDATA$ < CC``D+[+[D);F;F'7PG**Mv+E*DATA$<  zCAzCAKK A?|HB #<BiLDATAl @SCl SCScenetageain$ W U   l I@0˻t? @s=@@@@t  -  ZZD?dd??<  @@ ZQ! ???? DGZ ??????/tmp/ L?L?L??>??_???BLENDER_RENDER Z//@D?fC??x x <` < ?=>L>I?fff?@?@Aff?AA@?A <@@L???&NoneDefault?sRGBsRGBDATAl$   DATAl  network_render  DATAl server_addressx` DATA x` [default]DATAl   pose_templatesDATAl  cycles| | DATAl| volume_bouncesDATA  'de DATA D  'lj DATAD l  vp DATAl  D .4\ DATA  l W DATA  '` DATAH 4   ?o:=o: P2 HB2 B2 HB2 HB2 HB2 HB2 HB>? #<==ff??AHz?=???C#y??#y???1I?=¸=I??I@DATA04 l( DATA0 l( DATAD L ddDATA DGZ with_skyerrDATADGZ  no_skyayer?=(@DATADt k p NTCompositing NodetreeԼ CompositorNodeTreeCC " Z ~RDATA fJ @ CompositorNodeRLayersRender Layers.001???t Ҽ l XjolC"-CB(B8]XjÎ4BolC"CXjÎ>DC33CDATA4t e4  ImageImage NodeSocketColor48C ??DATA ?DATA44 eZ t pV AlphaAlpha< NodeSocketFloat4ÚC ?DATA ?DATA4Z e42 4 dz] ZZ< NodeSocketFloatҧ:ÚC|fZ ?DATA|fZ ?DATA442 e\Ҥ Z TpP NormalNormall NodeSocketVectorÚCb ?DATAb ?DATA4\Ҥ el 42 t UVUVl NodeSocketVector, ?DATA, ?DATA4l e \Ҥ x SpeedSpeedl NodeSocketVector.Z ?DATA.Z ?DATA4 e; l q ColorColor NodeSocketColorÚCn[ ??DATAn[ ?DATA4; eD DiffuseDiffuse NodeSocketColorO ??DATAO ?DATA4D e2 ; l SpecularSpecular NodeSocketColorԛ ??DATAԛ ?DATA42 e D ShadowShadow NodeSocketColorD ??DATAD ?DATA4 ec 2 L| AOAO NodeSocketColordZ ??DATAdZ ?DATA4c eШ wP ReflectReflect NodeSocketColorT ??DATAT ?DATA4Ш e\ c D RefractRefract NodeSocketColor ??DATA ?DATA4\ eџ Ш \Z IndirectIndirect NodeSocketColor| ??DATA| ?DATA4џ ed \ ,Y IndexOBIndexOB< NodeSocketFloatÚC\,[ ?DATA\,[ ?DATA4d elU џ , IndexMAIndexMA< NodeSocketFloatÚC,Z ?DATA,Z ?DATA4lU e> d ܸ MistMist< NodeSocketFloatD ?DATAD ?DATA4> e, lU U EmitEmit NodeSocketColor ??DATA ?DATA4, e4D > $p EnvironmentEnvironment NodeSocketColorÚC ??DATA ?DATA44D e| ,  Diffuse DirectDiffuse Direct NodeSocketColor|K[ ??DATA|K[ ?DATA4| e>\ 4D N Diffuse IndirectDiffuse Indirect NodeSocketColortӨ ??DATAtӨ ?DATA4>\ e | _ Diffuse ColorDiffuse Color NodeSocketColor\ , ??DATA\ , ?DATA4 e >\ \: Glossy DirectGlossy Direct NodeSocketColor<O ??DATA<O ?DATA4 er lY Glossy IndirectGlossy Indirect NodeSocketColork ??DATAk ?DATA4r e  Glossy ColorGlossy Color NodeSocketColor ??DATA ?DATA4 e^ r Transmission DirectTransmission Direct NodeSocketColorte ??DATAte ?DATA4^ eD & Transmission IndirectTransmission Indirect NodeSocketColorD ??DATAD ?DATA4D e ^ TX\ Transmission ColorTransmission Color NodeSocketColor:, ??DATA:, ?DATA4 e| D ; [ Diffuse IndirectDiffuse Indirect NodeSocketColorf ??DATAf ?DATA4T> e? = [ Diffuse ColorDiffuse Color NodeSocketColor,Z ??DATA,Z ?DATA4? e@ T> tZ Glossy DirectGlossy Direct NodeSocketColor,h ??DATA,h ?DATA4@ eB ? [ Glossy IndirectGlossy Indirect NodeSocketColorh ??DATAh ?DATA4B eTC @ Z Glossy ColorGlossy Color NodeSocketColori ??DATAi ?DATA4TC eD B Z Transmission DirectTransmission Direct NodeSocketColorlj ??DATAlj ?DATA4D eE TC T Transmission IndirectTransmission Indirect NodeSocketColorI[ ??DATAI[ ?DATA4E eG D U Transmission ColorTransmission Color NodeSocketColorY ??DATAY ?DATA4G eTH E E' Subsurface DirectSubsurface DirectH NodeSocketColorS DATAS DATA4TH eI G G' Subsurface IndirectSubsurface IndirectH NodeSocketColorD7 DATAD7 DATA4I eTH T Subsurface ColorSubsurface ColorH NodeSocketColorN DATAN DATA Z j J 4 lL DATA j Z "  # \ DATA j J  M  IM(P RZ IMRender Result//emblem-new-off.pngOP ՃX??IM(RZ P IMViewer Node|q[  ӃX??CA CACameraamera.001?=B ByB??BALA "LALamp????̬?A6?>??l .?A?@@L=@ ???o:??????@????? A DATAPl ????C?55?55? ??????DATA ??DATA( ))WOU aPWOWorldO?????A @A@pAS8>L@?L=  ף;Ǝ@=?? DATA( OBW 4\ OBCameraamera.001    s=@@?????????????s=@@??????33?3?5)????r@???1??d???>6 ?u=> A\B????? DATA ??=L> ף<OB4\ ` W OBLamp    @@??????II????>5?5?5??5?@@??????22?3?'4'?>5?5??5?25??'zZ?>5?5??5?25?3+@c :=a?d?<?>">u=> A\B??@???$ DATA$ ??=L> ף<OB` de 4\ OBPlaneW T+   ,U 4U &\@s=@@??????_71V,I?????5?5?V,255?_71UY):?&EI@????r@?????5?5U5?5?Y)B2l+1?32a3?5?5U5?5?Y)PY2l1? := :=0D??d? #=?>=?> A\B??????@???t &DATA,U DATA4U OBde lj ` OBStar Half1 \   i i X ̌ ?????????????????????????r=@@????r=@@?d? #=?>=> A\B??????@???R=|ʤ \w &DATAX  DATǍ DATAhi Z EdgeSplitl ?OBlj p de OBStar Off$ <   o Dp tm 2 ?????????????????????????????r=@@?d? #=?>=> A\B??????@???b<v 4ξ &DATAtm  w DATA2 DATAo [o Bevell ף=?6S?DATApo SDp o Subsurfl У DATAlDp Yo Mirrorl o:OBp lj OBStar OnLT[ <   Tu v Z , ?????????????????????????????r=@@?d? #=?>=> A\B??????@???b<| &DATAZ  DATA, DATATu [v Bevell ף=?6S?DATApv Sv Tu Subsurfl RDATAlv Yv Mirrorl o:MA, w &L MAinactive1N=́=ɠ=??????????L??????????????? #<2L>??L>???2?? ף; ף;G@G@ ????????@?=?==???, ???????L==ff?????DATA(,  Dz DATADz 3f ff33  f3   f f  f ff 3  3ff  3ffff    f 3f3  3f 333f  3  3  3  f  f3f    f3MA,L & w MANoeriale&?e&?e&???????????L??????????????? #<2L>??L>???2?? ף; ף;G@G@ ????????@?=?==???\ ???????L==ff?????DATA(\  DATA !!!3!!!3cccccccccBBBfBBBf!!!3!!!3ccc̦BBBf!!!3cccBBBf̦BBBfccccccBBBfcccBBBfBBBf̦!!!3BBBfBBBfBBBf̦BBBfBBBfBBBfcccBBBfccccccccccccBBBfccc!!!3BBBf!!!3cccccc!!!3ccc̦!!!3!!!3BBBfccccccccc!!!3ccc!!!3cccccc!!!3BBBfccc̦BBBf!!!3BBBfcccccc̅̅cccBBBf!!!3MA, &L MAYellowl.001L?60=?|? ???????>?7?333?????????????? #<2L>??L>23??G>??2??V> ף;>I ABB ??????o:??@?=?==U???Ġ ?9Aux@?(>= W>1,>L==ff?????DATA(Ġ  HI DATA 33ff33       f3     f     f !$%&&%$"      f!'+--.-,+)'$"    f$,03455431/-+(%"   f 059:;;;:97631.+(%!   3f29= @ A B B B A ? > <9740-*'#   1;A E G H H H H G E D A ? <952/,($   ff<D I L N O O O N M K I G D A > ;740,($  ,D K P S T U V U T S Q O L J F C @ <951-($   f? L S W Y [ \ \ [ Z Y W T R O L H E A = 951,(# ffG S Z ] ` abba` _ \ Z W T Q M J E B = 950,&!  fP Z ` dfhhhgfec`] Y V R N J F B = 94/*$ *V ` fjlnnnnnmkhd_[ W S N J F A =82-'  *Z elprtuuwxyxtnga\ W S N J E @ ;60*# +_ jquxy{}  ~ sib\ W R N H C > 93,%fbnvz} '/2".% tha[ V Q L G A ;5.'  3cqz (8'G6L 70)!f` t} 0G6\LdUZKD5.vjb\ W R L F @ 92*"3:t"4!N=81Ap?>ҽ2Ep>ҽ8ñ>p>=DATA  DATA0 4####DATA4 NGon Face-Vertex DATA :DATA̷ NGon FaceN DATA N 9ME< 1\ MEStare.001Lx[  t ̾  \    3==pxs?ߍg?=C ?DATALx[ DATA t DATAt 7 ?~qxs?y7>!?~y?O?N~yON~pxs~7>?~8d>Av>v女>Q j5¾qqQ8dCv> v女3L>DATA\ ̾ DATA̾ 4"""""""" " " " " " " "DATA NGon Face-Vertex DATA :     DATA NGon Face DATA< 9 ME\ 1< MEStar Halft U , T $ $    dT AZ\ 3==pxs?ߍg?=C ?DATAt DATAU IDATA$  DATAA 7Ah[=٦Zh[=%zh[=avc#'=Φbfvc#'=%h[=+"yc'=eo{&=I% N xy=E"Є xy=(=*кqξN< 9F@F< # iP#q?ټz 쉽=[-0='%Ăb(=:  'P=P=9оdRE(W(!Ѿb=&yvվ)]%y[dR i=S j!=t)C@= =B?=EpTܾSG!#kz^S<=!3f!vͽ=k'vͽ=F<-кrЦ{Wq*кc&zJ!/=uǂk&t&= +zپ< 1΀?"6<`I&9F@Fs {FdۼѽA=ρ]"ڽ = "©V=-v!vͽ=! *кMWW뼘 q༽h&z p^BoۼU%Bz>0"pU=BxLx=5 ~Gb\P8r=ق|7/l{=p#%Dž6ҼY"z1΀?"6{m(= RXB6= B5=/ yc'eiWfvc#'%Uz++@=IKr=K .Rl̾6*= @'„]=oH<=_8_Lx=wh*m (>çp'`[0'"|NTF)"8{cMY&R㠼Vo}SxU{=eĂjC_ֽS=njY= sY=% h['YZh[%zt:Ę8!=])Ra:4Lk=Qqxy=o@1ؾ<`9w L|k&t&| .Rl̾6*j}n &f= \qrEx= 'صiB=M ρ;=2 Y= @h[aWCgiY[$zldfT'#{q|ߥnX#= jjr>= Aze\o"pU= whWƫƌr"iZc |O} LT`O~Q谽T[KE!{@1ؾ̼`9~^o퉽=6 b=5 ?H赽ƍ=\ 582mI=bh[+X:bbG i=  S6` $Hx=J 1xaJ^=N z_0˾< ` /#<6ۜӖb<fc;B=B?Eg|J!/u9}IKrK}qxy~FO<=K$X6=Cgý=p) eνڄ=  ̄ xy(=X N xyE"0{ɳܼtyڄQ"4{D`XP^!{?!Hx2 |r6%y= o44F=a Tۇt /=> ǂ`_Fft fc!~6ۜӖb~/#ৼ [dR i|_0˾ۼ ` ~&'=""S=^7 Fқ=5# Ik}Ly=\! x{=WRnW?=#/t2K=ZsLS T=! $齊Y=" IPbK< U-< tue";y, 彾:"6{>0"pUB\}Evr>}q|ߥnX# j`~!D~}a9N=f=[.=d)=x=  #^<_=T wcV< =93<=oĂʪ|Y=7"Y I<+}1W3s5<+XX|ؼ,|[Y1S|}稽R96J )|C@ |ǾTɾL<PGtT 9}W=B=E?ρ5= =Cq׈q8==? $ﷁYJsg<6=Do7|?…>)]<&¾cb<&2n ./ $H/Sy L/3+at&@/A{ ?׾Rվ[c }Ѿ'"|ܾ񾳘l~++@|t:Ę8!]|t2˾fa@"6 {:bbG i  |zg>V=ѥvͽ=퉽=^3j==atĂV=)=M;zns=<=%"=Ȅʾ6=.Ăҝ*>(=a죟==5릂]ܵH=@=}5ま="=;H)zQ5S<…%< i=S B5Խ/ YRXB6Խ~m(  } (? 6:|̰ؾpt@0l&׾KNL0'F׾\,c*/>'uK2c*}FvžL!|N<@B {^ѯ~Ra:4LkQb|6` $HxJ |ܾF#8z#/t2K{+8D><=ЦRUMɽ >=爃t)==逃Q{=S=Wj@1Ŕ=6={}D; =lؾ.}N>z#n>=[怃o 0>S= 6jn"G>6=rDdQɳ=@=Lt,=9r=ق]& =Lx=Tml=#pU=cμ@/JhùRbD=/=ǂYڽ% }YYڽ SxU{฽e<}jC_ֽSn|;2 |1xaJ^N {sLS T! {̰ؾpt@l&z\ b>@=:f(>қ=ItINB>ƍ=x5v+ >=orH>Mk=/랃2Ѿf&='= Y ^b9<)]&yU˽J:>ƍ=5~N>=ly g>Lk= 䞃tAZƀ>8r=/Wi ="=-)b=Lx= C= ]=Hi=s>= Yʾ{==Ve% Q<.G82mI޽bN]^o퉽6 R}b5 | ?H赽ƍ\ {) eνڄ  4{$齊Y" z׾KNL'y+>!==)>Lx=k滂H>y=1)09>ڄ= ̄}C->^=yzha*">Hx=Mz=8*<3nvـ=T'uy X,> i= xS2{>"pU= 褂_>r>=.)ti>[=AgA4Z>Y=lIJ\}N>T=#{%D>K=FZE=<w@W=L<> M@@=\c <!D~Y=QGI9,^߈>T=!K=OZ+>nX#=O}叾;>?=8癃𶤾2>/=vBǂnֻ*>=}Ծp">z=poTC9><#E=.+<ڽ},WݼV|#Pƍjj{-v[Kڄ!j 4{q ۾e^ѯ%5 y5¥>?=I虃:A>/=ǂ8>=" ɻ^~>y=큁mZS|>&=୅ev]p>j"=wY͹ff>=rȄ\]]> = _>$<8i >b<7Jdc `>;) Ca9N=fؽ[[.=d)=xҽ ~#^<_ͽT ~cV< Ľ}93<฽o<}ʪ|Y7"Y zǢ =&"1Sz`s5#zF̾*ʽb6#ySᾱ."y,!>&=H4㭅jHq>j"=/tY*z|>=Ȅ-> =6(><!mB\ͅ>$'=VADžaXV>'= Kt-;9O>8*< 36GYCH>'={S'>7*<37>>s<lx>Do<{ݾQ>6< BfЀ>N< K"A>$KU-$; (7 >- Uv=_ͽ(![;l݈=Bɽ;1~_ڽ!r_= Ľ+}[V ~2=WK}O(n=) } -Ej"!z/;T {眿ʪuDoۼ BzվB)] y꾕ǫHgyHEà>r<p0̾>Do<澅V@Rq>6<_`B 8>N<낄f ?#<G[">< VžPz>< ㏃8.߾t>T< 0葂9nsn>L< [W=BɽE?1~5= ĽCq}׈q8=˽? $I~YJsg<6|o7|?< &zz>T<0 ?K< ?L<x>b<2%26R>)]< s fr>S< j…Z >AF<_>U-b<3 %HW>/;h dP24M>l;" zW>SC>ވ-Szg>V/Zvͽ=퉽^R}3j=฽at<}V=) }M;zns=<}%"8{ʾ6ҼIz{*K {zQ5S>zS%zcLz[^P>b<2IW7>)]<D6\>S<'…K"u>AF<üR^"?U-<J!B6!?b< *%u0>d< ,4_־+>A"6<0L&'aY>'"<bK>\c <kk6Y=퉽 R}(W|[>฽.<}ҝ*>(a}죟=5Z}]ܵH=@}|5ま=";H|%< i|j `>@"6M+/R]K񋤾>>/ QF 3Q>xJ/=\;%>~O/ JBZ"e>$;BxH|.|>l;pWg>;#C9 p>:0Bc>.x++8D><ЦRYMɽ >x|t)=|Q{=SW|@1Ŕ=6{}|; |lؾ.}Nżm~~{D/nAFzfu<?g g|cμ@z w>Z.K b>9. FN>>Ð.g!5;W>xJ.w JFE].?";w*Ƽz9?l;U9"?;1(Bmf>b/9 B 3>xJ/ZGU%.>>/ )>M+/ /#n>[|o 0>S 6|n"G>6r|dQɳ=@L|t,=9r'}]& =LxR}Tml=#pU\}hùRbD=/9}T&F?Vsq?-_s1JB?: a6"?+q"+,>Z.7&>9."Sw?A>Ð.D?+\(/>b/cFGC&}>xJ.EJ \ b>@:|f(>қIt{NB>ƍx{v+ >o|rH>Mk/b|2Ѿf&=' Y |^b9ƍ{~N>l|y g>Lk b|tAZƀ>8r/ZWi ="-|b=LxR} C= ]}i=s>}Yʾ{=Ve}% Q<{M?'"@|K?Zc j}1[TM?9"?5'~+>!=|>LxkE}H>y񅽞{1)09>ڄ 4{}C->^y{ha*">HxM |z=8*}nvـ=T㠼T o}G \]='"|j `>@"6=Q{FE].?" |R*Ƽz9?l41JB?R1[O_Z>ڄ!4{^M{(Z>Hx7 |]5>]Z؁E> i"|>#pUe\}atK>s>]}¾zn=oX#L`~s۾X=z ;~v~9=*qJ|zz>T㠼o}5;W>xJw z ?LO~J!B6!?b *~ X,> i x|2{>"pU \}_>r>}.)ti>[AzA4Z>YlzJ\}N>T#{{%D>KF{E=̼~@W=L> O~M@@=\c }Kq> &q|K"u>AFzüR^"?U-X(1S+.?/R\*:{>YQGz9,^߈>T!{KO{+>nX#O[叾;>?8g|𶤾2>/vB9}nֻ*>}}Ծp">zp~TC9>ۼ~#E=}S'>7*}7>>̼/ ~D6\>S'>zf ?#ৼG~5¥>?Ig|:A>/9}8>" }ɻ^~>y~mZS|>&Szev]p>j"wߧz͹ff>r8{\]]>  |_>$ৼ8 i >b7J~dc `>仵) ~VT>'{| 8>Nż~{N>>Ðg!zV@Rq>6Ҽ_`z0 ?K\,!>&H4SzjHq>j"/tz*z|>8{-> |6(>ۼ[mB\ͅ>$'VA9zaXV>' K|t-;9O>8* }6GYCH>̼i B~KU.= ~IW7>)]y0̾>DoۼBztC~>slzx>Doۼ{BzQ>6Ҽ ޾zfЀ>Nż ~{K"A>$ৼu v9>Ky RPj1>U-E gn))>$ R(7 > S b>9® yHEà>rpz[">yVžPz> q|8.߾t>T㠼 0o}9nsn>L [O~[^P>byx>b2%y6R>)] sy fr>S j>zZ >AFz_>U-e gQ Qg>b3 ~%HW>/h P24M>l" z>SC>ވ w>Zy%u0>d ,y_־+>A"60L{'aY>'"|bK>\c }.є>M+R]ܵy񋤾>> Qںy 3Q>xJ=z\;%>~O ܶzBZ"e>$BxRH|.|>lpg>#~9 p>Bc>xmf>b9 y 3>xJZ߹{U%.>> |>M+ /}+,>ZS7&>9®"w?A>ÐD?\(/>bc~GC&}>xJEJDATA $ DATA8L$ 4Z"""""    " " "    " "        "  "  "         , ,   ! ! " "$ # #" $ $% &'"'"( (") )",* * *+ + )-"-! +. .#"$/ 01 1'"'("()"2"2A A," 3"32 !4 43 -5"54 "6 69"#7 76".8"87"$9 9:";1 1< (<"<= =-")="A> >*">? ?+"?@"@."B5"-B"@C"C8"9D DE FG"G1"=B IH"HA"JI"I2"KJ"J3"5W"WK"K4"BL L5 MD"NM"M6"ON"N7"CZ"ZO"O8"DP"QG GR <R"RS =S SX HT">T"TU"?U"UV"@V"V_"_C"BX Xd"dL Y5 LY"D["[\"]^ ^G"a`"`H"ba"aI"cb"bJ"Wq"qc"cK"YW de"eY"f["gf"fM"hg"gN"Zu"uh"hO"_i"iZ"[j"k^"^l Rl lm Sm ms `n"Tn"no"Uo"op"Vp"p{"{_"rW Yr"Xs s"d et"tr"iv"vu [w"wx"yz"z^"{|"|i ~}"}`"~"~a""b"q""c"rq""e""t"w""f""g"u""h"| v w"z"z l m }"n""o""p""{ q r"t""s " ""v w z""| "}""~"""" """"""""""""""" "z" """"""" " """"""" "" "" """"" """""""""""""""""""" " " """"""" """""""" "" """""""""""""""""""""""""" " """"""""" """"""""""""           " "        ) ) " *"*"" """ """""""""1"1""4"4"""""""  "  "  !"! !"""""#"#"*$"$"$%"%"%&"&"&'"' )( ( ,+ -,",".-"-"D"D."."1/"/"/0"0"42"2"23"3"5"65 5"86 6 (7 7 P P8 8 9: : #E"'; ; ;< < <= ="=[ [)" >"\*"?"@ B"BD"C"CB"E"EF"F"FH 0G"GC"H"Hd d1"J"Jh"h4"K"KJ"L"LK"M"ML"N NP 7O ON Q:":R" R"RS"!S"ST""T"To"o#"U$"V%"W&"X' [Y Y("YZ Z7 ^, _-"Dw"`."da a/"ab b0"bc cG"he"e2"ef"f3"fg"gI iM"ji"i5"lj j6"Zk kO P"l l8"mn"n:"op"pE";q <r"=s"["Bt"Cu"Gv"px xF"xy yH"cz y{ {d"~} }h ~ ~J "K M""L"N" O" k  n"n"R""S""T""o"Y"Z"k { a" b" c  } e  f "g""| i""j""l"" """n" p" x  y  {  }  ~   "" """"""""""""""""      "      """"""""""         "        " """""""""""""""    " "      " """"""""        """        " """"""""""""""""    " "      " """"""""        """""         "" ""  " " " " "  " "  " " """"    " "      " """ "! " # $"%"> &"&>"? '? ' (' ( )( ) *)""* "@""A"+",+"+"B","-,"- ".-". "/."C" "0D"0"E1" E"12" 1"23" 2"34"3"4"4F"! !F"FG "! "G GH #" 65 6 57 5 #H H] ]6 6# 78 7 89"8 ?: :; : ;< ; <="< = =I"$"$I"IJ"%$"%J"JL"&%"&L"Le"e>"f?"[5 \7 ^8 `:"a; b< c= dK M'"N( O) R+"Q,"S-"T."1W"2X"Z4"3Y"Mu"f"fM Nv"MN Ow NO Px OP gP"P* *@"@g"hg"@A"Ah"ih"AB"Bi"Qy"y{"RQ"Sz"zy"QS"{i"BR"R{"T|"|z"ST"}| TU"mE"EC"jm"jC"CD"kj"kD"DV"lk"lV "###m#mQ#Q9#9# # #######y#yk#k]#]Q#QF#F;#;0#0&#&### # ##### # ###%#%/#/:#:E#EP#P\#\j#jx#x##""3I"g|     >K   "     ~l m  Wm"W  XW"X "YX"Y""Z"ZY"nF"Zn"oG"no"pH"op []  ["\[  \"^\  ^ ]"p _^  `f `"a` a"ba b cb c qI"cq"rJ"qr"tL"rt"de" d"sd  s e"t"g"h"{"i"  j "k ~ "l""n""o""p"""q r r"t" y"z"|     """"""""  "" """ """      "" "           " """"""""""""""""""""""""""" #       " """"""""""" """"" "" "       " """""""""       " """"""""""" """  """""" "        " """"""" "         " " "  " "  " " """" ""  "          " """""""    " "" "" "&"&"* "  " +"+! !"!" " "# # #$ $ &%"%"%'"'"'("("()"$,",",-"-"-.".".5"5&"8+"+  /!"0""1# 2$ 53"3%"34"4'"46"6("67 ,9"-:".;"?5"<3"=4">6 """+">\"?>"@?"A"A@"\U"UV"VW"WX"^]"]+"_^"`_"w`"Xq"qr"rs"s"tw"ut"vu"zv""""z""""""""""/"9"_9"/U"u"vu"wv"xw"U}"_"""""x""""""""}""""""""""*")"*8"8/"/0"01"12"7)"29"9:":;";?"?<"<="=>">@"@7"##I#I|#|####K#Ks#s#### # ###~#V~#0V# 0# #DATAdT NGon Face-VertexT DATAbT :\ _^`]   a \    b [  c Z   ! "#!$%&d'Y(),*+ ,(-!. +#/"0$31#2"/%&3$4%e&5'6'X7(89):" *,;*<$<*=+>!-:)?-@#1>+A.B%4$C/f0D1E'5&W6'F(78(G)9H2IAJ,) K3L2H,!M4N3K .-O5P4M!@"Q6R9W$0#S7T6Q"2.U8V7S#B/C$W9X:g;Y1D0V'E1Z<[(F([<\=^)G=]-?)^*;,JA_>`+=*`>a?b.A+b?c@dBe5O-f8U.d@gCh:X9iDjEhFkGl1Y;U=mBf-]AI2qInHo2L3sJpIq3N4vKrJs4P5tWuKvBwLx5e9R6{MyDi6T7}NzM{7V8O|N}8hC~ZOEjDPiQGkFT1lGR<Z<RS=\=SXBmAoHT>_>TU?a?UV@c@V_CgBXdLwY5xLPD[\j]^GQSHnIa`IpJbaJrKcbKuWqcYWt5YLdeDyMf[MzNgfN|OhgOZuhZ~C_i\[jkk^]RG^lRRlmSSmsXH`nTTnoUUopVVp{_rWYXsdetrYivuZj[wxlyz^kQi_{|`a~}ab~bccqrqWedte[fwfgghhuvi|xwmzyP^zllmms`}nnoopp{qrtrstvuvwnzO|{|}~ ~       qw !zNz!"##$%%&'}())*++,--./01230452674'89:;6<=>?<@A>B M/CDDEFFGHIJKLMI NOL 1PQ9RSSTUUVWWXY:Z[\]^Z_`]ab_@HcdefBL"fgh$hij&jkl8lmn(Kop*pqr,rst.tuvQwN3zxP5|yz7{|;}~=a?AdeKnRvCEGcJMOwTV}YX[^`bJgikmoqsuxy{~o I      ) * 14 H  !!""#*$$%  % &  & ' )(,+-,.-D.1//042p23"5 $6!5")8#6$(%7&'P(8)9*:+G#,E= '-;.  .;/<0  0<1=2  2=3[4) 5>\6*7?>5 8@?7A@89B:D;C<B9=E>F??F@HC0AGBC;CHDdE1FJGhH4IKJJFKLLKIMMNLKONPP'7QORNO&QS:*9F+:TRU  URVSW!!WSXTY""YTZo[#$*6\U\%$\UV]& %]VW^' &^WX_()4[`Ya7%(aYbZc+,d^],-e_^d-.g`_e.Dfw`g/1Edhai0/iajbkGA0kblcm24Hhneo32oepfqIq3qfrgs 5vitMM5!6xjuiv6#8}lwjxOQ7cZykz8(P{|l}m~n:SQEE,#[op'_Xq;-;qr</<rs=1=s[3BtwfD:CutB<GvuCBF>EpxH@FxyczvGmdDHy{hGJ~}JJK~KLLLNMN{PPONRkOzn~mD:nRTRSVSTXToZY`[ZbYkyZd{ahabjbclczh}enefpfgrg|riMtjiuljwk l|nCpoxpyx{y}~~ Bn{ }As         !!"##$%%&  '(()**+,,-./012/3415637889::;<<=>.?@t@ABFCD HEF KGHIJKNL5PMNROPQRSTUUVWWXYYZ[>\] ]^_"_`a$ab&Dcd'def)fgh+hij-klI0mnk2opm4qro6[st7tuv9vwx;xyz=?j{|A|}~u~CEGJLqM O  Q T  V  X Z\z^`bcegilnpr+  @!s!"u"#w#6y${$%}%&>v&?''(())*@ *A#@B&A+,+ R/B, --  .. /C7E 0D:CE1  12  23 344F!!FG""GH#6557#H]67889?::;;<<==I$$IJ%%JL&&Le>' Mf?56][75[\87\^98^_:?f`;:`a<;ab=<bcKw>ed M '( NN () OO )*PR +,Q*Q,-S-S-.T3T./U5mW1E6WX21XY32YZ43MufNvuMOwvNPxwOgP* @!h"g!@#A$i%h$A&B'Q(y){0R*S+z,y(Q-{.i'B/R0T1|2z+S3U}4|1T5m6E7C9j8j9C:D<k;k<D=V?l>\oCmWWXXYYZnF4ZoGFnpHGo[]\[^\]Hp_^`fa`bacbqI=crJIqtLJrdesdeLtPg xg"h!h%i"i.{#m8jj;kk>ll~nZonpopc$qrqrtty%{)z&y,|'z2}()|4 *ryx       +z" $!"'#$%&'())*++,- -./012,342566789:;%<=:>?@@ABBCDDEF/GH HIJJKLLM-8NOOP{ SQ>!URS#XTU&VWX(FYZ*Z[\,\]^.^_`1abc4de05cfg3.hi7gjklmV;nol=pqn~?r stAtuvCvwxExyz`{|G|}~I~K/Mdik|N rQRTWz Y  [  ] _boeafqj} h0ms uwy{}1       &2*  +!!""##$&%%''(()3 +$,,--..5& *48+!+85/"!/60#"071$#182%&53'%34('46)(679$2:9,,9;:--:<;..;=?535?><43<?=64=@>76>A@BpD3qIEIsgr|F|sGtHBuIvJ>wKKdsLK MsxzNyO9{PP| QpR }<S~T~Ul?VV~D0WV= X0SY @ABCDmEQF9GH IJKLMNOPyQkR]SQTFU;V0W&XYZ[ \]^_`a bcde%f/g:hEiPj\kjlxmnCDEIF|GHIJKKLsMNOPQ RSTU~VVW0X YDATA NGon Face, DATA8%, 9  !$'+/37;?CGKNQUY]aeimpsw{  !%(,048<@CGKOSW[^aeimquy}  $(,048<@DHLPTX\`cgkosw{ #'+/37;?CGKOSW[_cgkosw{ "&*.26:>BFJNRVZ^bfjnrvz~  !%)-159=AEIMQUY]`dhlptx| #'*.26:>BFJNRVZ^bfjnrvz~ "&*.26:>BFJNRVZ^bfjnrvz~ "&*.26:>BFJNRVZ^bfjnrvz~        ! % ) - 1 5 9 = A E I M Q U Y ] ` d g k o s w {                                            ! % ) - 1 5 9 = @ D H L P T X \ ` d h l p t x |                                          $ ( , 0 4 8 < @ D H L P T X \ ` d h l p t x |                                             FBRl  BRAddh.001?< ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP< ????C?~6=~.= ??????DATA0 ?>k?@? ף=?BR , l BRBlob001? ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>?>>>>?CCCCCCCCDATAP ????C?._ra ??????DATA0 ?>ףp?@?u=?BR,  BRBlur.004? ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP ????C?~6=~.=T ??????DATA0T ?>k?@? ף=?BR  , BRBrush?\ ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=??????>!!!L>?>>>>?CCCCCCCCDATAP\ ????C?._ra ??????DATA0 ?>ףp?@?u=?BR L BRClay001? ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>?>>>>?CCCCCCCCDATAP ????C?._ra ??????DATA0 ?>ףp?@?u=?BRL   BRClone001? ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=???333???>!!!>L>???CCCCCCCCDATAP ????C?~6=~.=t ??????DATA0t ?>k?@? ף=?BR   L BRCrease001?| ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???>??>!!!>L>?>>>>?CCCCCCCCDATAP| ????C?a2p?  ??????DATA0 ?>?@? #=?BR  l(  BRDarken06?& ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP& ????C?~6=~.=4( ??????DATA04( ?>k?@? ף=?BRl( 1  BRDraw.001?<0 ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=??????>!!!>L>?>>>>?CCCCCCCCDATAP<0 ????C?._ra1 ??????DATA01 ?>ףp?@?u=?BR1 ,; l( BRFill/Deepen001?9 ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???? ??>!!!>L>??>>??CCCCCCCCDATAP9 ????C?._ra: ??????DATA0: ?>ףp?@?u=?BR,; D 1 BRFlatten/Contrast001?B ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>??>>??CCCCCCCCDATAPB ????C?._raTD ??????DATA0TD ?>ףp?@?u=?BRD M ,; BRGrab001?\L ??????????L>????????????????????????????????E???????L>?????????????????????????????????K Kfff?=??????>!!!>L>>?>CCCCCCCCDATAP\L ????C?._raM ??????DATA0M ?>ףp?@?u=?BRM LW D BRInflate/Deflate001?U ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>@?@?@?>>>CCCCCCCCDATAPU ????C?._raW ??????DATA0W ?>ףp?@?u=?BRLW ` M BRLayer001?_ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>?>>CCCCCCCCDATAP_ ????C?._rat` ??????DATA0t` ?>ףp?@?u=?BR`  j LW BRLighten5?|h ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP|h ????C?~6=~.=i ??????DATA0i ?>k?@? ף=?BR j ls ` BRMixh?q ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???333???>!!!>L>???CCCCCCCCDATAPq ????C?~6=~.=4s ??????DATA04s ?>k?@? ף=?BRls | j BRMultiply?<{ ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP<{ ????C?~6=~.=| ??????DATA0| ?>k?@? ף=?BR| , ls BRNudge001? ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???? ??>!!!>L>>?>CCCCCCCCDATAP ????C?._ra ??????DATA0 ?>ףp?@?u=?BR,  | BRPinch/Magnify001? ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!>L>@?@?@?>>>CCCCCCCCDATAP ????C?._raT ??????DATA0T ?>ףp?@?u=?BR  , BRPolish001?\ ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???????>!!!>L>??>>??CCCCCCCCDATAP\ ????C?._ra ??????DATA0 ?>ףp?@?u=?BR L BRScrape/Peaks001? ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=???? ??>!!!>L>??>>??CCCCCCCCDATAP ????C?._ra ??????DATA0 ?>ףp?@?u=?BRL  BRSculptDraw? ??????????L>????????????????????????????????E???????L>?????????????????????????????????# Kfff?=??????>!!!wN?L>?>>>>?CCCCCCCCDATAP ????C?._rat ??????DATA0t ?>ףp?@?u=?BR  L BRSmear001?| ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP| ????C?~6=~.=Դ ??????DATA0Դ ?>k?@? ף=?BR l BRSmooth001?ܼ ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=??????>!!!>L>@?@?@?CCCCCCCCDATAPܼ ????C?._ra4 ??????DATA04 ?>ףp?@?u=?BRl  BRSnake Hook001?< ??????????L>????????????????????????????????E???????L>?????????????????????????????????K Kfff?=???? ??>!!!>L>>?>CCCCCCCCDATAP< ????C?._ra ??????DATA0 ?>ףp?@?u=?BR , l BRSoften01? ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP ????C?~6=~.= ??????DATA0 ?>k?@? ף=?BR,  BRSubtract? ??????????L>????????????????????????????????E???????L>???????????????????????????????? ?# Kfff?=???L>??>!!!>L>???CCCCCCCCDATAP ????C?~6=~.=T ??????DATA0T ?>k?@? ף=?BR  , BRTexDraw?\ ??????????L>????????????????????????????????E???????L>?????????????????????????????????#Kfff?=???333???>!!!>L>???>>?CCCCCCCCDATAP\ ????C?._ra ??????DATA0 ?>ףp?@?u=?BR L BRThumb001? ??????????L>????????????????????????????????E???????L>?????????????????????????????????K Kfff?=???? ??>!!!>L>>?>CCCCCCCCDATAP ????C?._ra ??????DATA0 ?>ףp?@?u=?BRL  BRTwist001? ??????????L>????????????????????????????????E???????L>?????????????????????????????????K Kfff?=??????>!!!>L>>?>CCCCCCCCDATAP ????C?._rat ??????DATA0t ?>ףp?@?u=?DNA1d>$r'SDNANAME\*next*prev*data*first*lastxyzxminxmaxyminymax*pointergroupvalval2typesubtypeflagname[64]saveddatalentotallen*newid*libname[66]usicon_idpad2*propertiesid*idblock*filedataname[1024]filepath[1024]*parent*packedfilew[2]h[2]changed[2]changed_timestamp[2]*rect[2]*gputexture[2]*obblocktypeadrcodename[128]*bp*beztmaxrcttotrctvartypetotvertipoextraprtbitmaskslide_minslide_maxcurval*drivercurvecurshowkeymuteipopadpospad1relativetotelemuidvgroup[64]sliderminslidermax*adt*refkeyelemstr[32]elemsizeblock*ipo*fromtotkeyslurphctimeuidgen*line*formatblen*nameflagsnlineslines*curl*sellcurcselc*undo_bufundo_posundo_len*compiledmtimesizeseekdtxpassepartalphaclipstaclipendlensortho_scaledrawsizesensor_xsensor_yshiftxshiftyYF_dofdist*dof_obsensor_fitpad[7]*sceneframenrframesoffsetsfrafie_imacyclokmulti_indexlayerpass*cache*gputexture*anim*rr*renders[8]render_slotlast_render_slotsourcelastframetpageflagtotbindxrepyreptwstatwendbindcode*repbind*previewlastupdatelastusedanimspeedgen_xgen_ygen_typegen_flaggen_depthaspxaspycolorspace_settingsalpha_modetexcomaptomaptonegblendtype*object*texuvname[64]projxprojyprojzmappingofs[3]size[3]rottexflagcolormodelpmaptopmaptonegnormapspacewhich_outputbrush_map_modergbkdef_varcolfacvarfacnorfacdispfacwarpfaccolspecfacmirrfacalphafacdifffacspecfacemitfachardfacraymirrfactranslfacambfaccolemitfaccolreflfaccoltransfacdensfacscatterfacreflfactimefaclengthfacclumpfacdampfackinkfacroughfacpadensfacgravityfaclifefacsizefacivelfacfieldfacshadowfaczenupfaczendownfacblendfacatotipotypeipotype_huecolor_modepad[1]data[32]*ima*cube[6]imat[4][4]obimat[3][3]stypeviewscalenotlaycuberesdepthrecalclastsizefalloff_typefalloff_softnessradiuscolor_sourcetotpointspdpadpsyspsys_cache_spaceob_cache_space*point_tree*point_datanoise_sizenoise_depthnoise_influencenoise_basispdpad3[3]noise_facspeed_scalefalloff_speed_scalepdpad2*coba*falloff_curveresol[3]interp_typefile_formatextendsmoked_typedata_type_padint_multiplierstill_framesource_path[1024]*datasetcachedframeoceanmod[64]outputnoisesizeturbulbrightcontrastsaturationrfacgfacbfacfiltersizemg_Hmg_lacunaritymg_octavesmg_offsetmg_gaindist_amountns_outscalevn_w1vn_w2vn_w3vn_w4vn_mexpvn_distmvn_coltypenoisedepthnoisetypenoisebasisnoisebasis2imaflagcropxmincropymincropxmaxcropymaxtexfilterafmaxxrepeatyrepeatcheckerdistnablaiuser*nodetree*env*pd*vd*otuse_nodesloc[3]rot[3]mat[4][4]min[3]max[3]cobablend_color[3]blend_factorblend_typepad[3]modetotexshdwrshdwgshdwbshdwpadenergydistspotsizespotblendhaintatt1att2*curfalloffbiassoftcompressthreshbleedbiaspad5bufsizesampbuffersfiltertypebufflagbuftyperay_sampray_sampyray_sampzray_samp_typearea_shapearea_sizearea_sizeyarea_sizezadapt_threshray_samp_methodshadowmap_typetexactshadhalostepsun_effect_typeskyblendtypehorizon_brightnessspreadsun_brightnesssun_sizebackscattered_lightsun_intensityatm_turbidityatm_inscattering_factoratm_extinction_factoratm_distance_factorskyblendfacsky_exposureshadow_frustum_sizesky_colorspacepad4[2]*mtex[18]pr_texturepad6[4]densityemissionscatteringreflectionemission_col[3]transmission_col[3]reflection_col[3]density_scaledepth_cutoffasymmetrystepsize_typeshadeflagshade_typeprecache_resolutionstepsizems_diffms_intensityms_spreadalpha_blendface_orientation*uvnameindexmaterial_typespecrspecgspecbmirrmirgmirbambrambbambgambemitangspectraray_mirroralpharefspeczoffsaddtranslucencyvolgamefresnel_mirfresnel_mir_ifresnel_trafresnel_tra_ifiltertx_limittx_falloffray_depthray_depth_traharseed1seed2gloss_mirgloss_trasamp_gloss_mirsamp_gloss_traadapt_thresh_miradapt_thresh_traaniso_gloss_mirdist_mirfadeto_mirshade_flagmode_lmode2mode2_lflarecstarclinecringchasizeflaresizesubsizeflarebooststrand_stastrand_endstrand_easestrand_surfnorstrand_minstrand_widthfadestrand_uvname[64]sbiaslbiasshad_alphaseptexrgbselpr_typepr_lampml_flagmapflagdiff_shaderspec_shaderroughnessrefracparam[4]rmsdarkness*ramp_col*ramp_specrampin_colrampin_specrampblend_colrampblend_specramp_showpad3rampfac_colrampfac_spec*groupfrictionfhreflectfhdistxyfrictdynamodesss_radius[3]sss_col[3]sss_errorsss_scalesss_iorsss_colfacsss_texfacsss_frontsss_backsss_flagsss_presetmapto_texturedshadowonly_flagline_col[4]line_priorityvcol_alphapaint_active_slotpaint_clone_slottot_slotspad4[3]*texpaintslotgpumaterial*temp_pf*bbselcol1selcol2quat[4]expxexpyexpzradrad2s*mat*imatelemsdisp*editelems**matflag2totcolwiresizerendersizethresh*lastelemvec[3][3]alfaweighth1h2f1f2f3hideeasingbackamplitudeperiodpad[4]vec[4]mat_nrpntsupntsvpad[2]resoluresolvorderuordervflaguflagv*knotsu*knotsvtilt_interpradius_interpcharidxkernwhnurbs*keyindexshapenrnurb*editnurb*bevobj*taperobj*textoncurve*keydrawflagtwist_modetwist_smoothsmallcaps_scalepathlenbevresolwidthext1ext2resolu_renresolv_renactnuactvertspacemodespacinglinedistshearfsizewordspaceulposulheightxofyoflinewidthselstartselendlen_wchar*str*editfontfamily[64]*vfont*vfontb*vfonti*vfontbi*tbtotboxactbox*strinfocurinfobevfac1bevfac2bevfac1_mappingbevfac2_mappingpad2[2]*mselect*mpoly*mtpoly*mloop*mloopuv*mloopcol*mface*mtface*tface*mvert*medge*dvert*mcol*texcomesh*edit_btmeshvdataedatafdatapdataldatatotedgetotfacetotselecttotpolytotloopact_facesmoothreshcd_flagsubdivsubdivrsubsurftypeeditflag*mr*tpageuv[4][2]col[4]transptileunwrapv1v2v3v4edcodecreasebweightdef_nr*dwtotweightco[3]no[3]loopstartveuv[2]fis[255]s_lentotdisplevel(*disps)()*hiddenv[4]midv[2]*faces*colfaces*edges*vertslevelslevel_countcurrentnewlvledgelvlpinlvlrenderlvluse_col*edge_flags*edge_creasesradius[3]stackindex*errormodifier*texture*map_objectuvlayer_name[64]uvlayer_tmptexmappingsubdivTyperenderLevels*emCache*mCachestrengthdefaxispad[6]startlengthrandomizeseed*ob_arm*start_cap*end_cap*curve_ob*offset_oboffset[3]scale[3]merge_distfit_typeoffset_typecountaxistolerance*mirror_obsplit_anglevalueresval_flagslim_flagse_flagsmatprofilebevel_angledefgrp_name[64]*domain*flow*colltimedirectionmidlevel*projectors[10]*imagenum_projectorsaspectxaspectyscalexscaleypercentiterdelimitangleface_countfacrepeat*objectcenterstartxstartyheightnarrowspeeddampfallofftimeoffslifetimedeformflagmulti*prevCossubtarget[64]parentinv[4][4]cent[3]*indexartotindexforce*clothObject*sim_parms*coll_parms*point_cacheptcaches*x*xnew*xold*current_xnew*current_x*current_v*mfacesnumvertsnumfacestime_xtime_xnew*bvhtree*v*dmcfraoperationvertextotinfluencegridsize*bindinfluences*bindoffsets*bindcagecostotcagevert*dyngrid*dyninfluences*dynvertsdyngridsizedyncellmin[3]dyncellwidthbindmat[4][4]*bindweights*bindcos(*bindfunc)()*psystotdmverttotdmedgetotdmfacepositionrandom_position*facepavgroupprotectlvlsculptlvltotlvlsimple*fss*target*auxTargetvgroup_name[64]keepDistshrinkTypeshrinkOptsprojLimitprojAxissubsurfLevels*originfactorlimit[2]offset_facoffset_fac_vgoffset_clampcrease_innercrease_outercrease_rimmat_ofsmat_ofs_rim*ob_axisstepsrender_stepsscrew_ofs*ocean*oceancacheresolutionspatial_sizewind_velocitysmallest_wavewave_alignmentwave_directionwave_scalechop_amountfoam_coveragebakestartbakeendcachepath[1024]foamlayername[64]cachedgeometry_moderefreshrepeat_xrepeat_yfoam_fade*object_from*object_tofalloff_radiusedit_flagsdefault_weight*cmap_curveadd_thresholdrem_thresholdmask_constantmask_defgrp_name[64]mask_tex_use_channel*mask_texture*mask_tex_map_objmask_tex_mappingmask_tex_uvlayer_name[64]pad_i1defgrp_name_a[64]defgrp_name_b[64]default_weight_adefault_weight_bmix_modemix_setpad_c1[6]proximity_modeproximity_flags*proximity_ob_targetmin_distmax_distpad_s1*canvas*brushthresholdscalehermite_numbranch_smoothingsymmetry_axesquad_methodngon_methodlambdalambda_borderaxis_uaxis_vcenter[2]*object_srcbone_src[64]*object_dstbone_dst[64]time_modeplay_modeforward_axisup_axisflip_axisinterpdeform_modeframe_startframe_scaleeval_frameeval_timeeval_factoranchor_grp_name[64]total_verts*vertexco*cache_systemcrease_weight*lattpntswopntsuopntsvopntswtypeutypevtypewactbpfufvfwdudvdw*def*editlattvec[8][3]*sourcedistance*sculptpartypepar1par2par3parsubstr[64]*track*proxy*proxy_group*proxy_from*action*poselib*pose*gpdavs*mpathconstraintChannelseffectdefbasemodifiersrestore_mode*matbitsactcoldloc[3]orig[3]dsize[3]dscale[3]drot[3]dquat[4]rotAxis[3]drotAxis[3]rotAngledrotAngleobmat[4][4]constinv[4][4]imat_ren[4][4]laycolbitstransflagprotectflagtrackflagupflagnlaflagipoflagscaflagscavisflagdepsflagdupondupoffdupstadupendmassdampinginertiaformfactorrdampingmarginmax_velmin_velobstacleRadstep_heightjump_speedfall_speedcol_groupcol_maskrotmodeboundtypecollision_boundtypedtempty_drawtypeempty_drawsizedupfacescapropsensorscontrollersactuatorssfactdefgameflaggameflag2*bsoftrestrictflagsoftflaganisotropicFriction[3]constraintsnlastripshooksparticlesystem*soft*dup_groupbody_typeshapeflag*fluidsimSettings*curve_cache*derivedDeform*derivedFinallastDataMaskcustomdata_maskstateinit_stategpulamppc_ids*duplilist*rigidbody_object*rigidbody_constraintima_ofs[2]*iuserlodlevels*currentlodcurindexactiveorco[3]no_drawanimatedpersistent_id[8]*particle_systemdeflectforcefieldshapetex_modekinkkink_axiszdirf_strengthf_dampf_flowf_sizef_powermaxdistmindistf_power_rmaxradminradpdef_damppdef_rdamppdef_permpdef_frictpdef_rfrictpdef_sticknessabsorptionpdef_sbdamppdef_sbiftpdef_sboftclump_facclump_powkink_freqkink_shapekink_ampfree_endtex_nabla*rngf_noise*f_sourceweight[14]global_gravityrt[3]totdataframetotpointdata_types*data[8]*cur[8]extradatastepsimframestartframeendframeeditframelast_exactlast_validcompressionprev_name[64]info[64]path[1024]*cached_framesmem_cache*edit(*free_edit)()linStiffangStiffvolumeviterationspiterationsditerationsciterationskSRHR_CLkSKHR_CLkSSHR_CLkSR_SPLT_CLkSK_SPLT_CLkSS_SPLT_CLkVCFkDPkDGkLFkPRkVCkDFkMTkCHRkKHRkSHRkAHRcollisionflagsnumclusteriterationsweldingtotspring*bpoint*bspringmsg_lockmsg_valuenodemassnamedVG_Mass[64]gravmediafrictrklimitphysics_speedgoalspringgoalfrictmingoalmaxgoaldefgoalvertgroupnamedVG_Softgoal[64]fuzzynessinspringinfrictnamedVG_Spring_K[64]efraintervallocalsolverflags**keystotpointkeysecondspringcolballballdampballstiffsbc_modeaeroedgeminloopsmaxloopschokesolver_IDplasticspringpreload*scratchshearstiffinpush*pointcache*effector_weightslcom[3]lrot[3][3]lscale[3][3]last_framevel[3]*fmdthreadsshow_advancedoptionsresolutionxyzpreviewresxyzrealsizeguiDisplayModerenderDisplayModeviscosityValueviscosityModeviscosityExponentgrav[3]animStartanimEndbakeStartbakeEndframeOffsetgstarmaxRefineiniVelxiniVelyiniVelz*orgMesh*meshBBsurfdataPath[1024]bbStart[3]bbSize[3]typeFlagsdomainNovecgenvolumeInitTypepartSlipValuegenerateTracersgenerateParticlessurfaceSmoothingsurfaceSubdivsparticleInfSizeparticleInfAlphafarFieldSize*meshVelocitiescpsTimeStartcpsTimeEndcpsQualityattractforceStrengthattractforceRadiusvelocityforceStrengthvelocityforceRadiuslastgoodframeanimRatemistypehorrhorghorbzenrzengzenbexposureexprangelinfaclogfacgravityactivityBoxRadiusskytypeocclusionResphysicsEngineticratemaxlogicstepphysubstepmaxphystepmisimiststamistdistmisthistarrstargstarbstarkstarsizestarmindiststardiststarcolnoisedofstadofenddofmindofmaxaodistaodistfacaoenergyaobiasaomodeaosampaomixaocolorao_adapt_threshao_adapt_speed_facao_approx_errorao_approx_correctionao_indirect_energyao_env_energyao_pad2ao_indirect_bouncesao_padao_samp_methodao_gather_methodao_approx_passes*aosphere*aotablesselcolsxsy*lpFormat*lpParmscbFormatcbParmsfccTypefccHandlerdwKeyFrameEverydwQualitydwBytesPerSeconddwFlagsdwInterleaveEveryavicodecname[128]*cdParms*padcdSizeqtcodecname[128]codecTypecodecSpatialQualitycodeccodecFlagscolorDepthcodecTemporalQualityminSpatialQualityminTemporalQualitykeyFrameRatebitRateaudiocodecTypeaudioSampleRateaudioBitDepthaudioChannelsaudioCodecFlagsaudioBitRateaudio_codecvideo_bitrateaudio_bitrateaudio_mixrateaudio_channelsaudio_padaudio_volumegop_sizerc_min_raterc_max_raterc_buffer_sizemux_packet_sizemux_ratemixratemainspeed_of_sounddoppler_factordistance_model*mat_override*light_overridelay_zmasklay_excludelayflagpassflagpass_xorsamplespass_alpha_thresholdfreestyleConfigimtypeplanesqualitycompressexr_codeccineon_flagcineon_whitecineon_blackcineon_gammajp2_flagjp2_codecview_settingsdisplay_settingsim_formatcage_extrusionnormal_swizzle[3]normal_spacesave_modecage[64]*avicodecdata*qtcodecdataqtcodecsettingsffcodecdatasubframepsfrapefraimagesframaptoframelenblurfacedgeRedgeGedgeBfullscreenxplayyplayfreqplayattribframe_stepstereomodedimensionspresetmaximsizepad6xschyschxpartsypartstilextileysubimtypedisplaymodeuse_lock_interfacepad7scemoderaytrace_optionsraytrace_structureocrespad4alphamodeosafrs_secedgeintsafetyborderdisprectlayersactlaymblur_samplesxaspyaspfrs_sec_basegausscolor_mgt_flagpostgammaposthuepostsatdither_intensitybake_osabake_filterbake_modebake_flagbake_normal_spacebake_quad_splitbake_maxdistbake_biasdistbake_samplesbake_padbake_user_scalebake_pad1pic[1024]stampstamp_font_idstamp_udata[768]fg_stamp[4]bg_stamp[4]seq_prev_typeseq_rend_typeseq_flagpad5[5]simplify_flagsimplify_subsurfsimplify_shadowsamplessimplify_particlessimplify_aossscineonwhitecineonblackcineongammajp2_presetjp2_depthrpad3domeresdomemodedomeangledometiltdomeresbuf*dometextline_thickness_modeunit_line_thicknessengine[32]bakepreview_start_resolutionname[32]particle_percsubsurf_maxshadbufsample_maxao_errortiltresbuf*warptextcol[3]cellsizecellheightagentmaxslopeagentmaxclimbagentheightagentradiusedgemaxlenedgemaxerrorregionminsizeregionmergesizevertsperpolydetailsampledistdetailsamplemaxerrorframingplayerflagrt1rt2aasamplesdomestereoflageyeseparationrecastDatamatmodeexitkeyvsyncobstacleSimulationraster_storagelevelHeightdeactivationtimelineardeactthresholdangulardeactthreshold*camera*palette*paint_cursorpaint_cursor_col[4]num_input_samplessymmetry_flagspaintmissing_dataseam_bleednormal_anglescreen_grab_size[2]*paintcursor*stencil*clonestencil_col[3]inverttotrekeytotaddkeybrushtypebrush[7]emitterdistselectmodeedittypedraw_stepfade_framesradial_symm[3]detail_sizesymmetrize_directiongravity_factorconstant_detail*gravity_object*pad2*vpaint_prev*wpaint_prevmat[3][3]unprojected_radiusrgb[3]secondary_rgb[3]last_rake[2]brush_rotationdraw_anchoredanchored_sizedraw_invertedpad3[7]overlap_factoranchored_initial_mouse[2]stroke_activesize_pressure_valuetex_mouse[2]mask_tex_mouse[2]do_linear_conversion*colorspacepixel_radius_pad1[2]overhang_axisoverhang_minoverhang_maxthickness_minthickness_maxthickness_samples_pad2[3]distort_mindistort_maxsharp_minsharp_max*vpaint*wpaint*uvsculptvgroup_weightdoublimitnormalsizeautomergeunwrapperuvcalc_flaguv_flaguv_selectmodeuvcalc_marginautoik_chainlengpencil_flagspad[5]imapaintparticleproportional_sizeselect_threshautokey_modeautokey_flagmultires_subdiv_typepad3[1]skgen_resolutionskgen_threshold_internalskgen_threshold_externalskgen_length_ratioskgen_length_limitskgen_angle_limitskgen_correlation_limitskgen_symmetry_limitskgen_retarget_angle_weightskgen_retarget_length_weightskgen_retarget_distance_weightskgen_optionsskgen_postproskgen_postpro_passesskgen_subdivisions[3]skgen_multi_level*skgen_templatebone_sketchingbone_sketching_convertskgen_subdivision_numberskgen_retarget_optionsskgen_retarget_rollskgen_side_string[8]skgen_num_string[8]edge_modeedge_mode_live_unwrapsnap_modesnap_node_modesnap_uv_modesnap_flagsnap_targetproportionalprop_modeproportional_objectsproportional_maskauto_normalizemultipaintweightuservgroupsubsetuse_uv_sculptuv_sculpt_settingsuv_sculpt_tooluv_relax_methodsculpt_paint_settingssculpt_paint_unified_sizesculpt_paint_unified_unprojected_radiussculpt_paint_unified_alphaunified_paint_settingsstatvistotobjtotlamptotobjseltotcurvetotmeshtotarmaturescale_lengthsystemsystem_rotationgravity[3]quick_cache_step*world*setbase*basact*obeditcursor[3]twcent[3]twmin[3]twmax[3]layactlay_updated*ed*toolsettings*statsaudiomarkerstransform_spaces*sound_scene*sound_scene_handle*sound_scrub_handle*speaker_handles*fps_info*theDagdagflagsactive_keyingsetkeyingsetsgmunitphysics_settings*clipcustomdata_mask_modalsequencer_colorspace_settings*rigidbody_worldcuserblendviewwinmat[4][4]viewmat[4][4]viewinv[4][4]persmat[4][4]persinv[4][4]viewmatob[4][4]persmatob[4][4]clip[6][4]clip_local[6][4]*clipbb*localvd*ri*render_engine*depths*gpuoffscreen*sms*smooth_timertwmat[4][4]viewquat[4]camdxcamdypixsizecamzoomis_perspperspviewlockviewlock_quadofs_lock[2]twdrawflagrflaglviewquat[4]lpersplviewgridviewtw_idot[3]rot_anglerot_axis[3]regionbasespacetypeblockscaleblockhandler[8]bundle_sizebundle_drawtypelay_prevlay_used*ob_centrerender_borderbgpicbase*bgpicob_centre_bone[64]drawtypeob_centre_cursorscenelockaroundgridnearfarmatcap_icongridlinesgridsubdivgridflagtwtypetwmodetwflagafterdraw_transpafterdraw_xrayafterdraw_xraytranspzbufxraypad3[5]*properties_storage*defmaterialverthormaskmin[2]max[2]minzoommaxzoomscrollscroll_uikeeptotkeepzoomkeepofsalignwinxwinyoldwinxoldwiny*tab_offsettab_numtab_currpt_maskv2dmainbmainbomainbuserre_alignpreviewtexture_contexttexture_context_prev*pathpathflagdataicon*pinid*texusertree*treestoresearch_string[32]search_tseoutlinevisstoreflagsearch_flags*treehash*adsghostCurvesautosnapcursorVal*arraycachescache_displayrender_sizechanshownzebrazoomoverlay_typescopes*maskdraw_flagdraw_typeoverlay_modetitle[96]dir[1056]file[256]renamefile[256]renameedit[256]filter_glob[64]active_filesel_firstsel_lastsortdisplayf_fpfp_str[8]scroll_offset*params*files*folders_prev*folders_next*op*smoothscroll_timer*layoutrecentnrbookmarknrsystemnr*cumapsample_line_histcursor[2]centxcentypincurtilelockdt_uvstickydt_uvstretchmask_info*texttopviewlinesmenunrlheightcwidthlinenrs_totleftshowlinenrstabnumbershowsyntaxline_hlightoverwritelive_editpix_per_linetxtscrolltxtbarwordwrapdopluginsfindstr[256]replacestr[256]margin_columnlheight_dpi*drawcachescroll_accum[2]*py_draw*py_event*py_button*py_browsercallback*py_globaldictlastspacescriptname[1024]scriptarg[256]*script*but_refsparent_keyview_center[2]node_name[64]*idaspecttreepath*edittreetree_idname[64]treetypetexfromshaderfromlinkdraglen_alloccursorscrollbackhistoryprompt[256]language[32]sel_startsel_endfilter_typefilter[64]xlockofylockofuserpath_lengthloc[2]stabmat[4][4]unistabmat[4][4]postproc_flaggpencil_srcfilename[1024]blf_iduifont_idr_to_lhintingpointskerningitalicboldshadowshadxshadyshadowalphashadowcolorpaneltitlegrouplabelwidgetlabelwidgetpanelzoomminlabelcharsminwidgetcharscolumnspacetemplatespaceboxspacebuttonspacexbuttonspaceypanelspacepanelouteroutline[4]inner[4]inner_sel[4]item[4]text[4]text_sel[4]shadedshadetopshadedownalpha_checkinner_anim[4]inner_anim_sel[4]inner_key[4]inner_key_sel[4]inner_driven[4]inner_driven_sel[4]header[4]back[4]show_headershow_backgradient[4]high_gradient[4]show_gradwcol_regularwcol_toolwcol_textwcol_radiowcol_optionwcol_togglewcol_numwcol_numsliderwcol_menuwcol_pulldownwcol_menu_backwcol_menu_itemwcol_tooltipwcol_boxwcol_scrollwcol_progresswcol_list_itemwcol_pie_menuwcol_statepanelmenu_shadow_facmenu_shadow_widthiconfile[256]icon_alphaxaxis[4]yaxis[4]zaxis[4]title[4]text_hi[4]header_title[4]header_text[4]header_text_hi[4]tab_active[4]tab_inactive[4]tab_back[4]tab_outline[4]button[4]button_title[4]button_text[4]button_text_hi[4]list[4]list_title[4]list_text[4]list_text_hi[4]panelcolorsgradientsshade1[4]shade2[4]hilite[4]grid[4]view_overlay[4]wire[4]wire_edit[4]select[4]lamp[4]speaker[4]empty[4]camera[4]active[4]group[4]group_active[4]transform[4]vertex[4]vertex_select[4]vertex_unreferenced[4]edge[4]edge_select[4]edge_seam[4]edge_sharp[4]edge_facesel[4]edge_crease[4]face[4]face_select[4]face_dot[4]extra_edge_len[4]extra_edge_angle[4]extra_face_angle[4]extra_face_area[4]normal[4]vertex_normal[4]loop_normal[4]bone_solid[4]bone_pose[4]bone_pose_active[4]strip[4]strip_select[4]cframe[4]freestyle_edge_mark[4]freestyle_face_mark[4]nurb_uline[4]nurb_vline[4]act_spline[4]nurb_sel_uline[4]nurb_sel_vline[4]lastsel_point[4]handle_free[4]handle_auto[4]handle_vect[4]handle_align[4]handle_auto_clamped[4]handle_sel_free[4]handle_sel_auto[4]handle_sel_vect[4]handle_sel_align[4]handle_sel_auto_clamped[4]ds_channel[4]ds_subchannel[4]keytype_keyframe[4]keytype_extreme[4]keytype_breakdown[4]keytype_jitter[4]keytype_keyframe_select[4]keytype_extreme_select[4]keytype_breakdown_select[4]keytype_jitter_select[4]keyborder[4]keyborder_select[4]console_output[4]console_input[4]console_info[4]console_error[4]console_cursor[4]console_select[4]vertex_sizeoutline_widthfacedot_sizenoodle_curvingsyntaxl[4]syntaxs[4]syntaxb[4]syntaxn[4]syntaxv[4]syntaxc[4]syntaxd[4]syntaxr[4]nodeclass_output[4]nodeclass_filter[4]nodeclass_vector[4]nodeclass_texture[4]nodeclass_shader[4]nodeclass_script[4]nodeclass_pattern[4]nodeclass_layout[4]movie[4]movieclip[4]mask[4]image[4]scene[4]audio[4]effect[4]transition[4]meta[4]editmesh_active[4]handle_vertex[4]handle_vertex_select[4]pad2[4]handle_vertex_sizemarker_outline[4]marker[4]act_marker[4]sel_marker[4]dis_marker[4]lock_marker[4]bundle_solid[4]path_before[4]path_after[4]camera_path[4]hpad[3]preview_back[4]preview_stitch_face[4]preview_stitch_edge[4]preview_stitch_vert[4]preview_stitch_stitchable[4]preview_stitch_unstitchable[4]preview_stitch_active[4]uv_shadow[4]uv_others[4]match[4]selected_highlight[4]skin_root[4]anim_active[4]anim_non_active[4]nla_tweaking[4]nla_tweakdupli[4]nla_transition[4]nla_transition_sel[4]nla_meta[4]nla_meta_sel[4]nla_sound[4]nla_sound_sel[4]info_selected[4]info_selected_text[4]info_error[4]info_error_text[4]info_warning[4]info_warning_text[4]info_info[4]info_info_text[4]info_debug[4]info_debug_text[4]paint_curve_pivot[4]paint_curve_handle[4]solid[4]tuitbutstv3dtfiletipotinfotacttnlatseqtimatexttoopsttimetnodetlogictuserpreftconsoletcliptarm[20]active_theme_areamodule[64]*proppath[768]spec[4]mouse_speedwalk_speedwalk_speed_factorview_heightjump_heightteleport_timeversionfilesubversionfiledupflagsavetimetempdir[768]fontdir[768]renderdir[1024]render_cachedir[768]textudir[768]pythondir[768]sounddir[768]i18ndir[768]image_editor[1024]anim_player[1024]anim_player_presetv2d_min_gridsizetimecode_styleversionsdbl_click_timegameflagswheellinescrolluiflaguiflag2languageuserprefviewzoommixbufsizeaudiodeviceaudiorateaudioformataudiochannelsdpiencodingtransoptsmenuthreshold1menuthreshold2themesuifontsuistyleskeymapsuser_keymapsaddonsautoexec_pathskeyconfigstr[64]undostepsundomemorygp_manhattendistgp_euclideandistgp_erasergp_settingstb_leftmousetb_rightmouselight[3]tw_hotspottw_flagtw_handlesizetw_sizetextimeouttexcollectratewmdrawmethoddragthresholdmemcachelimitprefetchframesframeserverportpad_rot_angleobcenter_diarvisizervibrightrecent_filessmooth_viewtxglreslimitcurssizecolor_picker_typeipo_newkeyhandles_newgpu_select_methodscrcastfpsscrcastwaitwidget_unitanisotropic_filteruse_16bit_texturesuse_gpu_mipmapndof_sensitivityndof_orbit_sensitivityndof_flagogl_multisamplesimage_draw_methodglalphacliptext_renderpad9coba_weightsculpt_paint_overlay_col[3]gpencil_new_layer_col[4]tweak_thresholdnavigation_modeauthor[80]font_path_ui[1024]compute_device_typecompute_device_idfcu_inactive_alphapixelsizepie_interaction_typepie_initial_timeoutpie_animation_timeoutpie_menu_radiuspie_menu_thresholdwalk_navigationvertbaseedgebaseareabase*newsceneredraws_flagfulltempwiniddo_drawdo_refreshdo_draw_gesturedo_draw_paintcursordo_draw_dragswapmainwinsubwinactive*animtimer*context*newvvec*v1*v2*typepanelname[64]tabname[64]drawname[64]ofsxofsysizexsizeylabelofsruntime_flagcontrolsnapsortorder*paneltab*activedataidname[64]list_id[64]layout_typelist_scrolllist_griplist_last_lenlist_last_activeifilter_byname[64]filter_flagfilter_sort_flag*dyn_datapreview_id[64]pad1[3]*v3*v4*fullbutspacetypeheadertyperegion_active_winspacedatahandlersactionzoneswinrctdrawrctswinidregiontypealignmentdo_draw_overlayoverlapuiblockspanelspanels_category_activeui_listsui_previewspanels_category*regiontimer*headerstr*regiondatasubvstr[4]subversionpadsminversionminsubversionwinpos*curscreen*curscenefileflagsglobalfbuild_commit_timestampbuild_hash[16]name[256]orig_widthorig_heightbottomrightxofsyofslift[3]gamma[3]gain[3]dir[768]tcbuild_size_flagsbuild_tc_flagsdonestartstillendstill*stripdata*crop*transform*color_balance*tmpstartofsendofsmachinestartdispenddispsatmulhandsizeanim_preseekstreamindexmulticam_sourceclip_flag*strip*scene_cameraeffect_faderspeed_fader*seq1*seq2*seq3seqbase*sound*scene_soundpitchpanstrobe*effectdataanim_startofsanim_endofsblend_modeblend_opacity*oldbasep*parseq*seqbasepmetastack*act_seqact_imagedir[1024]act_sounddir[1024]over_ofsover_cfraover_flagover_borderedgeWidthforwardwipetypefMinifClampfBoostdDistdQualitybNoCompScalexIniScaleyInixIniyInirotIniinterpolationuniform_scale*frameMapglobalSpeedlastValidFramesize_xsize_ymask_input_type*mask_sequence*mask_idcolor_balancecolor_multiplycurve_mapping*reference_ibuf*zebra_ibuf*waveform_ibuf*sep_waveform_ibuf*vector_ibuf*histogram_ibufbuttypeuserjitstaendtotpartnormfacobfacrandfactexfacrandlifeforce[3]vectsizemaxlendefvec[3]mult[4]life[4]child[4]mat[4]texmapcurmultstaticstepomattimetexspeedtexflag2negvertgroup_vvgroupname[64]vgroupname_v[64]*keysminfacnrusedusedelem*poinresetdistlastvalpropname[64]matname[64]*makeyqualqual2targetName[64]toggleName[64]value[64]maxvalue[64]delaydurationmaterialName[64]damptimeraxisflagposechannel[64]constraint[64]*fromObjectsubject[64]body[64]otypepulsefreqtotlinks**linkstapjoyindexaxis_singleaxisfbuttonhathatfprecisionstr[128]*mynewinputstotslinks**slinksvalostate_mask*actframeProp[64]blendinpriorityend_resetstrideaxisstridelengthlayer_weightmin_gainmax_gainreference_distancemax_distancerolloff_factorcone_inner_anglecone_outer_anglecone_outer_gainsndnrpad3[2]sound3Dpad6[1]*melinVelocity[3]angVelocity[3]localflagdyn_operationforceloc[3]forcerot[3]linearvelocity[3]angularvelocity[3]*referenceminmaxrotdampminloc[3]maxloc[3]minrot[3]maxrot[3]matprop[64]butstabutenddistributionint_arg_1int_arg_2float_arg_1float_arg_2toPropName[64]*toObjectbodyTypefilename[64]loadaniname[64]int_argfloat_arginfluence*subtargetfacingaxisvelocityaccelerationturnspeedupdateTime*navmeshobject_axis[2]threshold[2]sensitivity[2]limit_x[2]limit_y[2]go*handle*newpackedfileattenuation*waveform*playback_handle*lamprengobjectdupli_ofs[3]childbaserollhead[3]tail[3]bone_mat[3][3]arm_head[3]arm_tail[3]arm_mat[4][4]arm_rollxwidthzwidthease1ease2rad_headrad_tailsegmentsbonebasechainbase*edbo*act_bone*act_edbone*sketchgevertdeformerlayer_usedlayer_protectedghostepghostsizeghosttypepathsizeghostsfghostefpathsfpathefpathbcpathac*pointsstart_frameend_frameghost_sfghost_efghost_bcghost_acghost_typeghost_stepghost_flagpath_typepath_steppath_viewflagpath_bakeflagpath_sfpath_efpath_bcpath_acikflagagrp_indexconstflagselectflagpad0[6]*bone*childiktreesiktree*custom*custom_txeul[3]chan_mat[4][4]pose_mat[4][4]pose_head[3]pose_tail[3]limitmin[3]limitmax[3]stiffness[3]ikstretchikrotweightiklinweight*tempchanbase*chanhashproxy_layerstride_offset[3]cyclic_offset[3]agroupsactive_groupiksolver*ikdata*ikparamproxy_act_bone[64]numiternumstepminstepmaxstepsolverfeedbackmaxveldampmaxdampepschannelscustomColcscurvesgroupsactive_markeridroot*filter_grpsearchstr[64]filterflagrenameIndexadstimeslide*grpname[30]ownspacetarspaceenforceheadtaillin_errorrot_error*tarmatrix[4][4]spacerotOrdertarnumtargetsiterationsrootbonemax_rootbone*poletarpolesubtarget[64]poleangleorientweightgrabtarget[3]numpointschainlenxzScaleModereserved1reserved2minmaxflagstuckcache[3]lockflagfollowflagvolmodeplaneorglengthbulgepivXpivYpivZaxXaxYaxZminLimit[6]maxLimit[6]extraFzinvmat[4][4]fromtomap[3]expofrom_min[3]from_max[3]to_min[3]to_max[3]from_min_rot[3]from_max_rot[3]to_min_rot[3]to_max_rot[3]from_min_scale[3]from_max_scale[3]to_min_scale[3]to_max_scale[3]rotAxiszminzmaxprojAxisSpacetrack[64]frame_methodobject[64]*depth_obchannel[32]no_rot_axisstride_axiscurmodactstartactendactoffsstridelenblendoutstridechannel[32]offs_bone[32]hasinputhasoutputdatatypesockettypeis_copyexternal*new_sockidentifier[64]*storagelimitin_out*typeinfolocxlocy*default_valuestack_indexstack_typeown_indexto_index*groupsock*linkns*new_nodelastycolor[3]outputs*originalinternal_linksminiwidthoffsetxoffsetyupdatelabel[64]custom1custom2custom3custom4need_execexec*threaddatatotrbutrprvrpreview_xsizepreview_ysize*blocktaghash_entry*rectxsizeysize*fromnode*tonode*fromsock*tosock*interface_typenodeslinksinitcur_indexis_updatingnodetypeedit_qualityrender_qualitychunksizeviewer_border*previewsactive_viewer_key*execdata(*progress)()(*stats_draw)()(*test_break)()(*update_draw)()*tbh*prh*sdh*udhvalue[3]value[4]value[1024]label_sizecyclicmoviegammagainliftmastershadowsmidtoneshighlightsstartmidtonesendmidtonesflapsroundingcatadioptriclensshiftrotationpass_indexpass_flagmaxspeedminspeedcurvedpercentxpercentybokehimage_in_widthimage_in_heightcenter_xcenter_yspinwrapsigma_colorsigma_spacehuebase_path[1024]formatactive_inputuse_render_formatuse_node_formatlayer[30]t1t2t3fstrengthfalphakey[4]algorithmchannelx1x2y1y2fac_x1fac_x2fac_y1fac_y2colname[64]bktypepad_c1gamcono_zbuffstopmaxblurbthreshpad_f1*dict*nodecolmodmixfadeangle_ofsmcjitprojfitslope[3]power[3]limchanunspilllimscaleuspillruspillguspillbtex_mappingcolor_mappingsky_modelsun_direction[3]turbidityground_albedocolor_spaceprojectionprojection_blendoffset_freqsquash_freqsquashgradient_typecoloringmusgrave_typewave_typeconvert_fromconvert_totracking_object[64]screen_balancedespill_factordespill_balanceedge_kernel_radiusedge_kernel_toleranceclip_blackclip_whitedilate_distancefeather_distancefeather_falloffblur_preblur_posttrack_name[64]wrap_axisplane_track_name[64]bytecode_hash[64]*bytecodedirection_typeuv_map[64]source[2]ray_lengthshortymintablemaxtableext_in[2]ext_out[2]*curve*table*premultablepremul_ext_in[2]premul_ext_out[2]presetchanged_timestampcurrcliprcm[4]black[3]white[3]bwmul[3]sample[3]x_resolutiondata_luma[256]data_r[256]data_g[256]data_b[256]data_a[256]co[2][2]sample_fullsample_linesaccuracywavefrm_modewavefrm_alphawavefrm_yfacwavefrm_heightvecscope_alphavecscope_heightminmax[3][2]hist*waveform_1*waveform_2*waveform_3*vecscopewaveform_totlook[64]view_transform[64]*curve_mappingdisplay_device[64]offset[2]clonemtexmask_mtex*toggle_brush*icon_imbuf*gradient*paint_curveicon_filepath[1024]normal_weightob_modemask_pressurejitterjitter_absoluteoverlay_flagssmooth_stroke_radiussmooth_stroke_factorratesculpt_planeplane_offsetgradient_spacinggradient_stroke_modegradient_fill_modesculpt_toolvertexpaint_toolimagepaint_toolmask_toolautosmooth_factorcrease_pinch_factorplane_trimtexture_sample_biastexture_overlay_alphamask_overlay_alphacursor_overlay_alphasharp_thresholdblur_kernel_radiusblur_modefill_thresholdadd_col[3]sub_col[3]stencil_pos[2]stencil_dimension[2]mask_stencil_pos[2]mask_stencil_dimension[2]colorsdeletedactive_colorbezpressuretot_pointsadd_indexactive_rndactive_cloneactive_mask*layerstypemap[41]totlayermaxlayertotsize*pool*externalrot[4]ave[3]*groundwander[3]rest_lengthparticle_index[2]delete_flagnumparentpa[4]w[4]fuv[4]foffsetprev_state*hair*boiddietimenum_dmcachesphdensityhair_indexalivespring_kplasticity_constantyield_ratioplasticity_balanceyield_balanceviscosity_omegaviscosity_betastiffness_kstiffness_knearrest_densitybuoyancyspring_frames*boids*fluiddistrphystypeavemodereacteventdrawdraw_asdraw_sizechildtyperen_assubframesdraw_colren_stephair_stepkeys_stepadapt_angleadapt_pixintegratorrotfrombb_alignbb_uv_splitbb_animbb_split_offsetbb_tiltbb_rand_tiltbb_offset[2]bb_size[2]bb_vel_headbb_vel_tailcolor_vec_maxsimplify_refsizesimplify_ratesimplify_transitionsimplify_viewporttimetweakcourant_targetjitfaceff_hairgrid_randps_offset[1]grid_reseffector_amounttime_flagtime_pad[3]partfactanfactanphasereactfacob_vel[3]avefacphasefacrandrotfacrandphasefacrandsizeacc[3]dragfacbrownfacrandlengthchild_nbrren_child_nbrparentschildsizechildrandsizechildradchildflatclumppowkink_flatkink_amp_clumprough1rough1_sizerough2rough2_sizerough2_thresrough_endrough_end_shapeclengthclength_thresparting_facparting_minparting_maxbranch_thresdraw_line[2]path_startpath_endtrail_countkeyed_loopsdupliweights*eff_group*dup_ob*bb_ob*pd2use_modifier_stack*part*particles**pathcache**childcachepathcachebufschildcachebufs*clmd*hair_in_dm*hair_out_dm*target_ob*lattice_deform_datatree_framebvhtree_framechild_seedtotunexisttotchildtotcachedtotchildcachetarget_psystotkeyedbakespacebb_uvname[3][64]vgroup[12]vg_negrt3*renderdata*effectors*fluid_springstot_fluidspringsalloc_fluidsprings*tree*pdddt_fracCdisCvistructuralbendingmax_bendmax_structmax_shearmax_sewingavg_spring_lentimescaleeff_force_scaleeff_wind_scalesim_time_oldvelocity_smoothcollider_frictionvel_dampingshrink_minshrink_maxstepsPerFrameprerollmaxspringlensolver_typevgroup_bendvgroup_massvgroup_structvgroup_shrinkshapekey_restpresetsreset*collision_listepsilonself_frictionselfepsilonrepel_forcedistance_repelself_loop_countloop_countvgroup_selfcolthicknessinittimestrokesframenum*actframegstepcolor[4]info[128]sbuffer_sizesbuffer_sflag*sbufferlistprintlevelstorelevel*reporttimer*windrawable*winactivewindowsinitializedfile_savedop_undo_depthoperatorsqueuereportsjobspaintcursorsdragskeyconfigs*defaultconf*addonconf*userconftimers*autosavetimeris_interface_lockedpar[7]*ghostwingrabcursor*screen*newscreenscreenname[64]posxposywindowstatemonitorlastcursormodalcursoraddmousemove*eventstate*curswin*tweakdrawmethoddrawfail*drawdatamodalhandlerssubwindowsgesturepropvalue_str[64]propvalueshiftctrlaltoskeykeymodifiermaptype*ptr*remove_item*add_itemitemsdiff_itemsspaceidregionidkmi_id(*poll)()*modal_itemsbasename[64]actkeymap*customdata*py_instance*reportsmacro*opm*coefficientsarraysizepoly_orderphase_multiplierphase_offsetvalue_offsetmidvalbefore_modeafter_modebefore_cyclesafter_cyclesrectphasemodificationstep_size*rna_pathpchan_name[32]transChanidtypetargets[8]num_targetsvariablesexpression[256]*expr_compvec[2]*fptarray_indexprev_norm_factorfrom[128]to[128]mappingsstrips*remapfcurvesstrip_timeblendmodeextendmode*speaker_handlegroup[64]groupmodekeyingflagpathsdescription[240]typeinfo[64]active_path*tmpactnla_tracks*actstripdriversoverridesact_blendmodeact_extendmodeact_influenceruleoptionsfear_factorsignal_idlook_aheadoloc[3]queue_sizewanderflee_distancehealthstate_idrulesconditionsactionsruleset_typerule_fuzzinesslast_state_idlanding_smoothnessbankingaggressionair_min_speedair_max_speedair_max_accair_max_aveair_personal_spaceland_jump_speedland_max_speedland_max_accland_max_aveland_personal_spaceland_stick_forcestates*smd*fluid_mutex*fluid_group*coll_group*wt*tex_wt*tex_shadow*tex_flame*shadowp0[3]p1[3]dp0[3]cell_size[3]global_size[3]prev_loc[3]shift[3]shift_f[3]obj_shift_f[3]base_res[3]res_min[3]res_max[3]res[3]total_cellsdxadapt_marginadapt_resadapt_thresholdbetaamplifymaxresviewsettingsnoisediss_percentdiss_speedres_wt[3]dx_wtcache_compcache_high_comp*point_cache[2]ptcaches[2]border_collisionstime_scalevorticityactive_fieldsactive_color[3]highres_samplingburning_rateflame_smokeflame_vorticityflame_ignitionflame_max_tempflame_smoke_color[3]*noise_texture*verts_oldvel_multivel_normalvel_randomfuel_amountvolume_densitysurface_distanceparticle_sizetexture_sizetexture_offsetvgroup_densitytexture_typevolume_maxvolume_mindistance_maxdistance_referencecone_angle_outercone_angle_innercone_volume_outerrender_flagbuild_size_flagbuild_tc_flaglastsize[2]tracking*tracking_contextproxyframe_offsetuse_track_masktrack_preview_heightframe_widthframe_heightundist_marker*track_search*track_previewtrack_pos[2]track_disabledtrack_locked*markerslide_scale[2]error*intrinsicsdistortion_modelsensor_widthpixel_aspectfocalunitsprincipal[2]k1k2k3division_k1division_k2pos[2]pattern_corners[4][2]search_min[2]search_max[2]pat_min[2]pat_max[2]markersnrlast_marker*markersbundle_pos[3]pat_flagsearch_flagframes_limitpattern_matchmotion_modelalgorithm_flagminimum_correlationcorners[4][2]**point_trackspoint_tracksnrimage_opacitydefault_motion_modeldefault_algorithm_flagdefault_minimum_correlationdefault_pattern_sizedefault_search_sizedefault_frames_limitdefault_margindefault_pattern_matchdefault_flagmotion_flagkeyframe1keyframe2reconstruction_flagrefine_camera_intrinsicsclean_framesclean_actionclean_errorobject_distancetot_trackact_trackmaxscale*rot_tracklocinfscaleinfrotinflast_cameracamnr*camerastracksplane_tracksreconstructionmessage[256]tot_segment*segmentsmax_segmenttotal_framescoveragesort_methodcoverage_segmentstot_channelsettingscamerastabilization*act_track*act_plane_trackobjectsobjectnrtot_objectdopesheet*brush_groupcurrent_framedisp_typeimage_fileformateffect_uipreview_idinit_color_typepad_simage_resolutionsubstepsinit_color[4]*init_textureinit_layername[64]dry_speedcolor_dry_thresholddepth_clampdisp_factorspread_speedcolor_spread_speedshrink_speeddrip_veldrip_accinfluence_scaleradius_scalewave_dampingwave_speedwave_timescalewave_springwave_smoothnessimage_output_path[1024]output_name[64]output_name2[64]*pmdsurfacesactive_surerror[64]collisionwetnessparticle_radiusparticle_smoothpaint_distance*paint_ramp*vel_rampproximity_falloffray_dirwave_factorwave_clampmax_velocitysmudge_strengthmasklayersmasklay_actmasklay_totid_typeparent[64]sub_parent[64]parent_orig[2]parent_corners_orig[4][2]ubezttot_uw*uwoffset_modeweight_interptot_point*points_deformtot_vertsplinessplines_shapes*act_spline*act_pointblend_flag**objects*constraintsltimenumbodiessteps_per_secondnum_solver_iterations*physics_world*physics_object*physics_shapecol_groupsmesh_sourcerestitutionlin_dampingang_dampinglin_sleep_threshang_sleep_threshorn[4]pos[3]*ob1*ob2breaking_thresholdlimit_lin_x_lowerlimit_lin_x_upperlimit_lin_y_lowerlimit_lin_y_upperlimit_lin_z_lowerlimit_lin_z_upperlimit_ang_x_lowerlimit_ang_x_upperlimit_ang_y_lowerlimit_ang_y_upperlimit_ang_z_lowerlimit_ang_z_upperspring_stiffness_xspring_stiffness_yspring_stiffness_zspring_damping_xspring_damping_yspring_damping_zmotor_lin_target_velocitymotor_ang_target_velocitymotor_lin_max_impulsemotor_ang_max_impulse*physics_constraintselectionqiqi_startqi_endedge_typesexclude_edge_types*linestyleis_displayedmodulesraycasting_algorithmsphere_radiusdkr_epsiloncrease_anglelinesets*color_rampvalue_minvalue_maxrange_minrange_maxmat_attrsamplingwavelengthoctavesfrequencybackbone_lengthtip_lengthroundsrandom_radiusrandom_centerrandom_backbonepivotscale_xscale_ypivot_upivot_xpivot_ymin_thicknessmax_thicknessorientationthickness_positionthickness_ratiocapschainingsplit_lengthmin_anglemax_anglemin_lengthmax_lengthsplit_dash1split_gap1split_dash2split_gap2split_dash3split_gap3sort_keyintegration_typetexstepdash1gap1dash2gap2dash3gap3color_modifiersalpha_modifiersthickness_modifiersgeometry_modifiersTYPEcharucharshortushortintlongulongfloatdoubleint64_tuint64_tvoidLinkLinkDataListBasevec2svec2fvec3frctirctfIDPropertyDataIDPropertyIDLibraryFileDataPackedFilePreviewImageGPUTextureIpoDriverObjectIpoCurveBPointBezTripleIpoKeyBlockKeyAnimDataTextLineTextCameraImageUserSceneImageMovieCacheanimRenderResultColorManagedColorspaceSettingsMTexTexCBDataColorBandEnvMapImBufPointDensityCurveMappingVoxelDataOceanTexbNodeTreeTexMappingColorMappingLampVolumeSettingsGameSettingsTexPaintSlotMaterialGroupVFontVFontDataMetaElemBoundBoxMetaBallNurbCharInfoTextBoxEditNurbGHashCurveEditFontMeshMSelectMPolyMTexPolyMLoopMLoopUVMLoopColMFaceMTFaceTFaceMVertMEdgeMDeformVertMColBMEditMeshCustomDataMultiresMDeformWeightMFloatPropertyMIntPropertyMStringPropertyOrigSpaceFaceOrigSpaceLoopMDispsMultiresColMultiresColFaceMultiresFaceMultiresEdgeMultiresLevelMRecastGridPaintMaskMVertSkinFreestyleEdgeFreestyleFaceModifierDataMappingInfoModifierDataSubsurfModifierDataLatticeModifierDataCurveModifierDataBuildModifierDataMaskModifierDataArrayModifierDataMirrorModifierDataEdgeSplitModifierDataBevelModifierDataSmokeModifierDataSmokeDomainSettingsSmokeFlowSettingsSmokeCollSettingsDisplaceModifierDataUVProjectModifierDataDecimateModifierDataSmoothModifierDataCastModifierDataWaveModifierDataArmatureModifierDataHookModifierDataSoftbodyModifierDataClothModifierDataClothClothSimSettingsClothCollSettingsPointCacheCollisionModifierDataBVHTreeSurfaceModifierDataDerivedMeshBVHTreeFromMeshBooleanModifierDataMDefInfluenceMDefCellMeshDeformModifierDataParticleSystemModifierDataParticleSystemParticleInstanceModifierDataExplodeModifierDataMultiresModifierDataFluidsimModifierDataFluidsimSettingsShrinkwrapModifierDataSimpleDeformModifierDataShapeKeyModifierDataSolidifyModifierDataScrewModifierDataOceanModifierDataOceanOceanCacheWarpModifierDataWeightVGEditModifierDataWeightVGMixModifierDataWeightVGProximityModifierDataDynamicPaintModifierDataDynamicPaintCanvasSettingsDynamicPaintBrushSettingsRemeshModifierDataSkinModifierDataTriangulateModifierDataLaplacianSmoothModifierDataUVWarpModifierDataMeshCacheModifierDataLaplacianDeformModifierDataWireframeModifierDataEditLattLatticebDeformGroupLodLevelSculptSessionbActionbPosebGPdatabAnimVizSettingsbMotionPathBulletSoftBodyPartDeflectSoftBodyCurveCacheRigidBodyObRigidBodyConObHookDupliObjectRNGEffectorWeightsPTCacheExtraPTCacheMemPTCacheEditSBVertexBodyPointBodySpringSBScratchFluidVertexVelocityWorldBaseAviCodecDataQuicktimeCodecDataQuicktimeCodecSettingsFFMpegCodecDataAudioDataSceneRenderLayerFreestyleConfigImageFormatDataColorManagedViewSettingsColorManagedDisplaySettingsBakeDataRenderDataRenderProfileGameDomeGameFramingRecastDataGameDataTimeMarkerPaintBrushPaletteImagePaintSettingsParticleBrushDataParticleEditSettingsSculptUvSculptVPaintTransformOrientationUnifiedPaintSettingsColorSpaceMeshStatVisToolSettingsbStatsUnitSettingsPhysicsSettingsEditingSceneStatsDagForestMovieClipRigidBodyWorldBGpicMovieClipUserRegionView3DRenderInfoRenderEngineViewDepthsSmoothView3DStorewmTimerView3DSpaceLinkView2DSmoothView2DStoreSpaceInfoSpaceButsSpaceOopsBLI_mempoolTreeStoreElemSpaceIpobDopeSheetSpaceNlaSpaceTimeCacheSpaceTimeSpaceSeqSequencerScopesMaskSpaceInfoMaskFileSelectParamsSpaceFileFileListwmOperatorFileLayoutSpaceImageScopesHistogramSpaceTextScriptSpaceScriptbNodeTreePathbNodeInstanceKeySpaceNodeSpaceLogicConsoleLineSpaceConsoleSpaceUserPrefSpaceClipMovieClipScopesuiFontuiFontStyleuiStyleuiWidgetColorsuiWidgetStateColorsuiPanelColorsuiGradientColorsThemeUIThemeSpaceThemeWireColorbThemebAddonbPathCompareSolidLightWalkNavigationUserDefbScreenScrVertScrEdgePanelPanelTypeuiLayoutPanelCategoryStackuiListuiListTypeuiListDynuiPreviewScrAreaSpaceTypeARegionARegionTypeFileGlobalStripElemStripCropStripTransformStripColorBalanceStripProxyStripSequencebSoundMetaStackWipeVarsGlowVarsTransformVarsSolidColorVarsSpeedControlVarsGaussianBlurVarsSequenceModifierDataColorBalanceModifierDataCurvesModifierDataHueCorrectModifierDataBrightContrastModifierDataSequencerMaskModifierDataEffectBuildEffPartEffParticleWaveEffTreeStorebPropertybNearSensorbMouseSensorbTouchSensorbKeyboardSensorbPropertySensorbActuatorSensorbDelaySensorbCollisionSensorbRadarSensorbRandomSensorbRaySensorbArmatureSensorbMessageSensorbSensorbControllerbJoystickSensorbExpressionContbPythonContbActuatorbAddObjectActuatorbActionActuatorSound3DbSoundActuatorbEditObjectActuatorbSceneActuatorbPropertyActuatorbObjectActuatorbIpoActuatorbCameraActuatorbConstraintActuatorbGroupActuatorbRandomActuatorbMessageActuatorbGameActuatorbVisibilityActuatorbTwoDFilterActuatorbParentActuatorbStateActuatorbArmatureActuatorbSteeringActuatorbMouseActuatorGroupObjectBonebArmatureEditBonebMotionPathVertbPoseChannelbIKParambItascbActionGroupSpaceActionbActionChannelbConstraintChannelbConstraintbConstraintTargetbPythonConstraintbKinematicConstraintbSplineIKConstraintbTrackToConstraintbRotateLikeConstraintbLocateLikeConstraintbSizeLikeConstraintbSameVolumeConstraintbTransLikeConstraintbMinMaxConstraintbActionConstraintbLockTrackConstraintbDampTrackConstraintbFollowPathConstraintbStretchToConstraintbRigidBodyJointConstraintbClampToConstraintbChildOfConstraintbTransformConstraintbPivotConstraintbLocLimitConstraintbRotLimitConstraintbSizeLimitConstraintbDistLimitConstraintbShrinkwrapConstraintbFollowTrackConstraintbCameraSolverConstraintbObjectSolverConstraintbActionModifierbActionStripbNodeStackbNodeSocketbNodeSocketTypebNodeLinkbNodebNodeTypeuiBlockbNodeInstanceHashEntrybNodePreviewbNodeTreeTypeStructRNAbNodeInstanceHashbNodeTreeExecbNodeSocketValueIntbNodeSocketValueFloatbNodeSocketValueBooleanbNodeSocketValueVectorbNodeSocketValueRGBAbNodeSocketValueStringNodeFrameNodeImageAnimColorCorrectionDataNodeColorCorrectionNodeBokehImageNodeBoxMaskNodeEllipseMaskNodeImageLayerNodeBlurDataNodeDBlurDataNodeBilateralBlurDataNodeHueSatNodeImageFileNodeImageMultiFileNodeImageMultiFileSocketNodeChromaNodeTwoXYsNodeTwoFloatsNodeGeometryNodeVertexColNodeDefocusNodeScriptDictNodeGlareNodeTonemapNodeLensDistNodeColorBalanceNodeColorspillNodeDilateErodeNodeMaskNodeTexBaseNodeTexSkyNodeTexImageNodeTexCheckerNodeTexBrickNodeTexEnvironmentNodeTexGradientNodeTexNoiseNodeTexVoronoiNodeTexMusgraveNodeTexWaveNodeTexMagicNodeShaderAttributeNodeShaderVectTransformTexNodeOutputNodeKeyingScreenDataNodeKeyingDataNodeTrackPosDataNodeTranslateDataNodePlaneTrackDeformDataNodeShaderScriptNodeShaderTangentNodeShaderNormalMapNodeShaderUVMapNodeSunBeamsCurveMapPointCurveMapBrushClonePaintCurvePaletteColorPaintCurvePointCustomDataLayerCustomDataExternalHairKeyParticleKeyBoidParticleBoidDataParticleSpringChildParticleParticleTargetParticleDupliWeightParticleDataSPHFluidSettingsParticleSettingsBoidSettingsParticleCacheKeyLatticeDeformDataKDTreeParticleDrawDataLinkNodebGPDspointbGPDstrokebGPDframebGPDlayerReportListwmWindowManagerwmWindowwmKeyConfigwmEventwmSubWindowwmGesturewmKeyMapItemPointerRNAwmKeyMapDiffItemwmKeyMapwmOperatorTypeFModifierFMod_GeneratorFMod_FunctionGeneratorFCM_EnvelopeDataFMod_EnvelopeFMod_CyclesFMod_PythonFMod_LimitsFMod_NoiseFMod_SteppedDriverTargetDriverVarChannelDriverFPointFCurveAnimMapPairAnimMapperNlaStripNlaTrackKS_PathKeyingSetAnimOverrideIdAdtTemplateBoidRuleBoidRuleGoalAvoidBoidRuleAvoidCollisionBoidRuleFollowLeaderBoidRuleAverageSpeedBoidRuleFightBoidStateFLUID_3DWTURBULENCESpeakerMovieClipProxyMovieClipCacheMovieTrackingMovieTrackingMarkerMovieTrackingTrackMovieReconstructedCameraMovieTrackingCameraMovieTrackingPlaneMarkerMovieTrackingPlaneTrackMovieTrackingSettingsMovieTrackingStabilizationMovieTrackingReconstructionMovieTrackingObjectMovieTrackingStatsMovieTrackingDopesheetChannelMovieTrackingDopesheetCoverageSegmentMovieTrackingDopesheetDynamicPaintSurfacePaintSurfaceDataMaskParentMaskSplinePointUWMaskSplinePointMaskSplineMaskLayerShapeMaskLayerFreestyleLineSetFreestyleLineStyleFreestyleModuleConfigLineStyleModifierLineStyleColorModifier_AlongStrokeLineStyleAlphaModifier_AlongStrokeLineStyleThicknessModifier_AlongStrokeLineStyleColorModifier_DistanceFromCameraLineStyleAlphaModifier_DistanceFromCameraLineStyleThicknessModifier_DistanceFromCameraLineStyleColorModifier_DistanceFromObjectLineStyleAlphaModifier_DistanceFromObjectLineStyleThicknessModifier_DistanceFromObjectLineStyleColorModifier_MaterialLineStyleAlphaModifier_MaterialLineStyleThicknessModifier_MaterialLineStyleGeometryModifier_SamplingLineStyleGeometryModifier_BezierCurveLineStyleGeometryModifier_SinusDisplacementLineStyleGeometryModifier_SpatialNoiseLineStyleGeometryModifier_PerlinNoise1DLineStyleGeometryModifier_PerlinNoise2DLineStyleGeometryModifier_BackboneStretcherLineStyleGeometryModifier_TipRemoverLineStyleGeometryModifier_PolygonalizationLineStyleGeometryModifier_GuidingLinesLineStyleGeometryModifier_BlueprintLineStyleGeometryModifier_2DOffsetLineStyleGeometryModifier_2DTransformLineStyleThicknessModifier_CalligraphyTLEN  ldt (\$H8$(@0`TP8LD8X,|pTh@  ,<  @ ( `pplht$@`|0 xl0xthh`| LLpXXphpx Px0xXtL` @D (@Hh88T|LD0p|(H 88TX,(0 `  <x$)((\P4hXpx 4L8 *HP`$8, l   `h`x8 TPLHLHlp\L\ DxlXX (,0(h(`,h\TLLLDd`LLT` TT <,4 h( ,@  H@@@0LHD@ <pLd84@D` hd0LX`h0D8\@8`@H4(lH,|`  ppDX\dldlthpxddl``hhpp````phxhSTRC7                  !"#$%&'()*+,-./0 123-.45678  9:;<=!>?-@AB"""C<DEFG HIJ#$K"LMNBO!PQRSTU%%%VWX&YZ[\%]%^_`abc defg '$Khijklmnopqrs!Ptuv()wxyz{|}~B*&"+,--~%.v/A0v81C?2?13*4jk~5 267    B ~8B0?$K !"#$%&'()*+,-./012345678 |yz{9:D(;9<!P*23=5>7?8@Av: BCDEF,; 2GHIJK<K$KLMNOPQRSTUVWX6YjkZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~!P/A9<=>D?*B@$K=>LpAB22/9<!PA     ?B"C%DDDEF$K !!P@"#$BBC%&'D( )*+6,-./01234567*+.1BGGG819:;<=>?@ABC0 1DEFHG8BIHIJJKKL6LF$KEMJNOPQ!P#R@"BCSTUVWX$YZ[<=\]^_6\`DabcdefghijCklmnMopBqBrBsBtIuvwHxHyTz{|}~N1$KE!P#R@"OPQRSTUVWXYZ[N\]]]]]5BCSB$^W LU8Y_+Z_X[P8BRQ*LBSTOV*L`abcdefgfh8;ij jjhgi5BX^X]]klBmnKoKp ppLB)wqp0rpZ  sp6tpupvpHLw pZxpypZz pZB{p|}~ p0B p*ZB p  B L p p fp0BYDp p !pp)w"#$%& pX'X(X)X*X+X,U-./012pX'X3425.p6B7+z8p9;:;<5=>?@A8BCDEF GpH4IJKBp,BLMpNOPpQRSTZ;pU% pVWXYZ[D\]^;p_X`aL;p pzbcdBefghi pjkl m Bpnopqrstuvwxyz{|}~fBp06Yp60p0p0pBpLBp;pBpD pXp`v#p K pzbch;L6$K9:!P#RZHvEBZ$K$!PE L@"$BC B    h !"#$%&'()*+,-.>/A012L3456 7 89:;<=>?@(ABC$D DE! ,DFGHIJ)KLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl0mnoApqrBs  tuv w xyz{|}~Bu8 76uB{R&6DNN!P5L$KMp     L !"#$%&'()*+,-./0123456789:;<=>?@A!P/A;9<BCD E FGHIJKLMNOBP Q RSTUVWXYZ[\]^_`abcdDWefghijklZmnopq rstuvB@wAxyz{|}~ #YKw5{bfLD&B DL &D     D$L !t"# $%Z&' ()*+,L -*.*/*0Dfz12345 -68789:)w (Z;<=>?@ A((BBZC -DBfE+FGHIJKLMNOPQRSTUV WXYZ[\]^_`abKcdefghi7jklmnopqrstuvwxyz{|}~^58)0$K")A9<      8 .*(;hifB)E SK6SK"     #l~ @!?"#$%&'()*+,-./0123456v789:;.<=>v ?@AB C7D EF GHIJ K 7 LMLNO  NB L7P 7QR7hi8STUVWXYZ[\]^_`abcdefghijklmnopqrst*(;6uXvwhiVxyLzB{|}~!&Z6       Z ZD 9< B!7QDhiVw9<9" B###V$B%K&hiV'XL Bw((() .***))))B+ ,B-B./++++++++++++++++++,-   B  0 !-".#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~1+0B222/000000000000000001B333444v5B76K7r                  5              ! " # $ % & ' ( ) * D+ , - . / 0 1 2 3 4 5 6 vw7 8 29 : ; < = B> ? @ A B C D E F G H 6I 8J K L )w)M N DO P Q R S T U V W X Y BZ [ 9999\ ] :::9^ 9_ B;;;<` =qa b c d e f g h Bi j k l ;m n >>>o ???@` p q r s t u v w x Ay BBBz { CCC9^ 9_ 9| 9} 8~ 3 /0 S  P BD`    EEE7  /0   df g R  W  ;F`         G      8 )   H   I  J  K   BL _,   M MM   H LI J K .N4NN               M !P)w Y,  N N N  O        {KPPP N    N    B Q    R      S       TBU  Z V  W WW BN  XWK  YW6 ZW6 [W\W4 4 4 4 4 4 ]]] 8^^^ 8{_-__     R      :  B           #     ` Aaaa Y    bF! ccc " dS# $ BeDL% & f@' SBg( ) * + , hB- . iBj/ 0 Bk1 2 Ll m/ n% & LD3 o4 5 p6 7 8 qqq9 : ; < D r= ,1> Bs ? @ A B C D E tF u&LrrrrG H < 9 I  v= qJ K L wB,xM   N O P Q R  S T yU V W X Y Z [ \ z ] D^  O y_ ^` {,Na b c  d e B|DB)w"}B- ,~ 9  f g K{ h i j    N D,k l  D Lm Bn o p q r    K?s t u v w x y % z { 7 | D8   } ~ 6  &;,$4 5 + BV  q S    V      v vvvG 9   ,O"%  !P  U V ZB , A  $         S+       $K       B@                              (+   $     B B           K B DT         E            1      B  A   B 7  LN  !PP !P    B  !P       &          +  LS        ZB          z~ D!    k l M  "  B zb#  $ % & '   ( ) * + , - . / 0 BD # B1  2 3 4 5 6 7 8 9 : ; < = > ? @ A  B    C D #   C D #   C D # S[LBVSZ]E \6F G H "I BBH 1 " J  K ,LL M !PM  N O P Q O R S T  7k l U V W X Y Z ;[ \  ] ^ _ ` o a b c d e B f g h i j /k ` o B l d  m H n $ ] o p a b Yq r s t u v w x y z { | } ~      (  B   B    B9$$K` o      t        H n   B  k l k l K k l  B  y{ B   B            YB YB  f g ~  E    b        V  B   B  "{ { B  D ~    d               < ~           f;     ( z      B           v  : ;     (;      z (;   B B B BB  B                 E  L#         !  u" # $ % & ' ( ) * 6 ?+ , - . / 0 1 2 3   4 5 6 7 8 9   L: ~; < = > ? @ A B C D E F G H I J BBK L  6M AN .*O B9P 6& /Q /R S 4T 2U V W X Y +fZ [ \ ] a^ _ ` FGa b Bc d e f g h i j k l m n o p Eq r s t u v w x y z F{ | } B ~      zE   G  ]       +B      8         8,L0 ,8 9     R     f B                K$K  82  p    D      9          OP                                           f             jhi                    /A0 A   !P>  K3             $ 5             ! " # &$ % & ' ( 2) *  *+ ,  - c. / 0 1 2 3 4 5 6 7 8 9 : ; < = Z> ? @ A B C D E F G 6H I J K L M ZN O AP B  RQ R S T  yU Q V W X Y Z [ \ ] ^ B_ !` !a b c d e f g h i j k l "m "n "o p q r s ! !! t Q u B8v 8w x y z f g { | E} ~  # $ %   g     &&&o         B' (((& & ) ))  o     """o   o *` '    =qK+ ++  {O R ,   L-4   .k l .//.5 k l 0    1&2 B3f z 4 z  5   6665  <7 < 8 B999 7= 18 5<  m  B: ;;;V <<< M ;     N O O R   D === > >>   B   ? ?? o    @@@  $  ;  <      A$KBBBCB ,    DB   EB ,B 5  FB  8GB     LHHH              =             |>{ I A A A J          Z !"#$%&'()*}{ 4H0+,.-./m 0P 123 45B67Z~{ 4,.BK$KO 89:; <=> { xS?L  @A$K"B,MNC DLE F.'~GHIJOK4L4MNOPxPOQRQxSDR TUBVWXYDZ[\]^_O`abcxPPPdebcO fgOhiSjkm lmnop+BSqxT TTPrsBShf*tgUuvwxyz{|}~SV P~WSQX XXWYZ ZZPB[[[  B\~ BN URWVPTY\]2]]^A& Z  B04ZB4H@Z22 B $K{B_`Ha B`_ b bba _ accctvdddbav(AAB&    MB DB      eeeZDAfggg& K!L"Z#$%&hhh Zih2'jh6& ZBkh6& Z()Blh2'*+mh6& Z*+Bnh6& Z*+()BohV2'*+phV6& Z*+Bq hV6& Z*+()Brh2'Z,sh6& Z,th6& Z(),uh-BvhSBwh.4 Bxh4/Zyh04 /Dzh04 /D{h1B|h2B}hSB~hzBhZ31456h  h789 :;<Bh=>?Bf,$KQ @ABC3DEFGHIJKLMNOPQpABRSTUVW /9<XYZ[ENDBconfclerk-0.6.4/src/icons/favourite-no.png0000664000175000017500000000252713212517317020021 0ustar gregoagregoaPNG  IHDR szz pHYs   IDATXŗmLSgڲXJHS!6̒M"m&s b23om'%˲lf3d~Xxe;DD(*־{Z( Is9^е4A%}t. 6w1)h=HDfI/_uoȥKDD΋~o4{<EDHOV^YS]=PUu|m6ofppUU7_\MZD@jϜ-2ߏt: XzWX>i(Bllc Ν; [[ "N222,?<22ł`g# >u[=7'9 P_ ONNFwpP<$ #dɪzW#\t43MX,?X@:ߏwOq\\.b۩e]..bmAA|ttMU4F0 Dz_|毫W跡Dd<1L!JZަM%2$TUOl}}hW^UYIKc:ù7{zhmiESɧh4I4Qr&xkcz^VFJj$V;g1[sF#{eM@:;;ٷy\BZ"Jn%;;_8ӊ |ynvl6ہπgʄVd.9i^Vl&§˄@iFFnk$%% _s8tp()1%YYhZ/ϛ?wY0KxJ;S@:ph0 ԕGLx<9ǓG>U3 (BbRDEuvp8*188-AKyyl,)a…h.jϞa Ϗnd2-~^j6 ^]Yɹf2^R\RB^^z*0X̬99;Z΀63 {ȃwzCUU45L`L=vn͍xE9.UӦjA%w^萮.rT˵NQUUDBDVMΐ+"EAOO. */ #ifndef SCHEDULEXMLPARSER_H_ #define SCHEDULEXMLPARSER_H_ #include #include "sqlengine.h" class ScheduleXmlParser : public QObject { Q_OBJECT private: SqlEngine* sqlEngine; void parseDataImpl(const QByteArray &aData, const QString& url, int conferenceId); public: ScheduleXmlParser(SqlEngine* sqlEngine, QObject *aParent = NULL); public slots: void parseData(const QByteArray &aData, const QString& url, int conferenceId); signals: void progressStatus(int aStatus); void parsingScheduleBegin(); void parsingScheduleEnd(int conferenceId); }; #endif /* SCHEDULEXMLPARSER_H_ */ confclerk-0.6.4/src/sql/sql.pro0000664000175000017500000000055713212517317015703 0ustar gregoagregoainclude(../global.pri) TEMPLATE = lib TARGET = sql DESTDIR = ../bin CONFIG += static QT += sql xml QMAKE_CLEAN += ../bin/libsql.a # module dependencies LIBS += -L$$DESTDIR -lmvc -lorm INCLUDEPATH += ../mvc ../orm ../app DEPENDPATH += . HEADERS += sqlengine.h \ schedulexmlparser.h SOURCES += sqlengine.cpp \ schedulexmlparser.cpp confclerk-0.6.4/src/sql/schedulexmlparser.cpp0000664000175000017500000002503313212517317020614 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include #include #include #include "schedulexmlparser.h" #include "sqlengine.h" #include "../gui/errormessage.h" #include #include ScheduleXmlParser::ScheduleXmlParser(SqlEngine* sqlEngine, QObject *aParent): QObject(aParent),sqlEngine(sqlEngine) { } class ParseException: public std::runtime_error { public: ParseException(const QString& message): std::runtime_error(message.toStdString()) {} }; void checkEvent(QHash& event) { QString event_id = event["id"]; if (event_id.trimmed().isEmpty()) throw ParseException(QObject::tr("The ID of event '%1' is missing.").arg(event["title"])); bool ok; event_id.toInt(&ok); if (!ok) throw ParseException(QObject::tr("The ID '%2' of event '%1' is not numeric.").arg(event["title"]).arg(event_id)); } void ScheduleXmlParser::parseDataImpl(const QByteArray &aData, const QString& url, int conferenceId) { QDomDocument document; QString xml_error; int xml_error_line; int xml_error_column; if (!document.setContent(aData, false, &xml_error, &xml_error_line, &xml_error_column)) { throw ParseException("Could not parse schedule: " + xml_error + " at line " + QString("%1").arg(xml_error_line) + " column " + QString("%1").arg(xml_error_column)); } QDomElement scheduleElement = document.firstChildElement("schedule"); TransactionRaii transaction(*sqlEngine); // begins the transaction QString conference_title; if (!scheduleElement.isNull()) { QDomElement conferenceElement = scheduleElement.firstChildElement("conference"); QTime conference_day_change; if (!conferenceElement.isNull()) { emit(parsingScheduleBegin()); QHash conference; conference["id"] = QString::number(conferenceId); // conference ID is assigned automatically if 0 conference["title"] = conferenceElement.firstChildElement("title").text(); conference["subtitle"] = conferenceElement.firstChildElement("subtitle").text(); conference["venue"] = conferenceElement.firstChildElement("venue").text(); conference["city"] = conferenceElement.firstChildElement("city").text(); conference["start"] = conferenceElement.firstChildElement("start").text(); // date conference["end"] = conferenceElement.firstChildElement("end").text(); // date QString conferenceDayChangeStr = conferenceElement.firstChildElement("day_change").text(); // time, e.g. "04:00:00" if (conferenceDayChangeStr.isEmpty()) conferenceDayChangeStr = "04:00:00"; conference["day_change"] = conferenceDayChangeStr; conference["timeslot_duration"] = conferenceElement.firstChildElement("timeslot_duration").text(); // time conference["url"] = url; sqlEngine->addConferenceToDB(conference, conferenceId); conferenceId = conference["id"].toInt(); conference_title = conference["title"]; conference_day_change = QTime(0, 0).addSecs(conference["day_change"].toInt()); } // we need to get count of all events in order to emit 'progressStatus' signal int totalEventsCount = scheduleElement.elementsByTagName("event").count(); // parsing day elements int currentEvent = 0; // hold global idx of processed event QDomNodeList dayList = scheduleElement.elementsByTagName("day"); for (int i=0; i room; room["name"] = roomElement.attribute("name"); room["event_id"] = eventElement.attribute("id"); room["conference_id"] = QString::number(conferenceId,10); sqlEngine->addRoomToDB(room); // process event's nodes QHash event; event["id"] = eventElement.attribute("id"); event["conference_id"] = QString::number(conferenceId, 10); QTime event_start = QTime::fromString(eventElement.firstChildElement("start").text(), sqlEngine->TIME_FORMAT); event["start"] = event_start.toString(sqlEngine->TIME_FORMAT); // time eg. 10:00 QDate event_date; QDomElement eventDateElement = eventElement.firstChildElement("date"); if (!eventDateElement.isNull()) { QString date_str = eventDateElement.text(); // date eg. 2009-02-07T10:00:00+00:00 event_date = QDate::fromString(date_str.left(sqlEngine->DATE_FORMAT.size()), sqlEngine->DATE_FORMAT); } else { event_date = QDate::fromString(dayElement.attribute("date"),sqlEngine->DATE_FORMAT); // date eg. 2009-02-07 if (event_start < conference_day_change) event_date = event_date.addDays(1); } event["date"] = event_date.toString(sqlEngine->DATE_FORMAT); // date eg. 2009-02-07 event["duration"] = eventElement.firstChildElement("duration").text(); // time eg. 00:30 event["room_name"] = eventElement.firstChildElement("room").text(); // string eg. "Janson" event["tag"] = eventElement.firstChildElement("tag").text(); // string eg. "welcome" event["title"] = eventElement.firstChildElement("title").text(); // string eg. "Welcome" event["subtitle"] = eventElement.firstChildElement("subtitle").text(); // string event["track"] = eventElement.firstChildElement("track").text(); // string eg. "Keynotes" event["type"] = eventElement.firstChildElement("type").text(); // string eg. "Podium" event["language"] = eventElement.firstChildElement("language").text(); // language eg. "English" event["abstract"] = eventElement.firstChildElement("abstract").text(); // string event["description"] = eventElement.firstChildElement("description").text(); // string checkEvent(event); sqlEngine->addEventToDB(event); // process persons' nodes QDomElement personsElement = eventElement.firstChildElement("persons"); QDomNodeList personList = personsElement.elementsByTagName("person"); for(int i = 0;i < personList.count();i++){ QHash person; person["id"] = personList.at(i).toElement().attribute("id"); person["name"] = personList.at(i).toElement().text(); person["event_id"] = eventElement.attribute("id"); person["conference_id"] = QString::number(conferenceId, 10); sqlEngine->addPersonToDB(person); } // process links' nodes QDomElement linksElement = eventElement.firstChildElement("links"); QDomNodeList linkList = linksElement.elementsByTagName("link"); for(int i = 0;i < linkList.count();i++){ QHash link; link["name"] = linkList.at(i).toElement().text(); link["url"] = linkList.at(i).toElement().attribute("href"); link["event_id"] = eventElement.attribute("id"); link["conference_id"] = QString::number(conferenceId, 10); sqlEngine->addLinkToDB(link); } // emit signal to inform the user about the current status (how many events are parsed so far - expressed in %) int status = currentEvent * 100 / totalEventsCount; progressStatus(status); } // parsing event elements } } // parsing room elements } // parsing day elements } // schedule element if (conference_title.isNull()) throw ParseException("Could not parse schedule"); transaction.commit(); emit parsingScheduleEnd(conferenceId); } void ScheduleXmlParser::parseData(const QByteArray &aData, const QString& url, int conferenceId) { try { parseDataImpl(aData, url, conferenceId); } catch (ParseException& e) { error_message(e.what()); } } confclerk-0.6.4/src/sql/sqlengine.cpp0000664000175000017500000004061313212517317017050 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include #include #include #include #include #include "qglobal.h" #if QT_VERSION >= 0x050000 #include #else #include #endif #include #include "sqlengine.h" #include "track.h" #include "conference.h" #include SqlEngine::SqlEngine(QObject *aParent): QObject(aParent), DATE_FORMAT("yyyy-MM-dd"), TIME_FORMAT("hh:mm") { #if QT_VERSION >= 0x050000 QDir dbPath(QStandardPaths::writableLocation(QStandardPaths::DataLocation)); #else QDir dbPath(QDesktopServices::storageLocation(QDesktopServices::DataLocation)); #endif dbFilename = dbPath.absoluteFilePath("ConfClerk.sqlite"); } SqlEngine::~SqlEngine() { } void SqlEngine::open() { // we may have to create the directory of the database QFileInfo dbFilenameInfo(dbFilename); QDir cwd; cwd.mkpath(dbFilenameInfo.absolutePath()); // We don't have to handle errors because in worst case, opening the database will fail // and db.isOpen() returns false. db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(dbFilename); db.open(); } int SqlEngine::dbSchemaVersion() { QSqlQuery query(db); if (!query.exec("PRAGMA user_version")) { emitSqlQueryError(query); return -2; } query.first(); int version = query.value(0).toInt(); if (version == 0) { // check whether the tables are existing if (!query.exec("select count(*) from sqlite_master where name='CONFERENCE'")) { emitSqlQueryError(query); return -2; } query.first(); if (query.value(0).toInt() == 1) return 0; // tables are existing return -1; // database seems to be empty (or has other tables) } return version; } bool SqlEngine::updateDbSchemaVersion000To001() { return applySqlFile(":/dbschema000to001.sql"); } bool SqlEngine::createCurrentDbSchema() { return applySqlFile(":/dbschema001.sql"); } bool SqlEngine::createOrUpdateDbSchema() { int version = dbSchemaVersion(); switch (version) { case -2: // the error has already been emitted by the previous function return false; case -1: // empty database return createCurrentDbSchema(); case 0: // db schema version 0 return updateDbSchemaVersion000To001(); case 1: // current schema return true; default: // unsupported schema emit dbError(tr("Unsupported database schema version %1.").arg(version)); } return false; } bool SqlEngine::applySqlFile(const QString sqlFile) { QFile file(sqlFile); file.open(QIODevice::ReadOnly | QIODevice::Text); QString allSqlStatements = file.readAll(); QSqlQuery query(db); foreach(QString sql, allSqlStatements.split(";")) { if (sql.trimmed().isEmpty()) // do not execute empty queries like the last character from create_tables.sql continue; if (!query.exec(sql)) { emitSqlQueryError(query); return false; } } return true; } void SqlEngine::addConferenceToDB(QHash &aConference, int conferenceId) { QSqlQuery query(db); bool insert = conferenceId <= 0; if (insert) { // insert conference query.prepare("INSERT INTO CONFERENCE (title,url,subtitle,venue,city,start,end," "day_change,timeslot_duration,active) " " VALUES (:title,:url,:subtitle,:venue,:city,:start,:end," ":day_change,:timeslot_duration,:active)"); } else { // update conference query.prepare("UPDATE CONFERENCE set title=:title, url=:url, subtitle=:subtitle, venue=:venue, city=:city, start=:start, end=:end," "day_change=:day_change, timeslot_duration=:timeslot_duration, active=:active " "WHERE id=:id"); } foreach (QString prop_name, (QList() << "title" << "url" << "subtitle" << "venue" << "city")) { query.bindValue(QString(":") + prop_name, aConference[prop_name]); } query.bindValue(":start", QDateTime(QDate::fromString(aConference["start"],DATE_FORMAT),QTime(0,0),Qt::UTC).toTime_t()); query.bindValue(":end", QDateTime(QDate::fromString(aConference["end"],DATE_FORMAT),QTime(0,0),Qt::UTC).toTime_t()); QTime dayChange = QTime::fromString(aConference["day_change"].left(TIME_FORMAT.size()), TIME_FORMAT); query.bindValue(":day_change", QTime(0, 0).secsTo(dayChange)); query.bindValue(":timeslot_duration", -QTime::fromString(aConference["timeslot_duration"],TIME_FORMAT).secsTo(QTime(0,0))); query.bindValue(":active", 1); if (!insert) query.bindValue(":id", conferenceId); query.exec(); emitSqlQueryError(query); if (insert) { aConference["id"] = query.lastInsertId().toString(); // 'id' is assigned automatically } else { aConference["id"] = QVariant(conferenceId).toString(); } } void SqlEngine::addEventToDB(QHash &aEvent) { int conferenceId = aEvent["conference_id"].toInt(); Conference conference = Conference::getById(conferenceId); // insert event track to table and get track id Track track; int trackId; QString trackName = aEvent["track"]; if (trackName.isEmpty()) trackName = tr("No track"); try { track = Track::retrieveByName(conferenceId, trackName); trackId = track.id(); } catch (OrmNoObjectException &e) { track.setConference(conferenceId); track.setName(trackName); trackId = track.insert(); } QDate startDate = QDate::fromString(aEvent["date"], DATE_FORMAT); QTime startTime = QTime::fromString(aEvent["start"], TIME_FORMAT); QDateTime startDateTime; startDateTime.setTimeSpec(Qt::UTC); startDateTime = QDateTime(startDate, startTime, Qt::UTC); bool event_exists = false; { QSqlQuery check_event_query; check_event_query.prepare("SELECT * FROM EVENT WHERE xid_conference = :xid_conference AND id = :id"); check_event_query.bindValue(":xid_conference", aEvent["conference_id"]); check_event_query.bindValue(":id", aEvent["id"]); if (!check_event_query.exec()) { qWarning() << "check event failed, conference id:" << aEvent["xid_conference"] << "event id:" << aEvent["id"] << "error:" << check_event_query.lastError() ; return; } if (check_event_query.isActive() and check_event_query.isSelect() and check_event_query.next()) { event_exists = true; } } QSqlQuery result; if (event_exists) { result.prepare("UPDATE EVENT SET" " start = :start" ", duration = :duration" ", xid_track = :xid_track" ", type = :type" ", language = :language" ", tag = :tag" ", title = :title" ", subtitle = :subtitle" ", abstract = :abstract" ", description = :description" " WHERE id = :id AND xid_conference = :xid_conference"); } else { result.prepare("INSERT INTO EVENT " " (xid_conference, id, start, duration, xid_track, type, " " language, tag, title, subtitle, abstract, description) " " VALUES (:xid_conference, :id, :start, :duration, :xid_track, :type, " ":language, :tag, :title, :subtitle, :abstract, :description)"); } result.bindValue(":xid_conference", aEvent["conference_id"]); result.bindValue(":start", QString::number(startDateTime.toTime_t())); result.bindValue(":duration", -QTime::fromString(aEvent["duration"],TIME_FORMAT).secsTo(QTime(0,0))); result.bindValue(":xid_track", trackId); static const QList props = QList() << "id" << "type" << "language" << "tag" << "title" << "subtitle" << "abstract" << "description"; foreach (QString prop_name, props) { result.bindValue(QString(":") + prop_name, aEvent[prop_name]); } if (!result.exec()) { qWarning() << "event insert/update failed:" << result.lastError(); } } void SqlEngine::addPersonToDB(QHash &aPerson) { QSqlQuery query(db); query.prepare("INSERT INTO PERSON (xid_conference,id,name) VALUES (:xid_conference, :id, :name)"); query.bindValue(":xid_conference", aPerson["conference_id"]); query.bindValue(":id", aPerson["id"]); query.bindValue(":name", aPerson["name"]); query.exec(); // TODO some queries fail due to the unique key constraint // if (!query.exec()) qDebug() << "SQL query 'insert into person' failed: " << query.lastError(); query = QSqlQuery(db); query.prepare("INSERT INTO EVENT_PERSON (xid_conference,xid_event,xid_person) VALUES (:xid_conference, :xid_event, :xid_person)"); query.bindValue(":xid_conference", aPerson["conference_id"]); query.bindValue(":xid_event", aPerson["event_id"]); query.bindValue(":xid_person", aPerson["id"]); query.exec(); // TODO some queries fail due to the unique key constraint // if (!query.exec()) qDebug() << "SQL query 'insert into event_person' failed: " << query.lastError(); } void SqlEngine::addRoomToDB(QHash &aRoom) { QSqlQuery query(db); query.prepare("SELECT id FROM ROOM WHERE xid_conference=:conference_id and name=:name"); query.bindValue(":conference_id", aRoom["conference_id"]); query.bindValue(":name", aRoom["name"]); query.exec(); emitSqlQueryError(query); // now we have to check whether ROOM record with 'name' exists or not, // - if it doesn't exist yet, then we have to add that record to 'ROOM' table // and assign autoincremented 'id' to aRoom // - if it exists, then we need to get its 'id' and assign it to aRoom aRoom["id"] = ""; if(query.next()) // ROOM record with 'name' already exists: we need to get its 'id' { aRoom["id"] = query.value(0).toString(); } else // ROOM record doesn't exist yet, need to create it { query = QSqlQuery(db); query.prepare("INSERT INTO ROOM (xid_conference,name) VALUES (:xid_conference, :name)"); query.bindValue(":xid_conference", aRoom["conference_id"]); query.bindValue(":name", aRoom["name"]); query.exec(); emitSqlQueryError(query); aRoom["id"]= query.lastInsertId().toString(); // 'id' is assigned automatically //LOG_AUTOTEST(query); } // remove previous conference/room records; room names might have changed query = QSqlQuery(db); query.prepare("DELETE FROM EVENT_ROOM WHERE xid_conference=:conference_id AND xid_event=:event_id"); query.bindValue(":conference_id", aRoom["conference_id"]); query.bindValue(":event_id", aRoom["event_id"]); query.exec(); emitSqlQueryError(query); // and insert new ones query = QSqlQuery(db); query.prepare("INSERT INTO EVENT_ROOM (xid_conference,xid_event,xid_room) VALUES (:conference_id, :event_id, :room_id)"); query.bindValue(":conference_id", aRoom["conference_id"]); query.bindValue(":event_id", aRoom["event_id"]); query.bindValue(":room_id", aRoom["id"]); query.exec(); emitSqlQueryError(query); } void SqlEngine::addLinkToDB(QHash &aLink) { //TODO: check if the link doesn't exist before inserting QSqlQuery query(db); query.prepare("INSERT INTO LINK (xid_event, xid_conference, name, url) VALUES (:xid_event, :xid_conference, :name, :url)"); query.bindValue(":xid_event", aLink["event_id"]); query.bindValue(":xid_conference", aLink["conference_id"]); query.bindValue(":name", aLink["name"]); query.bindValue(":url", aLink["url"]); query.exec(); emitSqlQueryError(query); } bool SqlEngine::searchEvent(int aConferenceId, const QHash &aColumns, const QString &aKeyword) { if (aColumns.empty()) return false; // DROP QSqlQuery query(db); query.exec("DROP TABLE IF EXISTS SEARCH_EVENT"); emitSqlQueryError(query); // CREATE query.exec("CREATE TEMP TABLE SEARCH_EVENT ( xid_conference INTEGER NOT NULL, id INTEGER NOT NULL )"); emitSqlQueryError(query); // INSERT QString sql = QString("INSERT INTO SEARCH_EVENT ( xid_conference, id ) " "SELECT DISTINCT EVENT.xid_conference, EVENT.id FROM EVENT "); if( aColumns.contains("ROOM") ){ sql += "LEFT JOIN EVENT_ROOM ON ( EVENT.xid_conference = EVENT_ROOM.xid_conference AND EVENT.id = EVENT_ROOM.xid_event ) "; sql += "LEFT JOIN ROOM ON ( EVENT_ROOM.xid_room = ROOM.id ) "; } if( aColumns.contains("PERSON") ){ sql += "LEFT JOIN EVENT_PERSON ON ( EVENT.xid_conference = EVENT_PERSON.xid_conference AND EVENT.id = EVENT_PERSON.xid_event ) "; sql += "LEFT JOIN PERSON ON ( EVENT_PERSON.xid_person = PERSON.id ) "; } sql += QString("WHERE EVENT.xid_conference = %1 AND (").arg( aConferenceId ); QStringList searchKeywords = aKeyword.trimmed().split(QRegExp("\\s+")); QStringList whereAnd; for (int i=0; i < searchKeywords.count(); i++) { QStringList whereOr; foreach (QString table, aColumns.uniqueKeys()) { foreach (QString column, aColumns.values(table)){ whereOr.append(QString("%1.%2 LIKE '\%' || :%1%2%3 || '\%'").arg(table).arg(column).arg(i)); } } whereAnd.append(whereOr.join(" OR ")); } sql += whereAnd.join(") AND ("); sql += QString(")"); query.prepare(sql); for (int i = 0; i != searchKeywords.size(); ++i) { QString keyword = searchKeywords[i]; foreach (QString table, aColumns.uniqueKeys()) { foreach (QString column, aColumns.values(table)) { query.bindValue(QString(":%1%2%3").arg(table).arg(column).arg(i), keyword ); } } } bool success = query.exec(); emitSqlQueryError(query); return success; } bool SqlEngine::beginTransaction() { QSqlQuery query(db); bool success = query.exec("BEGIN IMMEDIATE TRANSACTION"); emitSqlQueryError(query); return success; } bool SqlEngine::commitTransaction() { QSqlQuery query(db); bool success = query.exec("COMMIT"); emitSqlQueryError(query); return success; } bool SqlEngine::rollbackTransaction() { QSqlQuery query(db); bool success = query.exec("ROLLBACK"); emitSqlQueryError(query); return success; } bool SqlEngine::deleteConference(int id) { QSqlQuery query(db); bool success = query.exec("BEGIN IMMEDIATE TRANSACTION"); emitSqlQueryError(query); QStringList sqlList; sqlList << "DELETE FROM LINK WHERE xid_conference = ?" << "DELETE FROM EVENT_ROOM WHERE xid_conference = ?" << "DELETE FROM EVENT_PERSON WHERE xid_conference = ?" << "DELETE FROM EVENT WHERE xid_conference = ?" << "DELETE FROM ROOM WHERE xid_conference = ?" << "DELETE FROM PERSON WHERE xid_conference = ?" << "DELETE FROM TRACK WHERE xid_conference = ?" << "DELETE FROM CONFERENCE WHERE id = ?"; foreach (const QString& sql, sqlList) { query.prepare(sql); query.bindValue(0, id); success &= query.exec(); emitSqlQueryError(query); } success &= query.exec("COMMIT"); emitSqlQueryError(query); return success; } void SqlEngine::emitSqlQueryError(const QSqlQuery &query) { QSqlError error = query.lastError(); if (error.type() == QSqlError::NoError) return; emit dbError(error.text()); } confclerk-0.6.4/src/sql/sqlengine.h0000664000175000017500000000723013212517317016513 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef SQLENGINE_H #define SQLENGINE_H #include #include #include class SqlEngine : public QObject { Q_OBJECT public: const QString DATE_FORMAT; // "yyyy-MM-dd" const QString TIME_FORMAT; // "hh:mm" QString dbFilename; ///< database filename including path QSqlDatabase db; ///< this may be private one day... SqlEngine(QObject *aParent = NULL); ~SqlEngine(); // Open/Close void open(); ///< emits a database error if failed. bool isOpen() const {return db.isOpen();} void close() {db.close();} // Schema version /// returns the "user_version" of the database schema /// we return -1 for an empty database /// the database has to be open /// returns -2 if an error occurs and emits the error message int dbSchemaVersion(); /// called by createOrUpdateDbSchema. Do not use directly. true for success. bool updateDbSchemaVersion000To001(); /// called by createOrUpdateDbSchma. Do not use directly. true for success. bool createCurrentDbSchema(); /// creates the current database schema if an empty database is found, /// otherwise updates the schema if an old one is found. true for success. bool createOrUpdateDbSchema(); /// Applies an SQL file bool applySqlFile(const QString sqlFile); // if a conferneceId != 0 is given, the confernce is updated instead of inserted. void addConferenceToDB(QHash &aConference, int conferenceId); void addEventToDB(QHash &aEvent); void addPersonToDB(QHash &aPerson); void addLinkToDB(QHash &aLink); void addRoomToDB(QHash &aRoom); bool deleteConference(int id); bool beginTransaction(); bool commitTransaction(); bool rollbackTransaction(); /// search Events for .... returns true if success bool searchEvent(int conferenceId, const QHash &columns, const QString &keyword); private: static QString login(const QString &aDatabaseType, const QString &aDatabaseName); /// emits a possible error message as signal. Does nothing if there was not last error void emitSqlQueryError(const QSqlQuery& query); signals: /// emitted when a database errors occur void dbError(const QString& message); }; class TransactionRaii { SqlEngine& sqlEngine; bool committed; public: TransactionRaii(SqlEngine& sqlEngine): sqlEngine(sqlEngine), committed(false) { sqlEngine.beginTransaction(); } void commit() { sqlEngine.commitTransaction(); committed = true; } ~TransactionRaii() { if (!committed) sqlEngine.rollbackTransaction(); } }; #endif /* SQLENGINE_H */ confclerk-0.6.4/src/app/0000775000175000017500000000000013212517317014334 5ustar gregoagregoaconfclerk-0.6.4/src/app/app.pro0000664000175000017500000000146013212517317015637 0ustar gregoagregoainclude(../global.pri) TEMPLATE = app TARGET = confclerk DESTDIR = ../bin QT += sql xml network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG(maemo5) { QT += maemo5 } # module dependencies LIBS += -L$$DESTDIR -lgui -lmvc -lsql INCLUDEPATH += ../gui ../sql ../mvc ../orm DEPENDPATH += . ../gui POST_TARGETDEPS += $$DESTDIR/libmvc.a $$DESTDIR/libgui.a $$DESTDIR/libsql.a maemo { LIBS += -L$$DESTDIR -lqalarm -lalarm INCLUDEPATH += ../alarm DEPENDPATH += ../alarm POST_TARGETDEPS += $$DESTDIR/libqalarm.a } HEADERS += appsettings.h \ application.h SOURCES += main.cpp \ application.cpp \ appsettings.cpp RESOURCES += ../icons.qrc \ ../db.qrc \ ../../data/data.qrc # instalation related PREFIX = /usr/bin INSTALLS = target target.path = $$PREFIX confclerk-0.6.4/src/app/appsettings.h0000664000175000017500000000346113212517317017052 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef APPSETTINGS_H #define APPSETTINGS_H #include #include #include class AppSettings { private: AppSettings() {} static QSettings mSettings; public: static bool contains(const QString &aKey); static QString proxyAddress(); static quint16 proxyPort(); static QNetworkProxy::ProxyType proxyType(); static QString proxyUsername(); static QString proxyPassword(); static bool isDirectConnection(); static void setProxyAddress(const QString &aAddress); static void setProxyPort(const quint16 aPort); static void setProxyType(QNetworkProxy::ProxyType aProxyType); static void setProxyUsername(const QString &aUsername); static void setProxyPassword(const QString &aPassword); static void setDirectConnection(bool aDirectConnection); static int preEventAlarmSec() {return 60*15;} ///< seconds that alarm should ring before an event starts }; #endif /* APPSETTINGS_H */ confclerk-0.6.4/src/app/main.cpp0000664000175000017500000000323413212517317015766 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "mainwindow.h" #include "sqlengine.h" #include "eventdialog.h" #include "application.h" int main(int argc, char *argv[]) { Q_INIT_RESOURCE(icons); Q_INIT_RESOURCE(db); Q_INIT_RESOURCE(data); Application a(argc, argv); Application::setWindowIcon(QIcon(":/confclerk.svg")); // needed by QDesktopServices QCoreApplication::setOrganizationName("Toastfreeware"); QCoreApplication::setApplicationName("ConfClerk"); QCoreApplication::setApplicationVersion(VERSION); MainWindow window; // If we were started with the parameters confernceid and eventid, show the corresponding event (alarm) if (argc >= 3) { QString conferenceIdStr = argv[1]; QString eventIdStr = argv[2]; EventDialog dialog(conferenceIdStr.toInt(), eventIdStr.toInt(), &window); dialog.exec(); } window.show(); return a.exec(); } confclerk-0.6.4/src/app/application.cpp0000664000175000017500000000374413212517317017353 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #if defined(__GNUC__) || defined(__llvm__) || defined(__clang__) #include #endif #include #include "application.h" #include "errormessage.h" #include "ormrecord.h" // if the application uses exceptions, // there is always a possibility that some will leak uncached from event handler // crashing the application is too big punishment for it bool Application::notify(QObject* receiver, QEvent* event) { try { return QApplication::notify(receiver, event); } catch (OrmException& e) { error_message("UNCAUGHT OrmException: " + e.text()); return false; } catch (std::exception& e) { error_message("UNCAUGHT exception: " + QString(e.what())); return false; } catch (...) { #if defined(__GNUC__) || defined(__llvm__) || defined(__clang__) int status = 0; char *buff = __cxxabiv1::__cxa_demangle( __cxxabiv1::__cxa_current_exception_type()->name(), NULL, NULL, &status); QString exception_name = QString(buff); std::free(buff); #else QString exception_name = QString("unknown"); #endif error_message("UNCAUGHT exception: " + exception_name); return false; } } confclerk-0.6.4/src/app/application.h0000664000175000017500000000212413212517317017007 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef APPLICATION_H #define APPLICATION_H #include class Application : public QApplication { Q_OBJECT public: Application(int& argc, char** argv) : QApplication(argc, argv) { } virtual ~Application() { } virtual bool notify(QObject* receiver, QEvent* event); }; #endif confclerk-0.6.4/src/app/appsettings.cpp0000664000175000017500000000541313212517317017404 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "appsettings.h" const QString PROXY_ADDRESS_SETTING ("proxyAddress"); const QString PROXY_PORT_SETTING ("proxyPort"); const QString PROXY_TYPE_SETTING ("proxyType"); const QString PROXY_USERNAME_SETTING ("proxyUsername"); const QString PROXY_PASSWORD_SETTING ("proxyPassword"); const QString PROXY_ISDIRECT_SETTING ("proxyIsDirectConnection"); QSettings AppSettings::mSettings("Toastfreeware", "ConfClerk"); QString AppSettings::proxyAddress() { return mSettings.value(PROXY_ADDRESS_SETTING).toString(); } quint16 AppSettings::proxyPort() { return mSettings.value(PROXY_PORT_SETTING).toUInt(); } QNetworkProxy::ProxyType AppSettings::proxyType() { bool ok; int proxyType = mSettings.value(PROXY_TYPE_SETTING).toInt(&ok); if (!ok || proxyType < 0 || proxyType > 5) return QNetworkProxy::DefaultProxy; return QNetworkProxy::ProxyType(proxyType); } QString AppSettings::proxyUsername() { return mSettings.value(PROXY_USERNAME_SETTING).toString(); } QString AppSettings::proxyPassword() { return mSettings.value(PROXY_PASSWORD_SETTING).toString(); } bool AppSettings::isDirectConnection() { return mSettings.value(PROXY_ISDIRECT_SETTING).toBool(); } void AppSettings::setProxyAddress(const QString &aAddress) { mSettings.setValue(PROXY_ADDRESS_SETTING, aAddress); } void AppSettings::setProxyPort(const quint16 aPort) { mSettings.setValue(PROXY_PORT_SETTING, aPort); } void AppSettings::setProxyType(QNetworkProxy::ProxyType aProxyType) { mSettings.setValue(PROXY_TYPE_SETTING, aProxyType); } void AppSettings::setProxyUsername(const QString &aUsername) { mSettings.setValue(PROXY_USERNAME_SETTING, aUsername); } void AppSettings::setProxyPassword(const QString &aPassword) { mSettings.setValue(PROXY_PASSWORD_SETTING, aPassword); } void AppSettings::setDirectConnection(bool aDirectConnection) { mSettings.setValue(PROXY_ISDIRECT_SETTING, aDirectConnection); } bool AppSettings::contains(const QString &aKey) { return mSettings.contains(aKey); } confclerk-0.6.4/src/test/0000775000175000017500000000000013212517317014533 5ustar gregoagregoaconfclerk-0.6.4/src/test/test.pro0000664000175000017500000000055713212517317016243 0ustar gregoagregoaTEMPLATE = app TARGET = test DESTDIR = ../bin CONFIG += qtestlib console QT += sql # module dependencies LIBS += -L$$DESTDIR -lgui -lmvc INCLUDEPATH += ../gui ../mvc ../orm DEPENDPATH += . ../gui ../mvc ../orm POST_TARGETDEPS += $$DESTDIR/libmvc.a $$DESTDIR/libgui.a $$DESTDIR/liborm.a SOURCES += main.cpp \ mvc/EventTest.cpp HEADERS += \ mvc/EventTest.h confclerk-0.6.4/src/test/main.cpp0000664000175000017500000000173013212517317016164 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include #include "mvc/eventtest.h" int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); EventTest eventTest; QTest::qExec(&eventTest, argc, argv); } confclerk-0.6.4/src/test/mvc/0000775000175000017500000000000013212517317015320 5ustar gregoagregoaconfclerk-0.6.4/src/test/mvc/eventtest.h0000664000175000017500000000213113212517317017507 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef EVENTTEST_H #define EVENTTEST_H #include class EventTest : public QObject { Q_OBJECT private slots: void initTestCase(); void getById(); void getByDate(); void storingValues(); void hydrate(); void columnsForSelect(); void selectQuery(); }; #endif // EVENTTEST_H confclerk-0.6.4/src/test/mvc/eventtest.cpp0000664000175000017500000000602513212517317020050 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "eventtest.h" #include #include #include #include "event.h" void EventTest::initTestCase() { // Connect to the test database. Ask Mr. Pavelka to generate one for you :) QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("ConfClerk-test.sqlite"); QVERIFY(db.open()); } void EventTest::getById() { Event event = Event::getById(500, 1); QCOMPARE(event.id(), 500); QCOMPARE(event.start(), QDateTime(QDate(2009, 2, 7), QTime(11, 30, 0), Qt::UTC)); QCOMPARE(event.trackId(), 123); // !!! TODO: typeId and languageId QCOMPARE(event.type(), QString("Podium")); QCOMPARE(event.language(), QString("English")); } void EventTest::getByDate() { QCOMPARE(Event::getByDate(QDate(2009, 2, 7), 1).count(), 127); QCOMPARE(Event::getByDate(QDate(2009, 2, 8), 1).count(), 154); } void EventTest::storingValues() { Event event; event.setId(10); event.setConferenceId(20); event.setStart(QDateTime::fromString("Sat Feb 7 11:30:00 2009")); event.setDuration(30); event.setTrackId(40); event.setType(QString("type")); event.setLanguage(QString("language")); QCOMPARE(event.id(), 10); QCOMPARE(event.conferenceId(), 20); QCOMPARE(event.start(), QDateTime::fromString("Sat Feb 7 11:30:00 2009")); QCOMPARE(event.duration(), 30); QCOMPARE(event.trackId(), 40); QCOMPARE(event.type(), QString("type")); QCOMPARE(event.language(), QString("language")); } void EventTest::hydrate() { QSqlRecord record; record.append(QSqlField("duration", QVariant::Int)); record.append(QSqlField("id", QVariant::Int)); record.setValue(0, 10); record.setValue(1, 20); Event event = Event::hydrate(record); QCOMPARE(event.id(), 20); QCOMPARE(event.duration(), 10); } void EventTest::columnsForSelect() { QCOMPARE(Event::columnsForSelect(), QString("id,xid_conference,start,duration,xid_track,type,language")); QCOMPARE(Event::columnsForSelect("t0"), QString("t0.id,t0.xid_conference,t0.start,t0.duration,t0.xid_track,t0.type,t0.language")); } void EventTest::selectQuery() { QCOMPARE(Event::selectQuery(), QString("SELECT id,xid_conference,start,duration,xid_track,type,language FROM event ")); } confclerk-0.6.4/src/alarm/0000775000175000017500000000000013212517317014650 5ustar gregoagregoaconfclerk-0.6.4/src/alarm/alarm.cpp0000664000175000017500000000746413212517317016463 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "alarm.h" #include #include #include #include int Alarm::addAlarm(int conferenceId, int eventId, QString eventTitle, const QDateTime &alarmDateTime) { cookie_t alarmCookie = 0; alarm_event_t *alarmEvent = 0; alarm_action_t *alarmAction = 0; /* Create alarm event structure and set application identifier */ alarmEvent = alarm_event_create(); alarm_event_set_alarm_appid(alarmEvent, APPID); // message alarm_event_set_title(alarmEvent, "ConfClerk"); alarm_event_set_message(alarmEvent, eventTitle.toLocal8Bit().data()); // for deleting purposes alarm_event_set_attr_int(alarmEvent, "conferenceId", conferenceId); alarm_event_set_attr_int(alarmEvent, "eventId", eventId); /* Use absolute time triggering */ QDateTime local(alarmDateTime); local.setTimeSpec(Qt::LocalTime); alarmEvent->alarm_time = local.toTime_t(); alarmEvent->flags = ALARM_EVENT_BOOT; /* Add exec command action */ alarmAction = alarm_event_add_actions(alarmEvent, 1); alarm_action_set_label(alarmAction, "ConfClerk"); QString command = QFileInfo(*qApp->argv()).absoluteFilePath() + QString(" %1 %2").arg(conferenceId).arg(eventId); alarm_action_set_exec_command(alarmAction, command.toLocal8Bit().data()); alarmAction->flags |= ALARM_ACTION_TYPE_EXEC; alarmAction->flags |= ALARM_ACTION_WHEN_RESPONDED; alarmAction->flags |= ALARM_ACTION_EXEC_ADD_COOKIE; // adds assigned cookie at the end of command string /* Add stop button action */ alarmAction = alarm_event_add_actions(alarmEvent, 1); alarm_action_set_label(alarmAction, "Stop"); alarmAction->flags |= ALARM_ACTION_WHEN_RESPONDED; alarmAction->flags |= ALARM_ACTION_TYPE_NOP; /* Add snooze button action */ alarmAction = alarm_event_add_actions(alarmEvent, 1); alarm_action_set_label(alarmAction, "Snooze"); alarmAction->flags |= ALARM_ACTION_WHEN_RESPONDED; alarmAction->flags |= ALARM_ACTION_TYPE_SNOOZE; /* Send the alarm to alarmd */ alarmCookie = alarmd_event_add(alarmEvent); /* Free all dynamic memory associated with the alarm event */ alarm_event_delete(alarmEvent); return alarmCookie; } void Alarm::deleteAlarm(int conferenceId, int eventId) { cookie_t *alarmList = 0; cookie_t alarmCookie = 0; alarm_event_t *alarmEvent = 0; // query the APPID's list of alarms if( (alarmList = alarmd_event_query(0,0, 0,0, APPID)) != 0) { // query OK for (int i = 0; (alarmCookie = alarmList[i]) != 0; ++i ) { // get the event for specified alarm cookie (alarmId) alarmEvent = alarmd_event_get(alarmCookie); Q_ASSERT(alarmEvent); bool found = (conferenceId == alarm_event_get_attr_int(alarmEvent, "conferenceId", -1) && eventId == alarm_event_get_attr_int(alarmEvent, "eventId", -1)); if (found) alarmd_event_del(alarmCookie); // delete cookie alarm_event_delete(alarmEvent); if (found) break; } } free(alarmList); } confclerk-0.6.4/src/alarm/alarm.h0000664000175000017500000000231413212517317016115 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef ALARM_H #define ALARM_H #include #include extern "C" { #include "alarmd/libalarm.h" } #define APPID "confclerk-alarm" class Alarm : public QObject { Q_OBJECT public: Alarm() {} ~Alarm() {} int addAlarm(int conferenceId, int eventId, QString eventTitle, const QDateTime& alarmDateTime); void deleteAlarm(int conferenceId, int eventId); }; #endif /* ALARM_H */ confclerk-0.6.4/src/alarm/alarm.pro0000664000175000017500000000042113212517317016463 0ustar gregoagregoaTEMPLATE = lib TARGET = qalarm DESTDIR = ../bin CONFIG += static QT += sql QMAKE_CLEAN += ../bin/libqalarm.a # module dependencies LIBS += -lalarm DEPENDPATH += . HEADERS += alarm.h \ SOURCES += alarm.cpp \ INCLUDEPATH += ../gui \ ../mvc \ ../orm \ ../sql confclerk-0.6.4/src/dbschema001.sql0000664000175000017500000000532213212517317016266 0ustar gregoagregoaBEGIN TRANSACTION; CREATE TABLE conference ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, title VARCHAR NOT NULL, subtitle VARCHAR, venue VARCHAR, city VARCHAR, start INTEGER NOT NULL, -- timezone-less timestamp (Unix Epoch) end INTEGER NOT NULL, -- timezone-less timestamp (Unix Epoch) day_change INTEGER, timeslot_duration INTEGER, active INTEGER DEFAULT 0, url VARCHAR ); CREATE TABLE track ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, xid_conference INTEGER NOT NULL REFERENCES conference(id), name VARCHAR NOT NULL, UNIQUE (xid_conference, name) ); CREATE TABLE room ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, xid_conference INTEGER NOT NULL REFERENCES conference(id), name VARCHAR NOT NULL, picture VARCHAR, UNIQUE (xid_conference, name) ); CREATE TABLE person ( id INTEGER NOT NULL, xid_conference INTEGER NOT NULL REFERENCES conference(id), name VARCHAR NOT NULL, PRIMARY KEY (id, xid_conference) ); CREATE TABLE event ( xid_conference INTEGER NOT NULL REFERENCES conference(id), id INTEGER NOT NULL, start INTEGER NOT NULL, -- timezone-less timestamp (Unix Epoch) duration INTEGER NOT NULL, -- duration of the event in seconds xid_track INTEGER NOT NULL REFERENCES track(id), type VARCHAR, language VARCHAR, tag VARCHAR, title VARCHAR NOT NULL, subtitle VARCHAR, abstract VARCHAR, description VARCHAR, favourite INTEGER DEFAULT 0, -- 0 ... no favourite, 1 ... strong favourite, 2 ... weak favourite/alternative to strong favourite alarm INTEGER DEFAULT 0, PRIMARY KEY (xid_conference, id) ); CREATE TABLE event_person ( xid_conference INTEGER NOT NULL, xid_event INTEGER NOT NULL, xid_person INTEGER NOT NULL, UNIQUE (xid_conference, xid_event, xid_person ) ON CONFLICT REPLACE, FOREIGN KEY(xid_conference) REFERENCES conference(id), FOREIGN KEY(xid_conference, xid_event) REFERENCES event(xid_conference, id), FOREIGN KEY(xid_conference, xid_person) REFERENCES person(xid_conference, id) ); CREATE TABLE event_room ( xid_conference INTEGER NOT NULL, xid_event INTEGER NOT NULL, xid_room INTEGER NOT NULL, UNIQUE (xid_conference, xid_event, xid_room) ON CONFLICT REPLACE, FOREIGN KEY(xid_conference) REFERENCES conference(id), FOREIGN KEY(xid_conference, xid_event) REFERENCES event(xid_conference, id), FOREIGN KEY(xid_conference, xid_room) REFERENCES room(xid_conference, id) ); CREATE TABLE link ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, xid_conference INTEGER NOT NULL, xid_event INTEGER NOT NULL, name VARCHAR, url VARCHAR NOT NULL, UNIQUE (xid_conference, xid_event , url) ON CONFLICT REPLACE, FOREIGN KEY(xid_conference) REFERENCES conference(id), FOREIGN KEY(xid_conference, xid_event) REFERENCES event(xid_conference, id) ); PRAGMA user_version=1; COMMIT; confclerk-0.6.4/src/dbschema000to001.sql0000664000175000017500000000705613212517317017057 0ustar gregoagregoaBEGIN TRANSACTION; ALTER TABLE conference RENAME TO conference_old; ALTER TABLE track RENAME TO track_old; ALTER TABLE room RENAME TO room_old; ALTER TABLE person RENAME TO person_old; ALTER TABLE event RENAME TO event_old; ALTER TABLE event_person RENAME TO event_person_old; ALTER TABLE event_room RENAME TO event_room_old; ALTER TABLE link RENAME TO link_old; CREATE TABLE conference ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, title VARCHAR NOT NULL, subtitle VARCHAR, venue VARCHAR, city VARCHAR, start INTEGER NOT NULL, -- timezone-less timestamp (Unix Epoch) end INTEGER NOT NULL, -- timezone-less timestamp (Unix Epoch) day_change INTEGER, timeslot_duration INTEGER, active INTEGER DEFAULT 0, url VARCHAR ); CREATE TABLE track ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, xid_conference INTEGER NOT NULL REFERENCES conference(id), name VARCHAR NOT NULL, UNIQUE (xid_conference, name) ); CREATE TABLE room ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, xid_conference INTEGER NOT NULL REFERENCES conference(id), name VARCHAR NOT NULL, picture VARCHAR, UNIQUE (xid_conference, name) ); CREATE TABLE person ( id INTEGER NOT NULL, xid_conference INTEGER NOT NULL REFERENCES conference(id), name VARCHAR NOT NULL, PRIMARY KEY (id, xid_conference) ); CREATE TABLE event ( xid_conference INTEGER NOT NULL REFERENCES conference(id), id INTEGER NOT NULL, start INTEGER NOT NULL, duration INTEGER NOT NULL, -- duration of the event in seconds xid_track INTEGER NOT NULL REFERENCES track(id), type VARCHAR, language VARCHAR, tag VARCHAR, title VARCHAR NOT NULL, subtitle VARCHAR, abstract VARCHAR, description VARCHAR, favourite INTEGER DEFAULT 0, alarm INTEGER DEFAULT 0, PRIMARY KEY (xid_conference, id) ); CREATE TABLE event_person ( xid_conference INTEGER NOT NULL, xid_event INTEGER NOT NULL, xid_person INTEGER NOT NULL, UNIQUE (xid_conference, xid_event, xid_person ) ON CONFLICT REPLACE, FOREIGN KEY(xid_conference) REFERENCES conference(id), FOREIGN KEY(xid_conference, xid_event) REFERENCES event(xid_conference, id), FOREIGN KEY(xid_conference, xid_person) REFERENCES person(xid_conference, id) ); CREATE TABLE event_room ( xid_conference INTEGER NOT NULL, xid_event INTEGER NOT NULL, xid_room INTEGER NOT NULL, UNIQUE (xid_conference, xid_event, xid_room) ON CONFLICT REPLACE, FOREIGN KEY(xid_conference) REFERENCES conference(id), FOREIGN KEY(xid_conference, xid_event) REFERENCES event(xid_conference, id), FOREIGN KEY(xid_conference, xid_room) REFERENCES room(xid_conference, id) ); CREATE TABLE link ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, xid_conference INTEGER NOT NULL, xid_event INTEGER NOT NULL, name VARCHAR, url VARCHAR NOT NULL, UNIQUE (xid_conference, xid_event , url) ON CONFLICT REPLACE, FOREIGN KEY(xid_conference) REFERENCES conference(id), FOREIGN KEY(xid_conference, xid_event) REFERENCES event(xid_conference, id) ); INSERT INTO conference SELECT id, title, subtitle, venue, city, start, end, day_change, timeslot_duration, active, url FROM conference_old; INSERT INTO track SELECT * FROM track_old; INSERT INTO room SELECT * FROM room_old; INSERT INTO person SELECT * FROM person_old; INSERT INTO event SELECT * FROM event_old; INSERT INTO event_person SELECT * FROM event_person_old; INSERT INTO event_room SELECT * FROM event_room_old; INSERT INTO link SELECT * FROM link_old; DROP TABLE conference_old; DROP TABLE track_old; DROP TABLE room_old; DROP TABLE person_old; DROP TABLE event_old; DROP TABLE event_person_old; DROP TABLE event_room_old; DROP TABLE link_old; PRAGMA user_version=1; COMMIT; confclerk-0.6.4/src/mvc/0000775000175000017500000000000013212517317014341 5ustar gregoagregoaconfclerk-0.6.4/src/mvc/delegate.h0000664000175000017500000000773713212517317016302 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef DELEGATE_H #define DELEGATE_H #include "qglobal.h" #if QT_VERSION >= 0x050000 #include #else #include #endif class Delegate : public QItemDelegate { Q_OBJECT public: enum ControlId { ControlNone = 0, FavouriteControlStrong, FavouriteControlWeak, FavouriteControlNo, AlarmControlOn, AlarmControlOff, WarningControl }; class Control { public: Control(ControlId aControlId, const QString &aImageName, const Control* prev_control); inline QImage *image() const { return mImage; } inline void setDrawPoint(const QPoint &aPoint) { mDrawPoint = aPoint; } inline QRect drawRect(const QRect &aRect) const // helper for determining if Control was clicked { return QRect(drawPoint(aRect), drawPoint(aRect)+QPoint(mImage->size().width(),mImage->size().height())); } void paint(QPainter* painter, const QRect rect); bool enabled() const { return mEnabled; } void setEnabled(bool v) { mEnabled = v; } private: inline QPoint drawPoint(const QRect &aRect = QRect()) const // for painter to draw Control { if(aRect == QRect()) // null rectangle return mDrawPoint; // returns relative drawing point else return QPoint(aRect.x()+aRect.width(),aRect.y()) + mDrawPoint; // returns absolute drawing point } ControlId mId; QImage *mImage; QPoint mDrawPoint; // relative 'start-drawing' position (may hold negative values) bool mEnabled; }; Delegate(QTreeView *aParent); // the delegate 'owner' has to be specified in the constructor - it's used to obtain visualRect of selected item/index ~Delegate(); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; // Delegate::ControlId whichControlClicked(const QModelIndex &aIndex, const QPoint &aPoint) const; bool isPointFromRect(const QPoint &aPoint, const QRect &aRect) const; private: bool hasParent( const QModelIndex &index ) const; bool isLast( const QModelIndex &index ) const; bool isExpanded( const QModelIndex &index ) const; void defineControls(); // TODO: the better place for these methods would be 'eventmodel' // they are used in 'paint' method and so it's better to obtain number of // favourities/alarms once when the data has changed and not to call // these methods which iterate over all Events in corresponding group // every time it requires them int numberOfFavourities(const QModelIndex &index) const; int numberOfAlarms(const QModelIndex &index) const; private: QPointer mViewPtr; QMap mControls; }; #endif /* DELEGATE_H */ confclerk-0.6.4/src/mvc/treeview.cpp0000664000175000017500000001213513212517317016701 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include #include "treeview.h" #include "delegate.h" #include "event.h" #include "conference.h" #include "eventmodel.h" #ifdef MAEMO #include "alarm.h" #include "appsettings.h" #endif #include TreeView::TreeView(QWidget *aParent) : QTreeView(aParent) { connect(this, SIGNAL(clicked(QModelIndex)), SLOT(handleItemClicked(QModelIndex))); } void TreeView::mouseReleaseEvent(QMouseEvent *aEvent) { QModelIndex index = currentIndex(); QPoint point = aEvent->pos(); // test whether we have handled the mouse event if(!testForControlClicked(index, point, aEvent->button())) { // pass the event to the Base class, so item clicks/events are handled correctly QTreeView::mouseReleaseEvent(aEvent); } } // returns bool if some Control was clicked bool TreeView::testForControlClicked(const QModelIndex &aIndex, const QPoint &aPoint, Qt::MouseButton button) { bool handled = false; if(!aIndex.isValid()) return handled; int confId = Conference::activeConference(); // QRect rect = visualRect(aIndex); // visual QRect of selected/clicked item in the list Delegate *delegate = static_cast(itemDelegate(aIndex)); switch(delegate->whichControlClicked(aIndex,aPoint)) { case Delegate::FavouriteControlStrong: case Delegate::FavouriteControlWeak: case Delegate::FavouriteControlNo: { // handle Favourite Control clicked Event event = Event::getById(aIndex.data().toInt(),confId); QList conflicts = Event::conflictEvents(event.id(),Conference::activeConference()); event.cycleFavourite(button == Qt::RightButton); event.update("favourite"); // event has became 'favourite' and so 'conflicts' list may have changed conflicts = Event::conflictEvents(event.id(),Conference::activeConference()); // have to emit 'eventChanged' signal on all events in conflict for(int i=0; irowCount(QModelIndex()); i++) { setExpanded(model()->index(i,0,QModelIndex()),aExpanded); } } confclerk-0.6.4/src/mvc/event.h0000664000175000017500000001072213212517317015635 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef EVENT_H #define EVENT_H #include #include #include #include "ormrecord.h" class Room; /** NoSuchEventException is thrown when required event does not exist. */ class NoSuchEventException { }; enum Favourite {Favourite_no=0, Favourite_weak=2, Favourite_strong=1}; class Event : public OrmRecord { public: Event(); static const QSqlRecord sColumns; static QString const sTableName; public: static Event getById(int id, int conferenceId); static QList getByDate(const QDate & date, int conferenceId, QString orderBy); static QList getFavByDate(const QDate & date, int conferenceId); // get Favourities by Date static QList getSearchResultByDate(const QDate& date, int conferenceId, QString orderBy); static QList getByTrack(int id); static QList getByDateAndRoom(const QDate& date, int conferenceId); static QList conflictEvents(int aEventId, int conferenceId); static QList getImminentAlarmEvents(int maxSecToAlarm, int conferenceId); public: int id() const { return value("id").toInt(); } int conferenceId() const { return value("xid_conference").toInt(); } QDateTime start() const { return value("start").toDateTime(); } /// duration of the event in seconds int duration() const { return value("duration").toInt(); } int trackId() const { return value("xid_track").toInt(); } QString type() const { return value("type").toString(); } QString language() const { return value("language").toString(); } Favourite favourite() const { return static_cast(value("favourite").toInt()); } bool hasAlarm() const { return value("alarm").toBool(); } Favourite timeConflict() const; QString tag() const { return value("tag").toString(); } QString title() const { return value("title").toString(); } QString subtitle() const { return value("subtitle").toString(); } QString abstract() const { return value("abstract").toString(); } QString description() const { return value("description").toString(); } // records from other tables associated with 'id' Room* room(); QString roomName(); int roomId(); QStringList persons(); QMap links(); void setId(int id) { setValue("id", id); } void setConferenceId(int conferenceId) { setValue("xid_conference", conferenceId); } void setStart(const QDateTime & start) { setValue("start", start); } void setDuration(int duration) { setValue("duration", duration); } void setTrackId(int trackId) { setValue("xid_track", trackId); } void setType(const QString & type) { setValue("type", type); } void setLanguage(const QString & language) { setValue("language", language); } void setFavourite(Favourite favourite) { setValue("favourite", (int) favourite); } void cycleFavourite(bool back = false); void setHasAlarm(bool alarm) { setValue("alarm", (int)((alarm))); } void setTag(const QString& tag) { setValue("tag", tag); } void setTitle(const QString& title) { setValue("title", title); } void setSubtitle(const QString& subtitle) { setValue("subtitle", subtitle); } void setAbstract(const QString& abstract) { setValue("abstract", abstract); } void setDescription(const QString& description) { setValue("description", description); } // records from other tables associated with 'id' void setRoom(const QString& room); void setPersons(const QStringList &persons); void setLinks(const QMap &aLinks); friend class EventTest; private: QStringList mPersonsList; QMap mLinksList; int mRoomId; QString mRoomName; Room* room_; }; #endif // EVENT_H confclerk-0.6.4/src/mvc/eventmodel.cpp0000664000175000017500000002254413212517317017216 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "eventmodel.h" #include "conference.h" #include "track.h" #include "room.h" const QString EventModel::COMMA_SEPARATOR = ", "; EventModel::EventModel() { } void EventModel::Group::setTitle(const QList& mEvents) { QDateTime startTime = mEvents.at(mFirstEventIndex).start(); QDateTime endTime(startTime); for (int i = mFirstEventIndex; i != mFirstEventIndex + mChildCount; ++i) { endTime = qMax(mEvents.at(i).start().addSecs(mEvents.at(i).duration()), endTime); } mTitle = QString("%1 - %2").arg(startTime.toString("HH:mm")).arg(endTime.toString("HH:mm")); } // We want to group the events into "time slots/time groups" that // should start at full hours and have the duration of either // one hour or (if less than 3 events are in one time slot) // multiple of one hour. void EventModel::createTimeGroups() { beginResetModel(); mGroups.clear(); mParents.clear(); if (mEvents.empty()) return; const int minTimeSpan = 3600; // one hour // minimum duration of a group in seconds const int minChildCount = 3; // minimum number of events in one group QDateTime groupStartDateTime(mEvents.first().start().date(), QTime(mEvents.first().start().time().hour(), 0), mEvents.first().start().timeSpec()); QDateTime groupEndDateTime = groupStartDateTime.addSecs(mEvents.first().duration()); mGroups << EventModel::Group("", 0); int timeSpan = minTimeSpan; for (int i = 0; i != mEvents.count(); ++i) { QDateTime eventStartDateTime = mEvents.at(i).start(); QDateTime eventEndDateTime = eventStartDateTime.addSecs(mEvents.at(i).duration()); if (eventStartDateTime >= groupStartDateTime.addSecs(timeSpan)) { // a new group could be necessary if (mGroups.last().mChildCount < minChildCount) { // too few events in the group => no new group // except a gap in time would occur that is longer than minTimeSpan QDateTime prevEventStartDateTime = mEvents.at(i).start(); if (i > 0 && qMax(prevEventStartDateTime.addSecs(mEvents.at(i-1).duration()), groupEndDateTime).secsTo(eventStartDateTime) < minTimeSpan) { timeSpan += minTimeSpan; --i; continue; // repeat with the same event } } // a new group is necessary mGroups.last().setTitle(mEvents); groupStartDateTime = groupStartDateTime.addSecs(timeSpan); groupEndDateTime = groupStartDateTime.addSecs(mEvents.at(i).duration()); mGroups << EventModel::Group("", i); timeSpan = minTimeSpan; } // insert event into current group mParents[mEvents.at(i).id()] = mGroups.count() - 1; mGroups.last().mChildCount += 1; groupEndDateTime = qMax(eventEndDateTime, groupEndDateTime); } // the last group needs a title as well mGroups.last().setTitle(mEvents); endResetModel(); } void EventModel::createTrackGroups() { mGroups.clear(); mParents.clear(); if (mEvents.empty()) { return; } int trackId = mEvents.first().trackId(); mGroups << EventModel::Group(Track::retrieveTrackName(trackId), 0); int nextTrackId = trackId; for (int i=0; i::iterator event = mEvents.begin(); int i = 0; while (event != mEvents.end()) { roomId = event->roomId(); if (nextRoomId != roomId) { mGroups.last().mChildCount = i - mGroups.last().mFirstEventIndex; mGroups << EventModel::Group(Room::retrieveRoomName(roomId), i); nextRoomId = roomId; } mParents[event->id()] = mGroups.count() - 1; event++; i++; } mGroups.last().mChildCount = mEvents.count() - mGroups.last().mFirstEventIndex; } QVariant EventModel::data(const QModelIndex& index, int role) const { if (index.isValid() && role == Qt::DisplayRole) { if (index.internalId() == 0) { return mGroups.at(index.row()).mTitle; } else //event data { return static_cast(index.internalPointer())->id(); } } return QVariant(); } QModelIndex EventModel::index(int row, int column, const QModelIndex& parent) const { // TODO: add checks for out of range rows if (!parent.isValid()) { return createIndex(row, column); } else if (parent.internalId() == 0) { const Group& group = mGroups.at(parent.row()); Event* event = const_cast(&mEvents.at(row + group.mFirstEventIndex)); return createIndex(row, column, reinterpret_cast(event)); } else { return QModelIndex(); } } QModelIndex EventModel::parent(const QModelIndex & index) const { if (index.isValid()) { if (index.internalId() == 0) { return QModelIndex(); } Event * event = static_cast(index.internalPointer()); return createIndex(mParents[event->id()], 0); } return QModelIndex(); } int EventModel::columnCount(const QModelIndex & parent) const { Q_UNUSED(parent); return 1; } int EventModel::rowCount (const QModelIndex & parent) const { if (!parent.isValid()) { return mGroups.count(); } if (parent.internalId() == 0) { return mGroups.at(parent.row()).mChildCount; } return 0; } void EventModel::clearModel() { beginResetModel(); mGroups.clear(); mEvents.clear(); mParents.clear(); endResetModel(); } void EventModel::loadEvents(const QDate &aDate, int aConferenceId) { clearModel(); mEvents = Event::getByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId, "start, duration"); createTimeGroups(); } void EventModel::loadFavEvents(const QDate &aDate, int aConferenceId) { clearModel(); mEvents = Event::getFavByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId); createTimeGroups(); } int EventModel::loadSearchResultEvents(const QDate &aDate, int aConferenceId) { clearModel(); try { mEvents = Event::getSearchResultByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId, "start, duration"); } catch( OrmException &e ){ qDebug() << "Event::getSearchResultByDate failed: " << e.text(); } catch(...){ qDebug() << "Event::getSearchResultByDate failed"; } createTimeGroups(); return mEvents.count(); } void EventModel::loadEventsByTrack(const QDate &aDate, int aConferenceId) { clearModel(); mEvents = Event::getByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId, "xid_track, start, duration"); createTrackGroups(); } void EventModel::loadEventsByRoom(const QDate &aDate, int aConferenceId) { clearModel(); mEvents = Event::getByDateAndRoom(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId); createRoomGroups(); } void EventModel::loadConflictEvents(int aEventId, int aConferenceId) { clearModel(); mEvents = Event::conflictEvents(aEventId, aConferenceId); createTimeGroups(); } void EventModel::updateModel(int aEventId) { for(int i=0; i(eventIndex.internalPointer())->id() == aEventId) { emit(dataChanged(groupIndex,groupIndex)); emit(dataChanged(eventIndex,eventIndex)); } } } } confclerk-0.6.4/src/mvc/room.h0000664000175000017500000000271413212517317015472 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef ROOM_H_ #define ROOM_H_ #include "ormrecord.h" class Room : public OrmRecord { public: static const QSqlRecord sColumns; static QString const sTableName; static const int sTableColCount; static const QString NAME; public: int id() const { return value("id").toInt(); } void setId(int id) { setValue("id", id); } QString name() const { return value("name").toString(); } void setName(const QString & type) { setValue("name", type); } int insert(); public: static QList getAll(); static Room retrieve(int id); static QString retrieveRoomName(int id); static Room retrieveByName(QString name); }; #endif /* ROOM_H_ */ confclerk-0.6.4/src/mvc/mvc.pro0000664000175000017500000000143513212517317015653 0ustar gregoagregoainclude(../global.pri) TEMPLATE = lib TARGET = mvc DESTDIR = ../bin CONFIG += static QT += sql greaterThan(QT_MAJOR_VERSION, 4): QT += widgets QMAKE_CLEAN += ../bin/libmvc.a # module dependencies LIBS += -L$$DESTDIR \ -lorm INCLUDEPATH += ../orm ../app DEPENDPATH += . \ ../orm POST_TARGETDEPS += $$DESTDIR/liborm.a maemo { LIBS += -L$$DESTDIR \ -lqalarm \ -lalarm INCLUDEPATH += ../alarm DEPENDPATH += ../alarm POST_TARGETDEPS += $$DESTDIR/libqalarm.a } HEADERS += event.h \ conference.h \ track.h \ delegate.h \ eventmodel.h \ treeview.h \ room.h \ conferencemodel.h SOURCES += event.cpp \ conference.cpp \ track.cpp \ delegate.cpp \ eventmodel.cpp \ treeview.cpp \ room.cpp \ conferencemodel.cpp confclerk-0.6.4/src/mvc/treeview.h0000664000175000017500000000301313212517317016341 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef TREEVIEW_H #define TREEVIEW_H #include class TreeView : public QTreeView { Q_OBJECT public: TreeView(QWidget *aParent = NULL); ~TreeView() {} private: void mouseReleaseEvent(QMouseEvent *aEvent); bool testForControlClicked(const QModelIndex &aIndex, const QPoint &aPoint, Qt::MouseButton button); public slots: void setAllExpanded(bool aExpanded); // (aExpanded==true) => expanded; (aExpanded==false) => collapsed private slots: void handleItemClicked(const QModelIndex &index); signals: void requestForConflicts(const QModelIndex &aIndex); void eventChanged(int aEventId, bool favouriteChanged); // emited when user changes some event details, eg. sets it Favourite }; #endif /* TREEVIEW_H */ confclerk-0.6.4/src/mvc/eventmodel.h0000664000175000017500000000530413212517317016656 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef EVENTMODEL_H #define EVENTMODEL_H #include #include "event.h" class EventModel : public QAbstractItemModel { public: static const QString COMMA_SEPARATOR; // ", " public: EventModel(); QVariant data(const QModelIndex& index, int role) const; QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const; QModelIndex parent ( const QModelIndex & index ) const; int columnCount ( const QModelIndex & parent = QModelIndex() ) const; int rowCount ( const QModelIndex & parent = QModelIndex() ) const; void loadEvents(const QDate &aDate, int aConferenceId); // loads Events from the DB void loadFavEvents(const QDate &aDate, int aConferenceId); // loads Favourite events from the DB void loadEventsByTrack(const QDate &aDate, int aConferenceId); // loads Events sorted by Track id and Event start from the DB int loadSearchResultEvents(const QDate &aDate, int aConferenceId); void loadEventsByRoom(const QDate &aDate, int aConferenceId); void loadConflictEvents(int aEventId, int aConferenceId); // loads events in conflict void clearModel(); private: struct Group { Group(const QString & title, int firstEventIndex) : mTitle(title), // e.g. "16:00 - 17:30" mFirstEventIndex(firstEventIndex), // first index within mEvents mChildCount(0) // number of events in mEvents {} QString mTitle; int mFirstEventIndex; int mChildCount; void setTitle(const QList& mEvents); }; private: void createTimeGroups(); void createTrackGroups(); void createTrackGroupsNew(); void createRoomGroups(); public slots: void updateModel(int aEventId); private: QList mEvents; QList mGroups; QHash mParents; ///< eventId, groupId }; #endif // EVENTMODEL_H confclerk-0.6.4/src/mvc/delegate.cpp0000664000175000017500000003172113212517317016623 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "delegate.h" #include "eventmodel.h" #include "track.h" #include #include #include "room.h" const int RADIUS = 10; const int SPACER = 10; const double scaleFactor1 = 0.4; const double scaleFactor2 = 0.8; Delegate::Delegate(QTreeView *aParent) : QItemDelegate(aParent) , mViewPtr(aParent) { mControls.clear(); defineControls(); } Delegate::~Delegate() { QListIterator i(mControls.keys()); while (i.hasNext()) { delete mControls[i.next()]->image(); } } void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (!mViewPtr) return; painter->save(); QColor textColor = option.palette.color(QPalette::Text); if(hasParent(index)) { Event *event = static_cast(index.internalPointer()); // determine severity of conflict Favourite eventTimeConflict = event->timeConflict(); // cache value as event->timeConflict is expensive enum ConflictSeverity {csNone, csWeak, csStrong} conflictSeverity = csNone; switch (event->favourite()) { case Favourite_strong: conflictSeverity = (eventTimeConflict == Favourite_strong) ? csStrong : csNone; break; case Favourite_weak: conflictSeverity = (eventTimeConflict == Favourite_no) ? csNone : csWeak; break; case Favourite_no: conflictSeverity = csNone; break; } // entry horizontal layout: // * spacer (aka y position of image) // * image // * rest is text, which is 1 line of title with big letters and 2 lines of Presenter and Track int aux = option.rect.height() - SPACER - mControls[FavouriteControlStrong]->image()->height(); // font SMALL QFont fontSmall = option.font; fontSmall.setBold(false); fontSmall.setPixelSize(aux*0.2); QFontMetrics fmSmall(fontSmall); // font SMALL bold QFont fontSmallB = fontSmall; fontSmallB.setBold(true); // font BIG QFont fontBig = option.font; fontBig.setBold(false); fontBig.setPixelSize(aux*0.33); QFontMetrics fmBig(fontBig); // font BIG bold QFont fontBigB = fontBig; fontBigB.setBold(true); QFontMetrics fmBigB(fontBigB); // background (in case of time conflicts) if (conflictSeverity != csNone) { painter->setBrush(conflictSeverity == csStrong ? Qt::yellow : QColor("lightyellow")); painter->setPen(Qt::NoPen); painter->drawRect(option.rect); } // background (without time conflicts) else { QStyleOption styleOption; styleOption.rect = option.rect; qApp->style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &styleOption, painter, mViewPtr); } // draw Controls foreach(Control* c, mControls.values()) { c->setEnabled(false); } switch (event->favourite()) { case Favourite_strong: mControls[FavouriteControlStrong]->paint(painter, option.rect); break; case Favourite_weak: mControls[FavouriteControlWeak]->paint(painter, option.rect); break; case Favourite_no: mControls[FavouriteControlNo]->paint(painter, option.rect); break; } if(event->hasAlarm()) mControls[AlarmControlOn]->paint(painter, option.rect); else mControls[AlarmControlOff]->paint(painter, option.rect); if(eventTimeConflict != Favourite_no) mControls[WarningControl]->paint(painter, option.rect); // draw texts // it starts just below the image // ("position of text" is lower-left angle of the first letter, // so the first line is actually at the same height as the image) painter->setPen(QPen(conflictSeverity != csNone ? Qt::black : textColor)); QPointF titlePointF(option.rect.x() + SPACER, option.rect.y() + SPACER + mControls[FavouriteControlStrong]->image()->height()); QTime start = event->start().time(); painter->setFont(fontBig); painter->drawText(titlePointF,start.toString("hh:mm") + "-" + start.addSecs(event->duration()).toString("hh:mm") + ", " + event->roomName()); // title titlePointF.setY(titlePointF.y()+fmBig.height()-fmBig.descent()); painter->setFont(fontBigB); QString title = event->title(); if(fmBigB.boundingRect(title).width() > (option.rect.width()-2*SPACER)) // the title won't fit the screen { // chop words from the end while( (fmBigB.boundingRect(title + "...").width() > (option.rect.width()-2*SPACER)) && !title.isEmpty()) { title.chop(1); // chop characters one-by-one from the end while( (!title.at(title.length()-1).isSpace()) && !title.isEmpty()) { title.chop(1); } } title += "..."; } painter->drawText(titlePointF,title); // persons titlePointF.setY(titlePointF.y()+fmSmall.height()-fmSmall.descent()); painter->setFont(fontSmall); QString presenterPrefix = event->persons().count() < 2 ? "Presenter" : "Presenters"; painter->drawText(titlePointF,presenterPrefix + ": " + event->persons().join(" and ")); // track titlePointF.setY(titlePointF.y()+fmSmall.height()-fmSmall.descent()); painter->drawText(titlePointF,"Track: " + Track::retrieveTrackName(event->trackId())); } else // doesn't have parent - time-groups' elements (top items) { int numFav = numberOfFavourities(index); int numAlarm = numberOfAlarms(index); QStyleOptionButton styleOptionButton; styleOptionButton.rect = option.rect; if (isExpanded(index)) styleOptionButton.state = QStyle::State_Sunken; // styleOptionButton.text = qVariantValue(index.data()); qApp->style()->drawPrimitive(QStyle::PE_PanelButtonCommand, &styleOptionButton, painter, mViewPtr); // qApp->style()->drawControl(QStyle::CE_PushButtonLabel, &styleOptionButton, painter, mViewPtr); // qApp->style()->drawPrimitive(QStyle::PE_IndicatorArrowDown, &styleOptionButton, painter, mViewPtr); QFont fontSmall = option.font; fontSmall.setBold(true); fontSmall.setPixelSize(option.rect.height()*scaleFactor1); QFontMetrics fmSmall(fontSmall); QFont fontBig = option.font; fontBig.setBold(true); fontBig.setPixelSize(option.rect.height()*scaleFactor2); QFontMetrics fmBig(fontBig); int spacer = (fmSmall.boundingRect("999").width() < SPACER) ? SPACER : fmSmall.boundingRect("999").width(); // draw icons painter->setPen(QPen(textColor)); painter->setFont(fontSmall); QImage *image = mControls[numFav ? FavouriteControlStrong : FavouriteControlNo]->image(); QPoint drawPoint = option.rect.topRight() - QPoint( spacer + image->width(), - option.rect.height()/2 + image->height()/2); painter->drawImage(drawPoint,*image); painter->drawText(drawPoint+QPoint(image->width()+2, image->height() - 2), QString::number(numFav)); drawPoint.setX(drawPoint.x() - spacer - image->width()); image = mControls[numAlarm ? AlarmControlOn : AlarmControlOff]->image(); painter->drawImage(drawPoint,*image); painter->drawText(drawPoint+QPoint(image->width()+2, image->height() - 2), QString::number(numAlarm)); // draw texts QString numEvents = QString::number(index.model()->rowCount(index)).append("/"); drawPoint.setX(drawPoint.x() - spacer - fmSmall.boundingRect(numEvents).width()); drawPoint.setY(drawPoint.y()+image->height() - 2); painter->drawText(drawPoint,numEvents); QPointF titlePointF = QPoint( option.rect.x()+SPACER, option.rect.y()+option.rect.height()-fmBig.descent()); painter->setFont(fontBig); painter->drawText(titlePointF,index.data().value()); } painter->restore(); } QSize Delegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { Q_UNUSED(option) if (index.internalId() == 0) // time group { return QSize(40,40); } else // event { return QSize(100,100); } } bool Delegate::hasParent( const QModelIndex &index ) const { if( index.parent().isValid() ) return true; else return false; } bool Delegate::isLast( const QModelIndex &index ) const { if(!hasParent(index)) return false; // what should be returned here? if(index.row() >= (index.model()->rowCount(index.parent())-1)) return true; else return false; } bool Delegate::isExpanded( const QModelIndex &index ) const { if( !mViewPtr ) return false; else return mViewPtr->isExpanded( index ); } Delegate::ControlId Delegate::whichControlClicked(const QModelIndex &aIndex, const QPoint &aPoint) const { if(!hasParent(aIndex)) // time-group item (root item) return ControlNone; QListIterator i(mControls.keys()); while (i.hasNext()) { ControlId id = i.next(); Control *control = mControls[id]; if (control->enabled() and control->drawRect(static_cast(parent())->visualRect(aIndex)).contains(aPoint)) { return id; } } return ControlNone; } Delegate::Control::Control(ControlId aControlId, const QString &aImageName, const Control* prev_control) : mId(aControlId) , mImage(new QImage(aImageName)) , mDrawPoint(QPoint(0,0)) , mEnabled(false) { QPoint p; if (prev_control == NULL) { p = QPoint(0, SPACER); } else { p = prev_control->drawPoint(); } p.setX(p.x()-image()->width()-SPACER); setDrawPoint(p); } void Delegate::Control::paint(QPainter* painter, const QRect rect) { painter->drawImage(drawPoint(rect),*image()); setEnabled(true); } void Delegate::defineControls() { // FAVOURITE ICONs // strong mControls.insert(FavouriteControlStrong, new Control(FavouriteControlStrong, QString(":icons/favourite-strong.png"), NULL)); // weak mControls.insert(FavouriteControlWeak, new Control(FavouriteControlWeak, QString(":icons/favourite-weak.png"), NULL)); // no mControls.insert(FavouriteControlNo, new Control(FavouriteControlNo, QString(":icons/favourite-no.png"), NULL)); // ALARM ICONs // on mControls.insert(AlarmControlOn, new Control(AlarmControlOn, QString(":icons/alarm-on.png"), mControls[FavouriteControlStrong])); // off mControls.insert(AlarmControlOff, new Control(AlarmControlOff, QString(":icons/alarm-off.png"), mControls[FavouriteControlNo])); // WARNING ICON mControls.insert(WarningControl, new Control(WarningControl, QString(":icons/dialog-warning.png"), mControls[AlarmControlOff])); } bool Delegate::isPointFromRect(const QPoint &aPoint, const QRect &aRect) const { if( (aPoint.x()>=aRect.left() && aPoint.x()<=aRect.right()) && (aPoint.y()>=aRect.top() && aPoint.y()<=aRect.bottom()) ) return true; return false; } int Delegate::numberOfFavourities(const QModelIndex &index) const { if(index.parent().isValid()) // it's event, not time-group return 0; int nrofFavs = 0; for(int i=0; irowCount(index); i++) if(static_cast(index.child(i,0).internalPointer())->favourite() != Favourite_no) nrofFavs++; return nrofFavs; } int Delegate::numberOfAlarms(const QModelIndex &index) const { if(index.parent().isValid()) // it's event, not time-group return 0; int nrofAlarms = 0; for(int i=0; irowCount(index); i++) if(static_cast(index.child(i,0).internalPointer())->hasAlarm()) nrofAlarms++; return nrofAlarms; } confclerk-0.6.4/src/mvc/room.cpp0000664000175000017500000000331313212517317016021 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "room.h" QString const Room::sTableName = QString("room"); int const Room::sTableColCount = 2; const QString Room::NAME = "name"; QSqlRecord const Room::sColumns = Room::toRecord(QList() << QSqlField("id", QVariant::Int) << QSqlField(NAME, QVariant::String)); Room Room::retrieveByName(QString name) { QSqlQuery query; query.prepare( selectQuery() + QString("WHERE %1.name = :name").arg(sTableName)); query.bindValue(":name", name); return loadOne(query); } QList Room::getAll() { QSqlQuery query; query.prepare(selectQuery()); return load(query); } Room Room::retrieve(int id) { QSqlQuery query; query.prepare(selectQuery() + QString("WHERE %1.id = :id").arg(sTableName)); query.bindValue(":id", id); return loadOne(query); } QString Room::retrieveRoomName(int id) { Room room = retrieve(id); return room.name(); } confclerk-0.6.4/src/mvc/track.h0000664000175000017500000000325613212517317015624 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef TRACK_H_ #define TRACK_H_ #include "ormrecord.h" class Track : public OrmRecord { public: static const QSqlRecord sColumns; static QString const sTableName; static const int sTableColCount; static const QString CONFERENCEID; static const QString NAME; public: int id() const { return value("id").toInt(); } void setId(int id) { setValue("id", id); } int conferenceid() const { return value("xid_conference").toInt(); } void setConference(int conferenceid) { setValue("xid_conference", conferenceid); } QString name() const { return value("name").toString(); } void setName(const QString & type) { setValue("name", type); } int insert(); public: static QList getAll(); static Track retrieve(int id); static QString retrieveTrackName(int id); static Track retrieveByName(int conferenceid, QString name); }; #endif /* TRACK_H_ */ confclerk-0.6.4/src/mvc/track.cpp0000664000175000017500000000535513212517317016161 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "track.h" QString const Track::sTableName = QString("track"); int const Track::sTableColCount = 3; const QString Track::CONFERENCEID = "xid_conference"; const QString Track::NAME = "name"; QSqlRecord const Track::sColumns = Track::toRecord(QList() << QSqlField("id", QVariant::Int) << QSqlField(CONFERENCEID, QVariant::Int) << QSqlField(NAME, QVariant::String)); class TrackInsertException : public OrmSqlException { public: TrackInsertException(const QString& text) : OrmSqlException(text) {} }; int Track::insert() { QSqlQuery query; QString trackname = name(); query.prepare( QString("INSERT INTO %1 (%2, %3) VALUES (:xid_conference, :name)") .arg(sTableName, CONFERENCEID, NAME)); query.bindValue(":xid_conference", conferenceid()); query.bindValue(":name", trackname); if (!query.exec()) { throw TrackInsertException( "Inserting track '" + trackname + "' into database failed: " + query.lastError().text()); } QVariant variant = query.lastInsertId(); if (variant.isValid()) return variant.toInt(); else throw TrackInsertException("Last Insert Id Error"); } Track Track::retrieveByName(int conferenceid, QString name) { QSqlQuery query; query.prepare( selectQuery() + QString("WHERE %1.xid_conference = :xid_conference and %1.name = :name").arg(sTableName)); query.bindValue(":xid_conference", conferenceid); query.bindValue(":name", name); return loadOne(query); } QList Track::getAll() { QSqlQuery query; query.prepare(selectQuery()); return load(query); } Track Track::retrieve(int id) { QSqlQuery query; query.prepare(selectQuery() + QString("WHERE %1.id = :id").arg(sTableName)); query.bindValue(":id", id); return loadOne(query); } QString Track::retrieveTrackName(int id) { Track track = retrieve(id); return track.name(); } confclerk-0.6.4/src/mvc/conference.h0000664000175000017500000000503613212517317016625 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef CONFERENCE_H #define CONFERENCE_H #include #include #include #include "ormrecord.h" class Conference : public OrmRecord { public: static QSqlRecord const sColumns; static QString const sTableName; public: static Conference getById(int id); static QList getAll(); /// Returns the active conference. If no active conference can be found, it returns the conference with the lowest id. /// If no conference exists or database errors occur, it returns -1. static int activeConference(); public: int id() const { return value("id").toInt(); } QString title() const { return value("title").toString(); } QString subtitle() const { return value("subtitle").toString(); } QString venue() const { return value("venue").toString(); } QString city() const { return value("city").toString(); } QDate start() const { return value("start").toDate(); } QDate end() const { return value("end").toDate(); } int dayChange() const { return value("day_change").toInt(); } // in seconds from 00:00 QTime dayChangeTime() const {QTime dayChangeTime(0, 0); return dayChangeTime.addSecs(dayChange());} int timeslotDuration() const { return value("timeslot_duration").toInt(); } // in seconds bool isActive() const { return value("active").toBool(); } QString url() const { return stringFromNullable(value("url")); } void setUrl(const QString& url) { setValue("url", url.isNull() ? QVariant() : url); update("url"); } private: static QString stringFromNullable(const QVariant& v) { if (v.isValid()) { return v.toString(); } else { return QString(); } } }; #endif /* CONFERENCE_H */ confclerk-0.6.4/src/mvc/conferencemodel.h0000664000175000017500000000370013212517317017642 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #ifndef CONFERENCE_MODEL_H #define CONFERENCE_MODEL_H #include #include #include "conference.h" /** ConferenceModel class represents list of conferences for ListViews that may need it. It also provides typed access to the conferences from ConferenceEditor. It does not actually modify anything in DB, this is performed by other classes. \see ConferenceEditor, MainWindow::showConferences() */ class ConferenceModel : public QAbstractListModel { Q_OBJECT public: ConferenceModel(QObject* parent); virtual ~ConferenceModel() { } virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; const Conference& conferenceFromIndex(const QModelIndex&) const; QModelIndex indexFromId(int id) const; public slots: void newConferenceBegin(); void newConferenceEnd(int conferenceId); void conferenceRemoved(); private: // reinitialize list from database void reinit() { beginResetModel(); conferences = Conference::getAll(); endResetModel(); } QList conferences; }; #endif confclerk-0.6.4/src/mvc/event.cpp0000664000175000017500000002411213212517317016166 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "conference.h" #include "event.h" #include "room.h" QString const Event::sTableName = QString("event"); QSqlRecord const Event::sColumns = Event::toRecord(QList() << QSqlField("id", QVariant::Int) << QSqlField("xid_conference", QVariant::Int) << QSqlField("start", QVariant::DateTime) << QSqlField("duration", QVariant::Int) << QSqlField("xid_track", QVariant::Int) << QSqlField("type", QVariant::String) << QSqlField("language", QVariant::String) << QSqlField("favourite", QVariant::Int) << QSqlField("alarm", QVariant::Bool) << QSqlField("tag", QVariant::String) << QSqlField("title", QVariant::String) << QSqlField("subtitle", QVariant::String) << QSqlField("abstract", QVariant::String) << QSqlField("description", QVariant::String)); Event::Event() : room_(NULL) { } Event Event::getById(int id, int conferenceId) { QSqlQuery query; query.prepare(selectQuery() + "WHERE id = :id AND xid_conference = :conf"); query.bindValue(":id", id); query.bindValue(":conf", conferenceId); return loadOne(query); } QList Event::getByDate(const QDate& date, int conferenceId, QString orderBy) { Q_ASSERT(conferenceId > 0); Conference conference = Conference::getById(conferenceId); QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC); QSqlQuery query; query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end ORDER BY %1").arg(orderBy)); query.bindValue(":conf", conferenceId); query.bindValue(":start", dayStart.toTime_t()); query.bindValue(":end", dayStart.addDays(1).toTime_t()); return load(query); } QList Event::getByDateAndRoom(const QDate& date, int conferenceId) { Q_ASSERT(conferenceId > 0); Conference conference = Conference::getById(conferenceId); QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC); QSqlQuery query; QString aliasEvent("E"); QString aliasEventRoom("R"); query.prepare(QString("SELECT %1 FROM %2 %3, %4 %5 WHERE %3.xid_conference = :conf_e AND %5.xid_conference = :conf_r AND %3.start >= :start AND %3.start < :end AND %3.id = %5.xid_event ORDER BY %5.xid_room, %3.start, %3.duration").arg( columnsForSelect(aliasEvent), Event::sTableName, aliasEvent, "EVENT_ROOM", aliasEventRoom)); query.bindValue(":conf_e", conferenceId); query.bindValue(":conf_r", conferenceId); query.bindValue(":start", dayStart.toTime_t()); query.bindValue(":end", dayStart.addDays(1).toTime_t()); return load(query); } QList Event::conflictEvents(int aEventId, int conferenceId) { QSqlQuery query; Event event = Event::getById(aEventId,conferenceId); query.prepare(selectQuery() + "WHERE xid_conference = :conf AND ( \ ( start >= :s1 AND ( start + duration ) < :e1 ) \ OR ( ( start + duration ) > :s2 AND start < :e2 ) ) \ AND favourite >= 1 AND NOT id = :id ORDER BY start, duration"); query.bindValue(":conf", event.conferenceId()); query.bindValue(":s1", convertToDb(event.start(), QVariant::DateTime)); query.bindValue(":e1", convertToDb(event.start().toTime_t()+event.duration(), QVariant::DateTime)); query.bindValue(":s2", convertToDb(event.start(), QVariant::DateTime)); query.bindValue(":e2", convertToDb(event.start().toTime_t()+event.duration(), QVariant::DateTime)); query.bindValue(":id", event.id()); return load(query); } QList Event::getImminentAlarmEvents(int maxSecToAlarm, int conferenceId) { QSqlQuery query; query.prepare(selectQuery() + "WHERE xid_conference = :conf AND (start < :start AND alarm = 1) ORDER BY start, duration"); query.bindValue(":conf", conferenceId); query.bindValue(":start", convertToDb(QDateTime::currentDateTime().addSecs(maxSecToAlarm), QVariant::DateTime)); return load(query); } QList Event::getFavByDate(const QDate& date, int conferenceId) { Q_ASSERT(conferenceId > 0); Conference conference = Conference::getById(conferenceId); QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC); QSqlQuery query; query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end AND favourite >= 1 ORDER BY start, duration")); query.bindValue(":conf", conferenceId); query.bindValue(":start", dayStart.toTime_t()); query.bindValue(":end", dayStart.addDays(1).toTime_t()); return load(query); } Room* Event::room() { if (room_ == NULL) { QSqlQuery query; query.prepare("SELECT xid_room FROM event_room WHERE xid_event = :id AND xid_conference = :conf"); query.bindValue(":id", id()); query.bindValue(":conf", conferenceId()); if (!query.isActive()) if (!query.exec()) throw OrmSqlException(query.lastError().text()); if (!query.next()) { qDebug() << "No room found for event id: " << id(); throw OrmNoObjectException(); } int id = query.record().value("xid_room").toInt(); room_ = new Room(Room::retrieve(id)); } return room_; } QString Event::roomName() { return room()->name(); } int Event::roomId() { return room()->id(); } QStringList Event::persons() { if( mPersonsList.isEmpty() ) { QSqlQuery query; query.prepare("SELECT person.name FROM person INNER JOIN event_person ON person.id = event_person.xid_person AND event_person.xid_event = :id AND event_person.xid_conference = :conf1 AND person.xid_conference = :conf2"); query.bindValue(":id", id()); query.bindValue(":conf1", conferenceId()); query.bindValue(":conf2", conferenceId()); if (!query.exec()) qDebug() << query.lastError(); while(query.next()) mPersonsList.append(query.record().value("name").toString()); } return mPersonsList; } QMap Event::links() { if ( mLinksList.isEmpty() ) { QSqlQuery query; query.prepare("SELECT name,url FROM link WHERE xid_event = :id AND xid_conference = :conf"); query.bindValue(":id", id()); query.bindValue(":conf", conferenceId()); query.exec(); // TODO: handle query error //qDebug() << query.lastError(); while(query.next()) mLinksList.insert(query.record().value("name").toString(), query.record().value("url").toString()); } return mLinksList; } Favourite Event::timeConflict() const { if (favourite() == Favourite_no) // if it's not favourite, it can't have time-conflict return Favourite_no; QList events = conflictEvents(id(),conferenceId()); // find "strongest" conflict Favourite f = Favourite_no; for (int i = 0; i != events.size(); ++i) { switch (events[i].favourite()) { case Favourite_strong: f = Favourite_strong; break; case Favourite_weak: if (f == Favourite_no) f = Favourite_weak; break; case Favourite_no: break; } } return f; } void Event::cycleFavourite(bool back) { switch (favourite()) { case Favourite_no: setFavourite(back ? Favourite_weak : Favourite_strong); break; case Favourite_strong: setFavourite(back ? Favourite_no : Favourite_weak); break; case Favourite_weak: setFavourite(back ? Favourite_strong : Favourite_no); break; } } void Event::setRoom(const QString &room) { Q_UNUSED(room); qWarning("WARINING: setRoom() is NOT IMPLEMENTED YET"); // TODO: implement } void Event::setPersons(const QStringList &persons) { Q_UNUSED(persons); qWarning("WARINING: setPersons() is NOT IMPLEMENTED YET"); // TODO: implement } void Event::setLinks(const QMap &aLinks) { Q_UNUSED(aLinks); qWarning("WARINING: setLinks() is NOT IMPLEMENTED YET"); // TODO: implement } QList Event::getSearchResultByDate(const QDate& date, int conferenceId, QString orderBy) { QList list; // Check whether the temporary table SEARCH_EVENT exists (http://www.sqlite.org/faq.html#q7) QSqlQuery query("SELECT count(*) FROM sqlite_temp_master WHERE type='table' and name='SEARCH_EVENT'"); if (!query.exec()) { qDebug() << "SQL Error: " << query.lastError().text(); return list; } query.first(); QVariant v = query.value(0); if (v.toInt() != 1) return list; QString strQuery = QString("SELECT %1 FROM EVENT INNER JOIN SEARCH_EVENT USING (xid_conference, id) ").arg(columnsForSelect()); strQuery += QString("WHERE xid_conference = :conf AND start >= :start AND start < :end ORDER BY %1").arg(orderBy); query = QSqlQuery(); try { if( !query.prepare( strQuery ) ){ qDebug() << "QSqlQuery.prepare error"; throw OrmSqlException( query.lastError().text() ); } Q_ASSERT(conferenceId > 0); Conference conference = Conference::getById(conferenceId); QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC); query.bindValue(":conf", conferenceId); query.bindValue(":start", dayStart.toTime_t()); query.bindValue(":end", dayStart.addDays(1).toTime_t()); list = load(query); } catch(OrmException &e) { qDebug() << "getSearchResultByDate error: " << e.text(); } catch(...){ qDebug() << "getSearchResultByDate failed ..."; } return list; } confclerk-0.6.4/src/mvc/conferencemodel.cpp0000664000175000017500000000422713212517317020202 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "conferencemodel.h" ConferenceModel::ConferenceModel(QObject* parent) : QAbstractListModel(parent) , conferences(Conference::getAll()) { } int ConferenceModel::rowCount(const QModelIndex& parent) const { if (parent.isValid()) { return 0; } else { return conferences.size(); } } QVariant ConferenceModel::data(const QModelIndex& index, int role) const { if (role != Qt::DisplayRole) { return QVariant(); } return conferences[index.row()].title(); try { const Conference& c = conferenceFromIndex(index); return c.title(); } catch (OrmNoObjectException&) { return QVariant(); } } const Conference& ConferenceModel::conferenceFromIndex(const QModelIndex& index) const { if (index.parent().isValid() or index.column() != 0 or index.row() >= conferences.size()) { throw OrmNoObjectException(); } return conferences[index.row()]; } QModelIndex ConferenceModel::indexFromId(int id) const { for (int i = 0; i < conferences.size(); ++i) { if (conferences[i].id() == id) { return index(i, 0); } } return QModelIndex(); } void ConferenceModel::newConferenceBegin() { } void ConferenceModel::newConferenceEnd(int conferenceId) { Q_UNUSED(conferenceId); reinit(); } void ConferenceModel::conferenceRemoved() { reinit(); } confclerk-0.6.4/src/mvc/conference.cpp0000664000175000017500000000373413212517317017163 0ustar gregoagregoa/* * Copyright (C) 2010 Ixonos Plc. * Copyright (C) 2011-2017 Philipp Spitzer, gregor herrmann, Stefan Stahl * * This file is part of ConfClerk. * * ConfClerk is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, either version 2 of the License, or (at your option) * any later version. * * ConfClerk is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * ConfClerk. If not, see . */ #include "conference.h" #include "../sql/sqlengine.h" QSqlRecord const Conference::sColumns = Conference::toRecord(QList() << QSqlField("id", QVariant::Int) << QSqlField("title", QVariant::String) << QSqlField("subtitle", QVariant::String) << QSqlField("venue", QVariant::String) << QSqlField("city", QVariant::String) << QSqlField("start", QVariant::DateTime) << QSqlField("end", QVariant::DateTime) << QSqlField("day_change", QVariant::Int) << QSqlField("timeslot_duration", QVariant::Int) << QSqlField("active", QVariant::Bool) << QSqlField("url", QVariant::String) ); QString const Conference::sTableName = QString("conference"); Conference Conference::getById(int id) { QSqlQuery query; query.prepare(selectQuery() + "WHERE id = :id"); query.bindValue(":id", id); return loadOne(query); } QList Conference::getAll() { QSqlQuery query; query.prepare(selectQuery()); return load(query); } int Conference::activeConference() { QSqlQuery query("SELECT id FROM conference ORDER BY active DESC, id LIMIT 1"); if (!query.exec() || !query.first()) return -1; return query.record().value("id").toInt(); } confclerk-0.6.4/src/src.pro0000664000175000017500000000020513212517317015062 0ustar gregoagregoainclude(global.pri) TEMPLATE = subdirs maemo : SUBDIRS += alarm SUBDIRS += orm sql mvc gui app #SUBDIRS += test CONFIG += ordered confclerk-0.6.4/src/bin/0000775000175000017500000000000013212517317014324 5ustar gregoagregoaconfclerk-0.6.4/src/icons.qrc0000664000175000017500000000111213212517317015371 0ustar gregoagregoa icons/add.png icons/remove.png icons/expand.png icons/collapse.png icons/reload.png icons/dialog-warning.png icons/search.png icons/today.png icons/favourite-no.png icons/favourite-weak.png icons/favourite-strong.png icons/alarm-on.png icons/alarm-off.png confclerk-0.6.4/NEWS0000664000175000017500000001144113212517317013465 0ustar gregoagregoaThis is the NEWS file for ConfClerk. ConfClerk is the successor of fosdem-schedule; cf. docs/fosdem-schedule for the historic documentation. version 0.6.4, 2017-12-08 * Improve proxy dialog and add support for SOCKS5 proxies. Thanks to intrigeri for the bug report. (Fixes: #59) * Make toolbar in main window non-movable to prevent accidentally pulling it out. version 0.6.3, 2017-10-01 * Support Qt5 and Qt4. (Fixes: #57) Mention new location of database file under Qt5 in docs. * Fix display of events after midnight. (Fixes: #53) * Fix import failures when the conference has no tracks in the XML file. Thanks to Martín Ferrari for the bug report and the help with the fix. (Fixes: #56) * Bail out on import when conference XML has empty or ill-formed event IDs. Thanks to Paul Wise for the bug report. (Fixes: #58) * Make URLs in Abstract/Description of event detail view clickable. (Fixes: #49) * Improve exception handling and error messages. Thanks to Martín Ferrari for his help. * Improve import dialog: - enable "Open" button only when a URL is entered - trim URL version 0.6.2, 2017-01-24 * Event dialog: don't unconditionally assume plain text for description and abstract, can be rich text as well (i.e. contain HTML tags). * Favourites: change from boolean to tri-strate: no favourite, weak/fallback favourite, strong favourite. Adapt buttons and conflict markers. Thanks to Elena ``of Valhalla'' for the bug report. (Fixes: #54) * Handle SSL errors. Present SSL error messages during download in a warning dialog and ask user about how to proceed. (In practice seen on Maemo due to ancient certificates.) version 0.6.1, 2014-09-11 * Fix typos in documentation. * Add Keyword entry to .desktop file. * Make it impossible to hide the toolbar by disallowing its context menu. (Fixes: #51). * Fix bugs around rooms. Insert names into database, handle room name changes. version 0.6.0, 2013-06-13 * New DB schema 001. Datebase is converted on first start. DB schema update functionality implemented. * Added more keybindings. (Fixes: #28) * Rewrote event detail dialog, to avoid flicker on Maemo. (Fixes: #48) * Events after midnight are shown on the day before (if the conference XML file is correct). (Fixes: #43) * On non-Maemo system "alarms" (notifications) are shown. (Fixes: #46) * Try to show current day on startup and show "day" tab. (Fixes: #44) * Use conference id (not title) for import. (Fixes: #45) * Use conference id (not title) for alarms (maemo). (Fixes: #38) * Use one day navigator for whole app (instead of separate ones per tab). (Fixes: #11) version 0.5.5, 2012-06-12 * UI changes: - button bar on the right side - shared "day navigator" - "Now" tab removed, function integrated into former "today" button * Add "reload schedule" button. Fixes: #34 * Alarms are actually removed now. Thanks to Axel Beckert for the bug report. Fixes: #38 * Handle redirects when importing schedules over the network. Thanks to Axel Beckert for the bug report. Fixes: #39 * Update some icons. Thanks to Axel Beckert for the bug report. Fixes: #40 * Improve timezone handling. Fixes: #42 * Add expand/collapse buttons/actions. Fixes: #31 * Update example URLs in README. version 0.5.4, 2011-09-14 * Change displaying events a bit, use system colours (#13). * Fix display of conflict and alarm icon on maemo (#35). * Improve logic of grouping events into timeslots (#22). * Remove warnings without a database or with an empty one (#20). * Import/update: show progressbar immediately (#25). * Update dates and text for day navigator widget when switching conference (#36). Version 0.5.3, 2011-08-16 * Add "jump to today" button to date navigator. Thanks to Michael Schutte for the patch. Fixes: #29 * Don't die on importing a schedule that does not contain a city field. Thanks to Axel Beckert for the bug report. Fixes: #32 Version 0.5.2, 2011-07-23 * Show close button in conference dialog also if there are no conferences yet. * Show event title instead of id in alarm (maemo). * Remove event/room records on import to get rid of "old" room names; this avoids duplicates when room names change. Version 0.5.1, 2011-07-14 * Improve search function: split search string on whitespace. * Various small UI changes, e.g.: - cancel button in settings dialogs - colors and borders - date format in date navigator - flatten menu - remove status bar - clean up some dialogs Version 0.5.0, 2011-06-29 * First release of ConfClerk as the fosdem-schedule successor. * Continue the multi-conference feature, make sure persons/tracks/rooms are handled separately per conference. * Remove FOSDEM- and maemo-specific parts. * Exchange icons to be sure about the provenance. * Some code cleanup, most notable: use prepared statements for all SQL queries. confclerk-0.6.4/README0000664000175000017500000001273413212517317013654 0ustar gregoagregoaThis is the README file for ConfClerk. ConfClerk is the successor of fosdem-schedule; cf. docs/fosdem-schedule for the historic documentation. Description: ConfClerk is an application written in Qt, which makes conference schedules available offline. It displays the conference schedule from various views, supports searches on various items (speaker, speech topic, location, etc.) and enables you to select favorite events and create your own schedule. At the moment ConfClerk is able to import schedules in XML format created by the PentaBarf conference management system (or frab) used by e.g. FOSDEM, DebConf, FrOSCon, Grazer Linuxtage, and the CCC. ConfClerk is targeted at mobile devices like the Nokia N810 and N900 but works on any system running Qt. See the file ./INSTALL for building and installation instructions, and ./AUTHORS for the list of contributors. Copyright and License: Copyright (C) 2010 Ixonos Plc. Copyright (C) 2011-2017, Philipp Spitzer, gregor herrmann, Stefan Strahl This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. data/confclerk.*: Copyright (C) 2011, Christian Kling This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. src/icons/favourite*, src/icons/alarm*, src/icons/collapse*, src/icons/expand*: Copyright (C) 2012-2017, Philipp Spitzer, Stefan Strahl This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. src/icons/*: All other icons are taken from the Debian package gnome-icon-theme, which contains the following notice (as of 2011-06-24): Copyright © 2002-2008: Ulisse Perusin Riccardo Buzzotta Josef Vybíral Hylke Bons Ricardo González Lapo Calamandrei Rodney Dawes Luca Ferretti Tuomas Kuosmanen Andreas Nilsson Jakub Steiner GNOME icon theme is distributed under the terms of either GNU LGPL v.3 or Creative Commons BY-SA 3.0 license. History: ConfClerk started as fosdem-schedule, targeted at Maemo as an operating system and the FOSDEM conference. fosdem-schedule was written by Ixonos Plc., maintained at http://sourceforge.net/projects/fosdem-maemo/ , and released under the GNU GPL 2 or later. Cf. docs/fosdem-schedule for more information. ConfClerk is the successor of fosdem-schedule, aiming at improvements and generalization regarding supported platforms and conference systems. The project was started after fosdem-schedule was not actively developped anymore and with the "blessing" of the fosdem-schedule developers; cf. http://sourceforge.net/mailarchive/forum.php?thread_name=20110621171440.GA4521%40nerys.comodo.priv.at&forum_name=fosdem-maemo-devel Thanks guys! Contact: Philipp Spitzer, gregor herrmann, Stefan Strahl Toastfreeware http://www.toastfreeware.priv.at/confclerk/ Tested pentabarf (or frab, or summit/wafer with patches) instances: - 33C3: https://fahrplan.events.ccc.de/congress/2016/Fahrplan/schedule.xml - DebConf (2013, pentbarf): https://penta.debconf.org/dc13_schedule/schedule.en.xml - DebConf (2014, summit): https://summit.debconf.org/debconf14.xml - DebConf (2015, summit): https://summit.debconf.org/debconf15.xml - DebConf (2016, wafer): https://debconf16.debconf.org/schedule/pentabarf.xml - FOSDEM: http://fosdem.org/schedule/xml - FrOSCon (2016): http://programm.froscon.org/2016/schedule.xml - Grazer Linuxtage (2016): https://glt16-programm.linuxtage.at/schedule.xml confclerk-0.6.4/COPYING0000664000175000017500000004310313212517317014021 0ustar gregoagregoa GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. confclerk-0.6.4/ChangeLog0000664000175000017500000015076113212517317014551 0ustar gregoagregoa2017-12-08 gregor herrmann update NEWS before release of version 0.6.4 2017-10-07 gregor herrmann Make toolbar in main window non-movable to prevent accidentally pulling it out. 2017-10-06 gregor herrmann Settings (dialog): add username/password options for proxy server Cf. #59 2017-10-05 gregor herrmann update comment on default proxy value as we use QNetworkProxy::ProxyType instead of int now 2017-10-05 Philipp Spitzer AppSettings returns the proxy type as QNetworkProxy instead of int now. 2017-10-05 gregor herrmann Settings (dialog): add HTTP+SOCKS5 radio buttons and use them Hopefully fixes: #59 Add ProxyType setting in preparation of SOCKS5 proxy support. 2017-10-03 gregor herrmann Settings dialog: set port range to 1-65535 and right-align. Settings dialog: change heading to "HTTP proxy settings". Fixes: #59 2017-10-02 gregor herrmann schedulexmlparser.cpp: add missing #include Found when building with gcc 4.2.1 under Maemo5. 2017-10-02 Philipp Spitzer C++98 compatibility: Variable initialization in SqlEngine class. C++98 compatibility: Variable initialization in TransactionRaii class. C++98 compatibility: Use throw() in destructor of std exceptions. C++98 compatibility: QDialogButtonBox::StandardButton::Open -> QDialogButtonBox::Open. 2017-10-02 gregor herrmann Make sure we build with -std=c++98 (under Unix and Qt4) because gcc 4.2.1 on Maemo5 doesn't know c++11, and with this setting we can prevent accidents also when building the Qt4 variant with a modern compiler. 2017-10-01 gregor herrmann bump version after release update NEWS before release of version 0.6.3 2017-09-27 Philipp Spitzer Now the links in the description are clickable. Fixes #49. The ID of an event is checked now when importing the XML file. Now using exceptions to report errors in schedulexmlparser.cpp. Create dedicated sub-function to parse XML data (to prepare exception error reporting). Use TransactionRaii in schedulexmlparser.cpp. Implement transaction RAII. Implement rollbackTransaction(). 2017-09-13 Philipp Spitzer If no day_change was given for a conference 4 AM is assumed. Fixes #53. Import schedules with dates attached to events correctly. Avoid duplicate code when inserting/updating a conference. 2017-09-13 gregor herrmann URL input dialog: trim URL. 2017-08-30 Philipp Spitzer Minor typographic improvement. "Open" button is disabled not when no URL was entered. 2017-08-30 gregor herrmann Mention new location of database file under Qt5 in docs. ifdef qt4 and qt5 Merge branch 'master' into qt5 2017-08-30 Philipp Spitzer When no track is present, use the special name "No track" is used. This fixes issue #56. 2017-08-30 Martín Ferrari Fix possibility for SQL injection attack. Demangling exception class name from error message of unknown exceptions. Write debug message in case of silently catched exceptions. More specific error message for "unknown" exceptions. 2017-08-27 gregor herrmann TrackInsertException: make error message useful. TrackInsertException: correctly derive from OrmSqlException. Derive OrmException from std::runtime_error. 2017-01-24 gregor herrmann bump version after release update NEWS before release. 2017-01-23 Philipp Spitzer Used tr() for some more GUI strings (there are plenty more that should be treated this way). Used tr() for some GUI strings (there are plenty more that should be treated this way). 2017-01-23 gregor herrmann Handle SSL errors. Show warning with error messages, offer to ignore them or abort download. Set some SSL parameters for network request. 2017-01-22 Philipp Spitzer Merged definition and initialization of conflictSeverity. 2017-01-22 gregor herrmann Initialize conflictSeverity variable. Compiler warning with -Wmaybe-uninitialized. confclerk.pro: add "-transparent white" to convert call Fix typo in error message. Update example schedule URLs in README. Bump copyright years for icons. 2017-01-21 Philipp Spitzer Now ignoring .blend1 files (backup files Blender creates after saving). In the treeview, the right mouse button now back-cycles the favourite state of events. Added back-cycling option in Event::cycleFavourite. Updated renderings of the alarm icons after changing the Blender file. The alarm icons had a black border instead of a white border in Blender 2.76b. Fixed it. Updated renderings of the favourite icons after changing the Blender file. The favourite icons had a black border instead of a white border in Blender 2.76b. Fixed it. Re-rendered favourite icons with Blender 2.76b and added favourite-weak rendering. 2017-01-21 gregor herrmann Bump copyright years. whitespace 2017-01-21 Philipp Spitzer Addes white border to favourite-weak star. 2017-01-20 Philipp Spitzer Renamed favourite-on.png to favourite-strong.png and favourite-off.png to favourite-no.png. Now the conflict severity is drawn. Removed deprecated functions. Event favourite is now tristate in the code now and the corresponding buttons are tristate as well. Checked in .gitignore. favourite is now tristate instead of bool. 2017-01-11 gregor herrmann eventdialog: only convertFromPlainText description and abstract if they are not richtext. Merge branch 'master' into qt5 2015-01-20 gregor herrmann Bump copyright year. In anticipation of a release in 2015. Update release target. Exclude .git directory from tarball. 2015-01-20 gregor herrmann Update ChangeLog target. Use /usr/share/gnulib/build-aux/gitlog-to-changelog (in the gnulib) package instead of svn2cl, since we moved from subversion to git. gitlog-to-changelog sums up the commits, whereas git2cl dumps them individually. 2015-01-13 Philipp Spitzer Merged changes from trunk. It still compiles successfully. :-) 2014-09-11 gregor herrmann Make release target depend on distclean target to ensure we have no compiled objects or Makefiles in the release tarball. bump version number after release Finalize NEWS before release. Update NEWS for 0.6.1 release. Update reference URLs in README. Update copyright notices. confclerk.pro: fix typo in pod2man call. confclerk.pro: cosmetic editoring. confclerk.pro: add signature target. gpgp-sign tarball when making a release. 2014-09-09 gregor herrmann Fix SQL query which returned too many rooms. 2013-09-24 Philipp Spitzer Now the application compiles for QT5. Note that the location of the database in Linux has changed from ~/.local/share/data/Toastfreeware/ConfClerk to ~/.local/share/Toastfreeware/ConfClerk Fixed a yet unknown bug: The room name was not properly inserted in the room table. 2013-09-10 Philipp Spitzer Escaped the strings that are shown in the dialog and preserve some layout. 2013-07-04 Philipp Spitzer Make it impossible to hide the toolbar by disallowing its context menu (fixes #51). 2013-06-26 gregor herrmann remove TODO with one remaining item which I don't understand move TODO item to trac, issue #52 move TODO item to trac, issue #51 move TODO item to trac, issue #50 2013-06-12 Philipp Spitzer Applied "desktop-keywords.patch": add Keyword entry to confclerk.desktop Author: gregor herrmann Applied "spelling.patch": Description: fix a typo Author: gregor herrmann 2013-06-12 gregor herrmann bump version for future release Update NEWS for 0.6.0 release. Set version to 0.6.0. 2013-06-12 Philipp Spitzer Removed a "TODO" comment. 2013-06-12 gregor herrmann Update example URLs in README. 2013-06-12 Philipp Spitzer Added some actions to the mainwindow - otherwise shortcuts don't work on MAEMO (see ticket #28). Removed debug output. 2013-05-30 gregor herrmann Eventdialog: make sure the same colours as everywhere are used. Additionally adjust font size on maemo. This should allow to close #48. 2013-05-28 Philipp Spitzer Changed the event dialog layout hoping to improve issue #48. 2013-05-28 gregor herrmann Move removal of generated file into new releaseclean target. .pro: Add created files to QMAKE_DISTCLEAN. 2013-05-28 Philipp Spitzer Made sure the mainwindow is destroyed properly and the sql database is closed. 2013-05-28 gregor herrmann #include appsettings.h for maemo. 2013-04-30 Philipp Spitzer Now the dayChange time is taken into account. This fixes #43. 2013-04-19 gregor herrmann bump copyright years add Stefan to AUTHORS 2013-04-16 Philipp Spitzer Formatted alarm message (closes ticket #46). Alarms are reported via QSystemTray now (see ticket #46). 2013-04-04 gregor herrmann extend comment re systrayicon position 2013-04-03 gregor herrmann tray icon: add (commented out) debug output and ->hide 2013-04-02 Philipp Spitzer Prepared to show an alarm message via tray icon on non-MAEMO systems. 2013-04-02 gregor herrmann fix typo in comment fix typo in comment fix typo in comment 2013-03-19 Philipp Spitzer The day tab is now the current tab when starting the program (ticket #44). Current day is used now when starting the program or loading a conference (ticket #44). Created more shortcuts (ticket #28). Added comments to the SQL statements (back in October). 2012-10-17 Philipp Spitzer The focus is set to the search input field when the search icon is clicked. 2012-10-17 gregor herrmann When ConfClerk is called with arguments (alarm), check for >= 3. Alarmd seems to add an additional argument. Rip out unused DBUS stuff. 2012-10-17 Philipp Spitzer Fixed bug: Arguments for calling ConfClerk in an alarm event were not built correctly. Changed int to string converstion method because the old method gave an compilation error on MAEMO. We added the conferenceId to some alarm related methods (ticket #41). 2012-10-08 gregor herrmann Update URLs in README. 2012-09-25 Philipp Spitzer Schmema update completed. Finally closing ticket #45. Reloading a conference works now. Fixed: Forgot to call query.exec() at several places. Added sql file that updates the schema from version 000 to version 001. Changed table names to have small letters. Changed coding style of sql file. 2012-09-25 gregor herrmann Remove unsed (and removed from db) 'days' column fro xml parser and all sql parts. 2012-09-25 Philipp Spitzer Suggestion for database schema version 001. 2012-09-25 gregor herrmann Don't insert empty string into picture column. (NOT NULL constraint removed from db schema.) Remove empty-city-hack. (NOT NULL removed from db schema.) Remove ifdef'd out members 2012-09-06 gregor herrmann One version for creating the directory is enough :) (Now tested on Windows, too.) 2012-09-05 Philipp Spitzer Added a second possibility to create the directory and removed the TODO. 2012-09-05 gregor herrmann fix .mkpath() Creating the "." path works. Is this idiomatic? At least it works (under Windows). TODO left: handle errors. 2012-09-04 Philipp Spitzer Restructured the SqlEngine. Not yet finished (see "TODO" in the code). 2012-09-04 gregor herrmann fix some more header includes fix typo in comment 2012-08-27 gregor herrmann fix #includes (detected by QtCreator and friends on windows) 2012-08-22 Philipp Spitzer On the way to fix #45. 2012-08-21 Philipp Spitzer Fixed bug: Changing the conference URL resulted in an error message. 2012-06-13 gregor herrmann Add .pro.user.* to svn:ignore and remove it in the release target. TODO: new item about duplicate documentation. README: add Stefan to Contact section. 2012-06-12 gregor herrmann Bump version after 0.5.5 release. Add release date in NEWS. remove TODO item (expand/collapse) Add more items to NEWS. Add items to NEWS. Add Stefan as a copyright holder to source files, too. sync copyright notices between README and confclerk.pod 2012-06-12 Philipp Spitzer Implemented expand/collapse of the event groups. Resolves ticket #31. The groups starts at full hours again. Philipp's comments to r1444. Created icons collapse and expand. 2012-05-03 gregor herrmann createTimeGroups(): use QDateTime instead of QTime to avoid "midnight overflow". Cf. #42 2012-05-02 Philipp Spitzer This at least partly fixes #42 ("fun with time zones"). 2012-05-02 Stefan Strahl Changed inactive favourite icon to match alarm icon style 2012-04-22 gregor herrmann Show the AlarmOff icon in the timegroup header when the group has no alarms set. 2012-04-19 gregor herrmann Update copyright information in README for new icons. 2012-04-19 Philipp Spitzer Changed the alarm icon due to ticket #40. I haven't tried it because I don't have an N900 device. 2012-04-19 gregor herrmann Update NEWS with recent bug fixes. Update copyright in README for changed icons. 2012-04-19 Philipp Spitzer Changed favourite icons as a response to ticket #40. 2012-04-18 gregor herrmann Handle redirects when importing schedules over the network. Fixes: #39 2012-04-07 gregor herrmann More output on errors. 2012-04-05 gregor herrmann Fix typo in docs. Update exmple URLs in README. 2012-03-21 gregor herrmann Update copyright years. Add note about fixed bug to NEWS. 2012-03-21 Philipp Spitzer Hopefully fixed bug #38: As the alarm message was used to identify the event by setting it to the eventId and in r1359 the alarm message was changed to show the event title, alarms could not be deleted anymore. Therefore, two alarm attributes (int values) were introduced with this commit: "conferenceId" and "eventId" to identify the event and therefore, deleting alarms should work again. Additionally a second (not reported) bug was fixed: Activating an alarm in the treeview set the alarm to the current time plus 10 seconds. However, I don't know for sure whether this commit fixed bug #38 becaus I don't have a maemo device to test it. 2012-03-20 gregor herrmann Removed commented out reference to removed files. 2012-03-20 Philipp Spitzer Deleted calendar.h and calendar.cpp as they are not used. Deleted files that don't seem to be used. 2012-03-11 gregor herrmann typo in docs 2011-12-12 Philipp Spitzer Updated the TODO list. When the search toolbox button is clicked when the search dialog is already open, it is closed. Implemented stub for expand/collape all. Another layout study. Changed layout details to study the effect in Maemo. Better calculation of the day navigator date position. Fixed by gregoa: Searching for titles where the events had no person did not find anything. The search result is now synced with the daynavigator. When the search result is not on the current date, the date is changed. 2011-11-27 gregor herrmann Update URL list in README. 2011-10-17 Philipp Spitzer Sorted by duration additionally to start. Implemented "now" action and removed the "now" button from the day navigator. Removed unused nowEvent functions. Implemented the reload button functionality. Closes: #34 The conflict editor works again. The favorite tab gets updated again after changing the favorite state. 2011-10-05 Philipp Spitzer Removed the "Now" tab. Removed the day navigator inside tabs. Added a search button in the button bar. Right now, at least the following does not work: * update of favorites * conflict editor * setting favorite in the event dialog 2011-09-21 gregor herrmann Search dialog: less width, more lines. Tabs: elide tabtexts. 2011-09-21 Philipp Spitzer Implemented "unset dates" in the date navigator. The dateChanged signal is transmitted to the tabcontainers now. Introduced a toobar. Added a new global date navigator instance (the "old" ones are not removed yet). Cleanup daynavigatorwidget. 2011-09-14 gregor herrmann Fix typo in NEWS. bump version after release Add date to NEWS before release. 2011-09-12 gregor herrmann Add NEWS items for upcoming 0.5.4 release. Add dates to all releases in NEWS. Day navigator widget: setDates() - change logic of setting mCurDate: if it's outside the conference range, set it to mStartDate (and not to mEndDate when it's "greater") -- when going to an earlier conference, starting on the last day doesn't really make sense - update() the widget after changing dates. this might be a bit expensive but it ensure that the displayed date is what we want, and since there are many day navigator widgets there's probably no single other place Hopefully closes #36. Replace some tabs with the usual spaces. 2011-09-06 Philipp Spitzer Assigned confclerk icon to main window. Now the progress bar is shown immediately after clicking the refresh conference button. Closes ticket #25. Fixed ticket #26 (empty tabs after some actions). 2011-09-06 Stefan Strahl Fixed ticket #20 2011-09-06 Philipp Spitzer Removed one comment and fixed typos. 2011-09-06 gregor herrmann Mention frab (FrOSCon penta clone) and Grazer Linuxtage (fixes #33). 2011-08-24 Philipp Spitzer Rewrote code to group events together with gregoa. Closes bug #22. 2011-08-23 Philipp Spitzer This should close ticket #35 ([maemo] conflict icon overlaps alarm icon). Changed the drawing of events to make use of system colors and styles, at least partially. 2011-08-16 gregor herrmann bump version after release Remove "TODO" from NEWS, a.k.a. prepare for release 2011-08-15 gregor herrmann Update NEWS. Improve day navigator widget. (Still black magic, now even with #ifdefs :/) .isEmpty() feels more Qtish then == "" Only add ", $venue" to conference location when $venue is not empty. ISO formatting of conference dates in conferenceeditor. Quick fix for ticket: #32: if the schedule XML doesn't contain a city, we put "n/a" there. In the long run we might want to find a system for changing the database scheme; too bad sqlite has only limited ALTER TABLE support. emit the parsingScheduleBegin() signal earlier, so we get the progressbar a bit earlier (cf. ticket #25) mention FrOSCon as an example (although it's not working at the moment, cf. #32) 2011-07-24 gregor herrmann Use "-" in start-end. Closes: #30 Shift date text up by icon/2 in order to re-center the text. More or less at least. Add today button to date navigator. TODO: date is not centered between prev/next arrows anymore. Cf. #29 2011-07-23 gregor herrmann Make sure to remove src/bin/libqalarm.a on make clean. bump version after release Prepare NEWS before release of 0.5.2. Remove conference/room records unconditionally from EVENT_ROOMS 2011-07-22 gregor herrmann SqlEngine::addRoomToDB: remove event/conference combinations from EVENT_ROOM that are already there. Should avoid duplicates on updates where the room name changes. Hopefully fixes ticket #24. manpage: s/Desafinado/ConfClerk/ 2011-07-19 Philipp Spitzer Fixed ticket #23: No close button in conference dialog when no confernces are in the list. 2011-07-15 gregor herrmann Don't include tarballs in release tarballs ... Distinguish "Presenter" and "Presenters" (instead of "Presenter(s)"). Closes: Ticket #17 Show event title instead of id in alarms. Don't remove generated files in DISTCLEAN; otherwise they are gone during package builds :/ Add a TODO item. 2011-07-14 gregor herrmann Reorganize CLEAN and DISTCLEAN targets. Bump VERSION after release. Remove ChangeLog from svn (it's created via svn2cl, so this is circular). Add generated files to distclean target. Update ChangeLog before release. 2011-07-13 gregor herrmann NEWS entry for 0.5.1 release. 2011-07-13 Philipp Spitzer This is just a quick-and-dirty workaround commit to aviod a drawing problem on maemo. This commit might be reverted ... The speaker is preselected in the search dialog now. First try to improve the colors (ticket #13). The cancel button on the settings dialog works now (ticket #14) and the layout of the settings dialog is stable now (ticket #15). Changed the menu to be non-hierarchical. Closes ticket #16. Changed the placement of the date label again. Changed the date format to show the day-of-week. Replaced "130" by s.width() when centering the date. 2011-07-12 Philipp Spitzer This commit closes ticket #12. The search terms are ANDed now and a call to trimmed() before splitting the search string avoids problems with leading/trailing spaces. 2011-07-11 Philipp Spitzer Before querying the SEARCH_EVENT table, its existence is checked. Therefore a command line debug error message is avoided. This commit partly fixes ticket #10. Error messages reported with the function error_essage are no longer writted to std:error because they are shown to the user anyway. This commit partly resolves ticket #10. The description and person list of the event dialog is now selectable so that copy&paste is possible. 2011-07-10 Philipp Spitzer Tuned the about dialog. Minor tuning of the conference editor. The reload button now has a text on it. Fixed bug (related to ticket #12): Only the last search term is used. Undid changes to sqlengine.cpp I committed accidentally in r1318. 2011-07-08 gregor herrmann Split search keyword string on whitespace. Avoid duplicate search results by using SELECT DISTINCT when filling the SEARCH_EVENT table. 2011-07-05 gregor herrmann Add DebConf11 URL to README. 2011-07-04 Philipp Spitzer Cleaning of the conferenceeditor dialog. Removed the ability to show "pictures" (maps) of rooms and maps of conferences. The XML file does not contain picture/map/image information of conferences or rooms. We left the room.picture definition in the database SQL because there is no "drop column" in sqlite. Removed the unused status bar. 2011-06-29 gregor herrmann Some more s;TARGETDEPS;POST_TARGETDEPS; s;scheduler;schedule application; Bump version Update changelog. 2011-06-28 Philipp Spitzer Removed many of the qDebug() output lines (see ticket #10). 2011-06-28 gregor herrmann add copyright/license for exchanged icons 2011-06-28 Philipp Spitzer Replaced the star icons with self-made versions (Blender 2.57b) that are better distinguishable. Closes ticket #8. 2011-06-27 Philipp Spitzer Included application version in the about dialog. This closes ticket #9. 2011-06-26 Philipp Spitzer Links in events are now clickable (resolves ticket #4). Searching without active conference doesn't give an error message anymore (resolves ticket #7). The '%' character doesn't have to be escaped anymore. The window title was still "FOSDEM Schedule". 2011-06-25 gregor herrmann Add entries to NEWS file. Shorten TODO. Create a simple man page. Add URLs for FOSDEM 2011, DebConf 2010, and 27C3 to README instead of TODO. Remove the remaining last two fosdem files. Update contact info. 2011-06-25 Philipp Spitzer Bugs are now reported in the trac system. 2011-06-24 gregor herrmann Mark bug 3 as fixed. 2011-06-24 Philipp Spitzer Enter or return triggers the search now when the focus is at the searchEdit or at one of the checkboxes. Filed bug 7: Error message when searching without having conferences 2011-06-24 gregor herrmann Add another wishlist (more: design discussion) bug 2011-06-24 Philipp Spitzer Removed unnecessary debug output and code. Fixed bug reported by gregor: Too many authors are shown (form other conferences as well). 2011-06-24 gregor herrmann Improve release target in .pro 2011-06-24 Philipp Spitzer Removed two unused variables to avoid compiler warnings. 2011-06-24 gregor herrmann Somewhere a slash was missing ... Updated TODO. Add contact info to README. Update 'About' dialog. Remove ULB, Campus Solbosch maps. The big rename. Which was not so big after all ... De-maemofy: make .desktop file generic, remove resized (old) icons and Makefile for installing them. Add new resource file to app.pro Icons, part 2: replace fosdem/brain icons with ConfClerk logo Icons part 1: replace all icons (except the FOSDEM ones) with icons from current gnome-icon-theme 2011-06-23 gregor herrmann Remove unused icons. Another instance of the databasename. (NOTE: untested, this codepath is only used on maemo) Move config and sqlite database. They are both at the xdg-specified locations now: ~/.local/share/data/Toastfreeware/ConfClerk/ConfClerk.sqlite ~/.config/Toastfreeware/ConfClerk.conf Rename DBus service. Hopefully successful. Add some conference URLs to TODO New bug noted. New bug noted. qmake warning: POST_TARGETDEPS instead of TARGETDEPS Remove libs in clean target. Move and rename logo, create a target to convert it in .pro, add copyright/license to README. Update TODO. 2011-06-23 Philipp Spitzer Checked the remaining code. Didn't find possibilities for SQL injections anymore. 2011-06-23 gregor herrmann Update TODO. Add release and changelog targets to project file. Remove empty Changelog. 2011-06-23 Philipp Spitzer Prevented SQL injections in function addPersonToDB. 2011-06-23 gregor herrmann Add copyright to source. Update GPL blurb in source files. 2011-06-23 Philipp Spitzer Just adapted the page size to be rectangular. This suggestion/"doodle"* for the new application icon was created just now by Christian Kling who (he is sitting next to me right now) agreed to publish it under the GNU GPL (v2 or later). *Christian's words. 2011-06-23 gregor herrmann Remove ./debian directory, we'll do the packaging outside the "upstream" repository. First round of documentation updates. Prepare ChangeLog generation from svn logs. 2011-06-23 Philipp Spitzer Prevented SQL injection in function addLinkToDB. 2011-06-23 gregor herrmann update TODO 2011-06-23 Philipp Spitzer Fixed SQL error in searchEvent when no table was selected. Prevented SQL injection in searchEvent. 2011-06-23 gregor herrmann add TODO file 2011-06-23 Philipp Spitzer Added some comments, removed and added some debug information. Fixed a bug I introduced when reparing the addRoomToDB function. Tracks are inserted now when importing new conferences. void possible SQL injection in function addRoomToDB. Removed copying the fosdem.sqlite database during the make process. 2011-06-22 Philipp Spitzer The database is now created from the program. We don't need to copy or provide fosdem.sqlite anymore. Persons are deleted now when a conference is removed. Added a file with bugs that I noticed when playing with the application. Rooms are inserted now for additionally imported conferences. Importing persons for multiple conferences works now. Changed UNIQUE statements in the database table definition so that they make sense for multiple conferences and do no not prevent successful imports. 2011-06-22 gregor herrmann Insert new field xid_conference into table track, room and person. 2011-06-21 Philipp Spitzer Created schema for the database with additional colum xid_conference in the tables track, room and person. Added menu item "quit". Removed data directory from subdirs so that the manually created Makefile is not overwritten by qmake -r. Removed dbus dependency on non-maemo platforms. 2010-05-05 kirilma use enabled flag instead of repeated criateria check add enabled flag refactor: more compact drawing of controls do not draw showmap button for event is there is no map for its room refactor: cache whole Room object in Event store room map in database show it if it's available, otherwise show a warning set proper values in default database new rooms imported as without maps store path to conference map in database path stored as additional field in conference table if it's null or empty, "Show map" button is not shown if existing database does not have the field, it will be automatically added 2010-05-04 kirilma UI tune: use buttonBox instead of single buttons to comply with platform conventions maemo5 does not print "Cancel" buttons, and names "OK" differently just use buttonBox, and it will behave properly at each platform 2010-04-23 kirilma restore viewing of conference map minor UI fixes fix size of UrlInputDialog restore [remove] button at the same button as [add] 2010-04-22 kirilma remove obsoleted code also fix some types optimization fine tune geometry to look nicer add authors for files reworked UI for conference editing underlying representation of conference list is also changed CC: fix endlines 2010-04-16 kirilma use visible notifications of errors also early detect parsing errors 2010-04-15 kirilma make label shorter to place all required buttons fix deletion of last conference implement for cleaning all views in the tabs clean the models when no active conference found fix cleaning model and signalling views implement deleting a conference pass event about it to mainwindow to update select control fix Conference::activeConference() to work when first conference is removed add buttons for refreshm new url and delete and partly implement corresponding actions also changed Online -> Refresh delete action is not implemented yet store URL's for conferences * use it at update * let user update the url before request remove unused code fix references in SQL 2010-04-14 kirilma save output from updater QT designer update all ui files to the output format of the new Qt Designer (version: 4.5.3really4.5.2-0ubuntu1) to avoid unrelated changes in SCM later 2010-04-13 kirilma remove unused class TabWidget move Settings and About to Window Menu * remove Setting and About controls from widgets * make instead a window menus with the corresponding actions * rename "Proxy settings" to "Settings", placing the proxy button in a control group 2010-04-12 kirilma build fix at maemo force order of computation some versions of qmake-qt4 require it remove ON CONFLICE REPLACE for events generate default database instead of using binary one fix event insert or update * add error reporting for queries * actually run check query * properly get conference_is from event * fix checking of non-empty result * fix insert query catch exceptions which leak outside of event handlers If we do not do this, QT will exit from event loop. 2010-04-09 kirilma use update for events when they are already exists also use only parameters substitution for these queries use transactions to make import faster 2010-03-03 uzakmat Preparing for release 0.4.1 2010-03-03 timkoma UTC/LocalTime fix for import conference XML, DB queries for multiple conferences fixes 2010-02-05 timkoma fix for import - ON CONFLICT REPLACE 2010-02-05 uzakmat alarm UTC/localtime fix 2010-02-03 uzakmat addition of Diablo specific installation instructions in INSTALL installation of 40x40 icons enabled because of Diablo release information added for release 0.3 2010-02-03 timkoma performance improvement for Events performance improvement for load persons 2010-02-02 uzakmat NEWS file update A header with the proper copyright/lincence statement was added into each source/header file. 2010-02-02 pavelpa corrected 'exec' path when adding an alarm 2010-02-02 uzakmat NEWS file updated README, INSTALL, AUTHORS - filled in 2010-02-02 hanzes Alarm modifications 2010-02-01 hanzes Alarm dbus connection added Alarm dbus connection added 2010-02-01 pavelpa gradient for treeview items changed permissions for the db - TODO: check it on the device compilation error fix compilation error fix N810 changes: maximized 'map' dialog 2010-02-01 hanzes Alarm dbus connection added 2010-02-01 pavelpa added 'settings' icon for setting-up proxy(network connection) GUI changes for N810 device 2010-02-01 uzakmat debian/control - Build-Depends section set 2010-02-01 pavelpa created resource which contains parsed schedule, so the user doesn't have to parse it by himself 2010-02-01 uzakmat alarm - example of dbus binding functional 2010-02-01 pavelpa updated schedule.en.xml to the newest version 2010-01-30 pavelpa changed fosdem icon in about dialog to brain-alone icon changed copyright string number of events/alarms/favs is bottom-aligned to the bottom of the icons 2010-01-29 pavelpa if the application is run for first time, network connection is set to Direct connection 2010-01-29 uzakmat initial binding of alarm to a DBus call 2010-01-29 pavelpa implemented 'proxy settings' dialog - user can secify proxy for network communication implemented importing the schedule from the Internet - usded url: http://fosdem.org/2010/schedule/xml - todo: hard-coded PROXY has to be fixed (add proxy settings dialog) possible to have multiple conferences in the DB - possible to switch among them - conference schedules have to follow FOSDEM conference xml structure - 'select Conference' bar is visible only if there are more than one conference available modified 'about' dialog - changed "Qt FOSDEM" -> "FOSDEM Schedule" 2010-01-28 pavelpa search fixed - only the dates (range) which contain at least one event are selectable - if there is only one event at a specified date - user can't switch to the next/prev date - if search gives no results - a message is displayed to inform user about it forgotten in previous commit some performance optimizations - favourities reloaded only if they have really changed - otherwise only event in the question is updated fixed 'conflicts' constrains 'now' events - displayed real now events, not just the testing ones 2010-01-28 uzakmat binary name changed to fosdem-schedule 2010-01-28 pavelpa changed conditions for conflicts some 'delegate' drawing optimizations - removed EVENT_CONFLICT table - used one SQL SELECT instead conflicts updated correctly - TODO: needs to do some drawing optimizations 2010-01-28 uzakmat package details updated to reflect the binary name change to fosdem-maemo 2010-01-28 pavelpa if no conference is in the DB, the user is automatically navigated to the conference tab, so he can import one search tab - header is hidden in case no conf exists in the DB event dialog GUI refactoring about dialog - added GNU GPL v2 notice conference tab header is hidden if there isn't active conference - handled some warnings 2010-01-27 pavelpa tabs' order changed 'nowTab' updated/loaded when application starts 'nowTab' list is automatically expanded 'conflict' list is automatically expanded 'conflict' dialog now contains list of events in conflict with given eventId fixed 'copy-paste' error implemented 'conflicts' dialog - displays rooms instead of conflicts for now - needs to implement additional methods in Event, ... 'alarm' button is hidden for not MAEMO 2010-01-27 timkoma search fix 2010-01-27 pavelpa removed headers from *.h and *.cpp removed appsettings - created 'active' column in 'conference' table 2010-01-27 timkoma refactoring of the TABS 2010-01-27 pavelpa modified 'about application' dialog implemented 'links' in Event/EventDialog refactored Event 'details' dialog - TODO: implement 'links' method(s) in Event and use it in the dialog Event 'details' dialog now contains also 'favourite' and 'alarm' buttons, so the user can set/unset the property directly from the dialog 'info' icon scaled to height of tabBar 'search' tab functionality moved to 'tabcontainer' 'conflicts' modifications - preparing for the dialog showing also list of events in the conflict - created 'EVENT_CONFLICT' for flaging events in conflict state - TODO: not finished 2010-01-26 pavelpa conflicts refactoring - has to be finished SqlEngine made STATIC implemented 'tab container' widget, which groups daynavigator with treeview - moved functionality from mainwindow to tabcontainer - TODO: 'search' tab not done yet 2010-01-26 uzakmat Addition of files required by the GNU coding standard 2010-01-26 timkoma unique constraints added into sql 2010-01-26 pavelpa just removed unused button on 'day view' tab reimplemented 'import schedule' 2010-01-26 timkoma reload favourites 2010-01-26 uzakmat Alarm implementation modified 2010-01-26 pavelpa removed 'MainMenu' bar from MainWindow - schedule is imported via 'conference' tab - about app is launched when user clicks 'info' button/icon import schedule dialog - changed to widget - moved to 'conference' tab 2010-01-26 timkoma search done 2010-01-26 hanzes NowTreeView refresh modified 2010-01-26 pavelpa "conference" tab - GUI modifications About Application dialog is opened when "info" icon is clicked 2010-01-26 hanzes Useless calendar class 2010-01-26 pavelpa forgotten in last CI new TabWidget - contains "info" icon/button to show "AboutApplication" dialog 2010-01-25 timkoma search update 2010-01-25 korrco room view added - finished room view added - finished 2010-01-25 timkoma search upgrade 2010-01-25 korrco room view added - need to test it 2010-01-25 pavelpa updated also groupings item (event parent item) if the user clicks eg. favourite/alarm icon (changes event data) GUI work on Event Details dialog 2010-01-25 uzakmat postinst and postrm scripts added into the debian tree 2010-01-25 timkoma search update 2010-01-22 fortefr Conference map 2010-01-22 pavelpa fixed problem with storing conference ID to AppSettings day navigator widget changes - changed from Horizontal to Vertical 2010-01-22 korrco room.h and .cpp removed room.h and .cpp removed caching removed caching removed 2010-01-22 pavelpa sanity check for consitency of confId in AppSettings and the DB forgotten appsettings files implemented NOW tab 2010-01-21 pavelpa modifications to import-schedule dialog - closed automatically after parsing/importing schedule EventModel signaling changed - if some of the data (favourite,alarm) has changed on the event, signal 'eventHasChanged' is emitted - all treeViews (eg. DayView, FavsView, TracksView, ...) have to listen on this signal Only favouritiesView is 'reset' when current tab is changed in mainWindow - 'cause time groupings have to be recreated, since favs may have changed check for existence of conference before inserting it into DB added 'Conference' tab - to list conference details - implemented AppSettings for storing Application settings - stored conference ID removed schedule resource file, which was used for testing - import schedule dialog replaces it's functionality 2010-01-21 fortefr Warning handling 2010-01-21 pavelpa forgotten Import Schedule Dialog files 2010-01-21 uzakmat New installation path for the binary, Maemo optification added into debian/rules, new icons 2010-01-21 pavelpa import/search schedule dialog implemented 2010-01-21 timkoma update for the search 2010-01-21 fortefr Time conflict fix Time conflict warning 2010-01-21 korrco exception handling changed 2010-01-21 pavelpa combined EVENT and VIRTUAL_EVENT => 'EVENT' now - Maemo sqlite doesn't support Full-Text-Search 2010-01-21 korrco updateTab refactored activities tab implemented activities tab implemented activities tab implemented 2010-01-21 timkoma first working version of the search 2010-01-21 pavelpa event dialog - details about the Event is displayed in FullScreen mode compilation error "linux" fix - caused by previous commit map is displayed in FullScreen mode 2010-01-20 pavelpa group items (time/track/...) are expanded on single-click changed 'Activity' -> 'Track' parsing activity from xml - 'track' from xml schedule is treated as an activity event dialog changes - changed font/background colors - title occupies more lines if it doesn't fit in one line alarm dialog changes - displayed additional Event's details - autoresizing title (if it doesn't fit in one line) updated alarm dialog 2010-01-20 uzakmat Makefile reverted as it was overwritten accidentally 2010-01-20 pavelpa implemented some error handling alarm icon/stuff is relevant for MAEMO only - used "MAEMO" define for conditional compilation MAEMO: work on alarm - snooze alarm - cancel alarm - run application which automatically display Event dialog for given Event ID 2010-01-20 fortefr Warning icon (uncompleted) 2010-01-20 timkoma temp commit for search tab 2010-01-20 pavelpa display event details in the treeView 2010-01-20 korrco activities viewed ordered by activity id and start time 2010-01-20 fortefr Big icons fix 2 Big icons D icons/favourite-off.png D icons/favourite-on.png AM icons/favourite-offBig.png AM icons/favourite-onBig.png D icons/alarm-off.png D icons/compass.png D icons/alarm-on.png AM icons/alarm-offBig.png AM icons/compassBig.png AM icons/alarm-onBig.png 2010-01-20 korrco static allocation instead of dynamic added when creating activity map 2010-01-20 pavelpa some drawing modifications the most recent FOSDEM 2010 schedule http://fosdem.org/schedule/xml 2010-01-19 pavelpa pali, nerob bordel changed abstract/description/scrollbars color in eventdialog 2010-01-19 korrco support for view activities with their names added 2010-01-19 pavelpa event-dialog - displayed persons/presenters names - implemented Event::persons() method to get persons names associated with the given event ID single-click is used to open event dialog diplayed map is closed by single-click, instead of double-click work on alarm work on alarm 2010-01-19 uzakmat Addition of files required for a Debian package and Maemo specific files 2010-01-19 fortefr Favourites dayNavigator 2010-01-19 pavelpa schedule.en.xml is now in resource - for testing only - will be removed from final application 2010-01-19 korrco minimal size for tabs set 2010-01-19 fortefr Update tabs 2 -This line, and those below, will be ignored-- M src/gui/mainwindow.cpp M src/gui/mainwindow.h 2010-01-19 fortefr Automatic tabs update M src/gui/mainwindow.ui M src/gui/mainwindow.cpp M src/gui/mainwindow.h 2010-01-19 pavelpa set MapDialog title handled the case when the map is not available map-name to map-path implemented - correct map is displayed fixed: icons overlapped 2010-01-18 pavelpa started work on displaying map - implemented mapwindow - map is hard-coded for now TODO: finish getting map path from the event added maps pali, nerob bordel implemented 'Event' dialog to display relevant 'Event's info 2010-01-18 korrco sorting by activity id added 2010-01-18 pavelpa autoresizing activities treeView implemented drawing icons + number of favs/alarms in the corresponding group 2010-01-18 korrco grouping by time equation changed - beter group deviding, also according to favourites activities tab implemented - need to fit gui, functionality works fine activities tab implemented - not finished yet activities tab implemented - not finished yet 2010-01-18 pavelpa added 'alarm' columnt to the 'EVENT' table to signalize that the event has/hasn't alarm set 2010-01-18 fortefr Favourites fix 2010-01-18 pavelpa maemo specific compilation fix 2010-01-18 fortefr Fav table update M trunk/src/gui/mainwindow.h M trunk/src/gui/mainwindow.cpp M trunk/src/mvc/treeview.h M trunk/src/mvc/eventmodel.cpp M trunk/src/mvc/event.h M trunk/src/fosdem.pro 2010-01-18 pavelpa added GrayScale versions (inactive/OFF) of the icons 2010-01-18 hanzes fixed sqlite statement 2010-01-18 pavelpa fixed: broken compilation for linux caused by previous commit started work on alarm(libaalarm) used 'MAEMO' define to create 'non-virtual' 'VIRUAL_EVENT' table instead of 'virtual' one, only for 'MAEMO' Linux stays untouched - creates real 'virtual' table for FTS support 2010-01-18 korrco current path print added 2010-01-18 fortefr Temporal virtual_event change 2010-01-18 pavelpa fix: segfault - fixes segfault when switching days in "Day View" - TODO: needs to be verified, 'cause it looks like it shouldn't work, but it does - when calling 'QAbstractItemModel::removeRows()' it returns false, but it prevents application from crash(segfault) - possible explanation is that the timing has changed and so the conditions for the segfault added "Quit" to "File" menu 2010-01-17 pavelpa implemented method to force 'EventModel' emit a signal dataChanged() - so 'TreeView' know it has to redraw items corresponding to chanded indices (range of indeces) created 'global.pri' file, which should cover all global definition of the project - this file has to be include in each "*.pro" file, where it's needed - defines "MAEMO" for handling 'MAEMO' specific code in source files - defines "maemo" for handling 'MAEMO' specific files in "*.pro" file(s) just minor corrections to 'event' started work on 'favourities' - created tavourities tree view in the MainWindow 'Favourities' tab - listed some testing 'fav' events - TODO: list isn't updated dynamically, which means that the list isn't updated if the user adds/removes an event(s) to/from the 'favourities' list implemented JOINing two tables - modified 'ormrecord' to support JOINing two tables - modified 'event' accordingly, since its items/columns are splitted into two separate tables 2010-01-16 pavelpa work on favourite - created 'favourite' column in EVENT table - modified 'ormrecord' for setting record's elements - favourities view not implemented 2010-01-14 fortefr Compass icon Map button/compass icon added Testing svn, tabs added, misprint fixed 2010-01-14 pavelpa just some directory renaming - renamed 'model' to 'mvc' (Model-View-Controller), since it contains also 'delegate' and 'view' 2010-01-13 pavelpa minor fix implemented day navigator widget - to switch between conference days implemented 'conference' record for accessing info about the conference - events are loaded from the first day of the conference added about dialog(s) - some modifications needed - About Qt: not scrollable - About app: modifications to display items in system font/colors needed added application icon 2010-01-12 pavelpa implemented xml parser - parsing Schedule modified model-view - created own delegate to display TreeView items - contains also 'controls' - which are clickable (handled in TreeView) - created own TreeView inherited from QTreeView - to handle control-clicks of the Delegate - minor modifications to MainWindow UI - QTreeView replaced by own TreeView - autoresizing of TreeView - icons added 2010-01-07 korrco TODO for exception handling added support for creating GUI via QtCreator added 2010-01-02 komarma Creating EventModel class 2009-12-31 komarma Fixing datetime conversion 2009-12-30 komarma Adding database loading and data conversion to orm module 2009-12-29 komarma Adding orm module 2009-12-28 komarma Creating initial application directory structure. Creating initial repository structure confclerk-0.6.4/data/0000775000175000017500000000000013212517317013676 5ustar gregoagregoaconfclerk-0.6.4/data/confclerk.10000664000175000017500000001570013212517317015731 0ustar gregoagregoa.\" Automatically generated by Pod::Man 4.09 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .if !\nF .nr F 0 .if \nF>0 \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} .\} .\" ======================================================================== .\" .IX Title "CONFCLERK 1" .TH CONFCLERK 1 "2017-08-30" "Version 0.6.4" "Offline conference scheduler" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" ConfClerk \- offline conference schedule application .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fBconfclerk\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\fBConfClerk\fR is an application written in Qt, which makes conference schedules available offline. It displays the conference schedule from various views, supports searches on various items (speaker, speech topic, location, etc.) and enables you to select favorite events and create your own schedule. .PP At the moment \fBConfClerk\fR is able to import schedules in \s-1XML\s0 format created by the PentaBarf conference management system (or frab) used by e.g. \s-1FOSDEM,\s0 DebConf, FrOSCon, Grazer Linuxtage, and the \s-1CCC.\s0 .PP ConfClerk is targeted at mobile devices like the Nokia N810 and N900 but works on any system running Qt. .SH "OPTIONS" .IX Header "OPTIONS" None. .SH "CONFIGURATION" .IX Header "CONFIGURATION" The configuration can be done via the graphical interface. .PP The configuration is saved in the default QSettings location, i.e.: .IP "Linux" 4 .IX Item "Linux" \&\fI~/.config/Toastfreeware/ConfClerk.conf\fR .IP "Windows" 4 .IX Item "Windows" In the registry (search for the Toastfreeware key, should be at \&\fIHKEY_CURRENT_USER\eSoftware\eToastfreeware\eConfClerk\fR). .IP "Other \s-1OS\s0" 4 .IX Item "Other OS" Cf. the QSettings documentation at . .SH "FILES" .IX Header "FILES" \&\fBConfClerk\fR keeps its database in the location proposed by the \s-1XDG\s0 Base Directory specification : .PP So the configuration (see \*(L"\s-1CONFIGURATION\*(R"\s0) is stored at \&\fI~/.config/Toastfreeware/ConfClerk.conf\fR and the database is kept at \&\fI~/.local/share/data/Toastfreeware/ConfClerk/ConfClerk.sqlite\fR (Qt4) \&\fI~/.local/share/Toastfreeware/ConfClerk/ConfClerk.sqlite\fR (Qt5). .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" .SS "Main code" .IX Subsection "Main code" .Vb 4 \& Copyright (C) 2010 Ixonos Plc. \& Copyright (C) 2011\-2017, Philipp Spitzer \& Copyright (C) 2011\-2017, gregor herrmann \& Copyright (C) 2011\-2017, Stefan Strahl \& \& This program is free software; you can redistribute it and/or modify \& it under the terms of the GNU General Public License as published by \& the Free Software Foundation; either version 2 of the License, or \& (at your option) any later version. \& \& This program is distributed in the hope that it will be useful, \& but WITHOUT ANY WARRANTY; without even the implied warranty of \& MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \& GNU General Public License for more details. \& \& You should have received a copy of the GNU General Public License along \& with this program; if not, write to the Free Software Foundation, Inc., \& 51 Franklin Street, Fifth Floor, Boston, MA 02110\-1301 USA. .Ve .SS "Additional resources" .IX Subsection "Additional resources" .IP "data/confclerk.*:" 4 .IX Item "data/confclerk.*:" .Vb 1 \& Copyright (C) 2011, Christian Kling \& \& This program is free software; you can redistribute it and/or modify \& it under the terms of the GNU General Public License as published by \& the Free Software Foundation; either version 2 of the License, or \& (at your option) any later version. .Ve .IP "icons/*" 4 .IX Item "icons/*" All icons are taken from the Debian package gnome-icon-theme, which contains the following notice (as of 2011\-06\-24): .Sp .Vb 12 \& Copyright © 2002\-2008: \& Ulisse Perusin \& Riccardo Buzzotta \& Josef Vybíral \& Hylke Bons \& Ricardo González \& Lapo Calamandrei \& Rodney Dawes \& Luca Ferretti \& Tuomas Kuosmanen \& Andreas Nilsson \& Jakub Steiner \& \& GNOME icon theme is distributed under the terms of either \& GNU LGPL v.3 or Creative Commons BY\-SA 3.0 license. .Ve .IP "src/icons/favourite*, src/icons/alarm*, src/icons/collapse*, src/icons/expand*:" 4 .IX Item "src/icons/favourite*, src/icons/alarm*, src/icons/collapse*, src/icons/expand*:" .Vb 2 \& Copyright (C) 2012\-2017, Philipp Spitzer \& Copyright (C) 2012\-2017, Stefan Strahl \& \& This program is free software; you can redistribute it and/or modify \& it under the terms of the GNU General Public License as published by \& the Free Software Foundation; either version 2 of the License, or \& (at your option) any later version. .Ve confclerk-0.6.4/data/confclerk.png0000664000175000017500000013402713212517317016361 0ustar gregoagregoaPNG  IHDR$$.0pgAMA a cHRMz&u0`:pQ<bKGD pHYs B(xtIME /\IDATxwx)[J7ܱ1` w BiH4BB&! ޛ{Woծ*yyxfgiw==p1AAh   HA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh   4 AAC  !ABA ! BsHA9$H $AAh  |lƍLy ABA]zv5ײq^|Ec,cAAŋqyǏzn!! NfM7 k 8C[z'_/Qp<ۃիWcΗ OlҹDyy N/JKZE [ xSN:= (-н/Ff`4Uk޼yn()za0bÅr8rDuUwfGi'PQqǛm-Xj5La<5(/om݊7*076YP^~P^^z "''CdW/2zDƄ <9\qChgO@^H9CI ;`XTԩSlM$*+ԩĩSUWz?OUDPVVƮz! b$'$Df32L.G,6Qի9thUףEEEpMYxugo ~:S~dzQR¡G3gv/um~!'p:X^̜ɡgz\OQUU+\cFϞ>t&cDV+=9HRm<$u @n*48 99&U׍LtT}ذῘ0A@icr2ݻ(-XTh$Ib/"^z%JP$YE.]z ׋I \[+XtQPPX>C|Um-CQQծsW$tơ%D]]@{k|3GƓOh.C(*RO|>7 (QV&Xc uu EEy7>G,ǫυ@7U}w^v 7ty2FEZ2>͟l|~ ?E,`0~M¢(!]_/DkG^^Jc|>oq(*R!ZBό=8fc0{1竷\NO{˩^'ԃ1)SȱK ZOd`f !>DAATWPPq_իN$|>@שrO׵|U{} ǫg(*ROD{H3UE ="uEM^Uh&9~84ix)x 8>Hs[ D!+ˠj/P ~xm> JyUR[$|թ:l1dK6T1x>u+~_e}D wecƌ={Y"- [<$]jo{2}]51r,ݮU[56ފUZ !ĩ*_dlSi*]VM-Iտ~C,[1%8*SSwb֋7O;Uc9KSJpb~;غu+׶HK6 4%|r6}^y]eI\$S)׫7^Um=.(zen@xcqV]˔ks[%?:*]T vET79^ !Ѻ>ńzǔ]NpĂ\QWr]x|z>9.鮾䣏>b< 8u:4Ғ % ]ferbDa:Z='%#4K[FIuV/lĜH& dQ ZfNBct?kjdqe0k%ZGcc#<> P)*-ͭ$H9 gQo},K$SGoT$bbOb+ٵy=:&7|z@h ,1AVOM-SCh5C GjyrAJ}l $8rTH A녋p|=4 !x-I$*~d_`Aeh_[ouXp0TeB!W"eL $L3SԉD0f USI!S f;6g-<`*/C+s+ "!`J0FPC8YR:CkAQ1 *]? V>Wݥ %) i yneHT󬦎k'A?Be[pHڵkСC/6t^3 ".LQ ?˫us/>CVaɗaT}@ rTPlOzmߙO;hȁ)A:ˮgHdc5:3f%>EFjk"]:{6jmQyEܚNHqa? U5I:p T7JC{\[]ih2џPy2xY1 EPCWFN Hjj9(jlڴ 2ߐZY]m0 !’,3Ao(BdU ?T OƩdIM^x8 g%8fL; :u'L: GcE].+jtCnH~_3gYQ]X-̭$H$rMF75l@0ѯp4I^R=BhFkSWתk ]1)Z-y.Se`ꖑJQW]+^'ΰg6r(O/75˜`.6 .qCvڡx=qaRbCc]@%DT a* U ɾ}H׵)R0E#eoe6@ӒMe"F4&2\g1fv$0K/ĦLcO!^{Ë:,[ iY)Fӿ9'1'(J셠3P{}m LY|yEo.9Q<s09qBpuu l#| "S2ǵAhFXNxQP^Gk!DѪj#T&WW\%S[T3^Ҕ5Aeе;vp 8x0ksCtr+ . u㛅0|޽ ?|@k.Cn%xxfۣ .NyqLXuu +@bzzo:(h0@01z'pz}S~v-D`V0>|IԁtzMy!w5<'C/>U$ <>ygԩ_,Yڞ ljgjWk3_T<% ߺ"1'/ 5~ϬHKB{H5$H(ˉ$f1j-qU_Ooq:gK\,pÅ0cv\҈㛟/(Bn>ir{~D ɪ$;eQ+ӕdz+oߡjCu: .DvvⰯOXJP`kxQEE%>d|̷nCAAwU [٬^`'}b+I  8kDze`8Lxg1y\chllOz1q:x0b($Ip:v8$ 31H ͎ç49(v*00nWӜ0#=: N@3,>@a N| 1PL&дcr; ,`wqGp|6K0 邸M~~( C[F,}Cc=խx9GA$ֵ9 Jkg((P?&STbBC~~>%fpyURo"tbtfWk6yv;d9vn 2݇W_uu z‘&߇F '}I4n~_Λ_Jk$V$]KNEezI<"MS[HuQۃuS\[lիWǻ`D+8P[ K&@}?I dUEPߍx+Aڽi>ؘfde4r<^۸qny'_Gel-nw@Riskǎ!ma#;AxAN B؅ðxŵDU*-<} ^SLqV'= g1A5:ucx31:3&cϊczi>;yVj/A.ZoCߑذa馛h"6koJ.HI^-٠ ˲ AҜ(-|$~wmAQIog7f Agu%AL _6^(P}!2x!ܯ~.t6jfNgIa!?x{~(64S^7O&0 L_^3czc^g}=C^m%2 s #xEt(쥗^bSNʼnSd|winnU#0-EAFRNgꖒ8p@eR| yy~d,[-w0|xK6}Hvm7ݤε%o ɦ=<+@~nݪ&~nۦljN/valQPŦgKV%9u[u~ArQv 7ȑexC* 邸NID175 ˗WСnacsϝފNs4 2D~.P^v>]^/`С*]O{?HQmۦW[ W#7+4H%">R,Z;k3g^.cN061lڕWNQ}<ߏݻ=EɱcǏXqPC%p"-i/s+@DsÏc;J_ty>is> .Νe1_޽;nvjN>q_{To zWJkWc]X`A{KOi|d?FTOꊊ v-`GYY{AӞ_@:HgtE8y$ԪJr ۓv%H ylٳك~^Lb$an%I#77 4iB{-F-D}c/B:)Q2M0ppk2ahtI;!j-uA2|v]wBa\oިmn%AqWj=z6ny. ~ bhPԨ8"wݨئ( l6[[n`Dlev-lPI B1o1wEmʲDՔu>޳:F X(l7%=>~;pVwaW\l Kn.#r> .H^6NEڃ`ٟH%L&jkka4[V?-|oĬYJIpDG؏M0to+rEGlƨ$)2㉌)uq,ぢ(3c~4R KZ8)EEEv%~_7~SuM'ʭ?8;[s+ . p:)'.RD-e.SiD b̞,?ɏobРZO1̶m[QTT^zk2֭[?…Kn7|Ȩ$Ip:E^cc#ZfT&[n}ï~|>K~cAXx1|:+ ľ}`ƌ Z}ngl>ӧ!''yy`!??/4î]C'ND={ッUt~I\va1 8thXLk6m&N?رcc2ԩp8?ڵk0z444Wz$aI]sAz*¯qn 7\%V^ Y;y8(SO='xwu7֮]~[nou)fL8~t:|;vncxp\x̹ Aد0~ 6 ?`ݺu)SZܯWOÂݎz˜/qo$+WDvv6O>{Gx_~p.Ɉ#[V<أ_^ B={vc޽穫ôiSo߁]vO>Ƴ*bjkU-÷w};J(шc gb9rdQ4h -+ہ/J:$7n<ƍ={a޽e)N^v-6mژ܍رcGB|'o:]Dsӟ?m.mV5eAҽκM'Ga&LK/>QT [YNn'ADEnj9'J|G5zտ?x$bi_Msu뎊9r.B,ڈ;wDcc#| l6p 1SSd2pUנ[Rvwps;:~ &Mۍ=zF|E***kh4Fe(--A]]z֭MzGQ]]gi NeP1'_RBoިanIÞ(ÑL:9 T[lFCC:Ir6ϱGrJ33FªUk.7@0UUE,\5r{=8~XN>bkĶm۶bɎ*~%%ڞzTWWcXl?5'Vk>>}Zo߹sgWxLqK.cGz*\yU[QYYsx[nع $E '9>cdeCϞ=ti0ec :,,9t܅ F߾rw{<wJQ'W(W 6>>}E>jjj0qĨc-ӧ{JMp7c̋1lp8q틸Y?~ľ;vl-܂`͚F`uuu(,,J8^%ǟ8{$?W_ wO?$v܉;wFgIX:vD.^7߆(xG1W n@߾}qQA:x`‹=Ҹ"55-XVϚžp{bЈ&sk[If!7ɒM2ARQQ6Ƣ(7'|>.{}x≧t۷~9ca&/ƫkw}Oe˖bȐ!شic8$F_]]aÆa1_ZxcvqAY~xWTTb„ x啿*c~!?°am1<z߿0p@tBmm6mڈ/Ei"A4*1ii4h0\pᇿ(-_)̛7_թ@%Ǐ(n<1~x?8~~}ܸsXZ 3f\E\|lR<ܳQK]EE{H,HB __"!!Ifq_o^6,|>_D XVoon\sK1W\qe=yL|n   c }􍹴RXX7L~唕ΆlC=GJJ6m:F#F^=6n܀?ǎ7|^\峘8q|$>/||^Ea<ϷqcxѣDmя*--kE1BLv6mڂaǎp\6mfZ`^7oSO=N_o<|5:+((DCC{l /)Vn7я~?5Tjn%AŰq F˯@IəX]QGm[}}|DEJit:#;z%YaGv>mM Ĝ())m%+++X#+x8yX !͛7A㭷 ϖ͉\:.*eT~m]/nKyɤlϪfZ}\P,1G,/-M;/n{#ӏ-ZN8|稨:55)b+S۷-[xMjr+ .F07 1 yW_}uR(:(&(JNΩSruֈcdY/cQss8bɘ𘲲x?۷z.ΝcH(8ɓ'(gCvvv4-q:13vb$P$HԤ]C@b$F:m1 b&Y 7B ?EIIv%x^| Y̒h.JJee;-㷿}58p`%£!gQz"c DDb-):"q!u#гg6zkN<q"Q%t^{5ADcc\/uY֭[xA? [RTUU I؋/^z "TZs+ .F^6*8;[ B`h{K\ Au<1bed"<$<Y=9Zfrmf?fϾMN ˏ|\ЦsL8I8^"b .@]aa!\.W ϙY'JZMI޽{ 7܀ˠHV$]x5,? Cϻ(kzE,@7a!IU#$pkI`l%bP?($!4b ʡ( Yn]Pz;q3$ރZ)k05 B5Q_.}V+צ{iSO5xV[It!K <$=IZ 2nA]$tVx Ȑ_CQ, 0VY!@Kï%F+ =V@n(C#c<+m 9#/0+:MPsixMIl?nF?p0ܝJd6-./g} o_"Mݓ1帾w!Ie}O!\1E0 ZFVAS+$E$&5AR\ܺ,*v̙7 EE:+!sk2Ht!:NdgΘa}'JL@$@pAK󿍳 kЖi z޽ 0wq=!_@[z?qpd3 8[}8n&xrfPtҚ~6KM}GlСX~|u47&O#QQ4p8IjH4GuikmIy)Ix]%X;.DH(Hx~ae*$< <Ÿ>.H8NAxTI{_xGɴW q*[ދ<r[t,~]Q,?YEe߻eU5?a`lxӪ7&}$yC1:vw9snKt=R1Ro"񉫴Zu3嬃9MHBK62+!IYxMA#$~5(V0W%4J<d9~M xS"Rc!y = ˷N!߈ygiՐe>\ IyOjh%HZ! -x^ .D'dnaQoZu!C)lrm#Hr${QQ(=FFDƘ c[/HcLPCY6ʐ iMb+lق!C~'ZJ.fÐ!aѢEؾ}t:L&F#z=,lp<@NN.xGv([ L1ji'bq"$~N \1j Qhdzjx|H (W^y?* B$kvq饳1zh(3!5Աr$p4uHml: 6w||xY y8.}4++ z.܎]b|lܸO`4DYYY! >$`ozgC{>x~jp8?䁱 PFp܀Blzt`) "xc#OsskK/ .DC?Zx0eT\r%:e}q{aa5BeY:3x( l6[8!ClHp$(Ԋ=kۏ9ل[DfX4tII \<nSB3E DI-*J}jÉ'S:z3 B ŏ8X,Y>)UU=z θb61@\Q؀ʊv턢(8x<oL (QLD\,q~Ʈ 9 SEjZ#Z['H&o=v_6lĚ{ϞӾh_[It!wuSKZ :HRaψ x 0xǓR4ߖ,Jz(Qx㮻HDRQcrrrR*.<EI_[7 ^әq[cjZKP^^^Jq-s[oc+Wºuf:l۶=BdM֟'M$H4OP7qwl45!= yċD0l0[^@:.1r[礼l:6Q(dn "H(Sl/8KЫg)z믻kNf~˿]oWDyyyJcXV$]`Ă$q/ YVo$ Q kt"QtBQ Q0 /{?|>o$yqj KgcԪR)veA} 6u`Y%ۧowmGc ^ ƪk4Y"G,s+ .D H (uH|>t+8(A@0SIZ3קI X(J "ٌӧkE֘Ν}1Fb\/tQ466׿~.Q(Q[ՅECiii}tc~q:ؿ(?t<֧Ow{w{-^ ^%KEKs+ .eFc⇰A}2MP<f0E(4(~ Y.lè-lx"8n woI{ ֘;Jh o-$9"vPv{Qbcc0vh4v!,xcjǺjAK<,KQVVVZk*jt)&QW׈[yU{97s̹,ucW ܹ8y4 "$˰QL"8d(8Nz8(XǸN16^0jUGÛ2xIZ-Oģ=<$hdH $#??'?*~\.Ȳ #y!hP.WPTVVϦNQǏr,_l8r8o4/>6mތO?K⤳Jr`6ʯ̲|]~D= T(Jۺ>V^C:!s+5"$81I(C!?c<3 ׶1CQ^<AHm= i_S+c"dyaI̮ -X"If,h!ZNmj-zI[._/.[v7n;ܢs{w'޽{ir߈˗/'AUH(ZGAďp 2$i!;q7Z!q+MY;`(XA 4]*6ʲa P<7!H[j]?6Zׇ[|6lOp{wa/p嗁"K9]8;w%B>6l<$-,燗UEE)]Oy<_ yeBE ӥFC{x sV U7^ϗ93Eh!I][p4gFX VoAQqqхpdkLQ`2ѽ{/曘2e UjJ$t$Sk%Eɍc,'ϰ 8{ bHo@Q*q p70 w3=>T8CPh!IUӈFQ:tGnn6ƞ35/%W={}8xS0`ЋЋzK;5 YђM!#Z!i5I* <Wx!s(C!A+C>mߺ ~!Ə;5<ɓ'qwr\3tR1vtHR>YߨyG<'9n pHc qA:~Ղ"$tޓ֤O?]t.znuX GغmrdsobԩZOC^' ;ˈ?'ڹ3lZM .B,!IgǹX#7؝yŵzoGТ^[!A(~6E8r(ƌ۾soODAz ݉Ko|s`⯹O?Ç zzO*>Db|A](JnS?K󡮮=`}1y>7c4a29ovvNa v L {hٶ%"HjlG&j9elR^YӸOd;w{А՚SYY?f3/:o:w ׳GqY 4DyF It\.kЎ`31e9l3m&K>I .@2C+^SdxIٿ pW&ON_|Ff*Nl]@of}?Rf99g]IDA$M"\gcUX~ lفa'ٺqxyگ9$aժص.9ܜnbw{v(zzO$$HɊB(J&]6'BQ.,fܸszn9hkžA@cc=tzS7''y>2 Zm~[q盛n5 ۦhN aރطF97_UT԰uСZihOb 'cշ_??c"E{DA J11lL8!IBh&H;qpUD $&sI!y)dQ¿(WC ,$O!l gDn`ĸq㵾-9r8jJJR~R/Gs;6iTOza4&p]\lިJ*W[7+;n|9w)b&TW׵Oۃ.C؅LƆu?{y_멥D:|" AHIGiE  VU88Y~*0x~8@+Œq)c[(=F <_ Y18nxB*r<'I0KueDj-͋E=[\\ Î*^EE5*/C= qb#Xz3l6eeqx9.|߹ f~ED2tD1z⬱ْUie`7YQ @|$i$;S+AQ^,_ IEyI%FxEy OB+ B*:J?$lX9d-2Ԫu=8~6%%p'uĉӘB|ZU{Ӧ(fp&?\k[oE_,T83Afˈv*i"H%`(?(9JpO 8@]#>dy:PIII~=OKlFrS"ŋ㫯mZMZ; $a28/D '|:He^pv`, | IPuSj; 1 vB‹~PcAYe ѾީS'S W"$-9y4*ʫ0n(\2kKdR$IX c?Ⲳ,hQOdƻh5@ `[fxC||}ϛtɦxHb-ٜ!@Ǎ((at$@V[udtA^Y+1}HZ&EH[K6EHJJP>=$ 7lâߢgs -Yf+,]bF} }"I10iNu۞ZґLlB?̄,1( YVAx0vnӎ%H#˔Y >,AkEEE)g[a5j6Wss.֯V%۶]O>7jM뉴$8xض}۴igL^'MGC!J#w(E)jUcX-x~b5[[-q#770`I-&lz됌 $` (d0jg׎!i <3Dq-rHR/(zČd ԚjDNftm>v$}}u(--zJ'K0믵iDJfˈ۰a{y.HR5y<Z;ʒ$6hH.fϝ0^(i"pn`,(^I*]X+B466Qa!$!vuu +1xp_8u]nK:DAK6$l˖]ذC'a#yHEH:"^H~#I:0{OQ8I8z>W6fF4v^3W_u,Ye?^55x&ܿDA$Pykn1ZB}a_ 3uɁ k.t:, L&3f !"rrr!T?ɚ(`0˃-I$EEŨA^kZ3*BҜ{`k⋧ //+VnzJػ0 F=zطo?>}:O$$H20?ʾ]Q&Q>fs⊅yap\獍e6 >G jvr"f<&tAmM&Fc!;;(x|XdeY`4a2`6a0`dȑ#Ŷm[Qa&N!A, )--]T8~-] g^|"+˄7^;vڍXD  eTUoֳS*U&0r( 6]7 񠡡^/b[766Dgn:uWx-tвN(c4-$Bܷ6C}sss3A*FC`W(fG$5Z$ݺlMӕX̺dAҥk݆֮k!>#L6NBOgAzW$tbFgv#Y/>S6m>zwkUW]t_%h-؀G:PCC N>I@IDQ*((T;Q"$eD (jLM|| nBQ[[_ٗ]˃ui:|vګx뭷:O$$H4 غۛfԭ3ђ I,6Ngeӥ!9#ǃ;3 F"?QQ(tLh$IE1N'(F***p|'M7"B$39jMjt`Ò+0 y.M0or~ոk3O4Zٽv\y9[gC%yޯ_<EQ[[jjPe˖ e2`ٛφb;v4}˖ų·ƾ}G4OUu,YYLcBvIXd ;vt,,Ø1c{o(@|ug" y;r۶.۷zKhnǹNlt+DQ+AiƔdSk,**r:̾t:QSn?Rs?^1Aܢc<:0$bӦ 5 6mƞ3 z²@*4Q~%AQh6zHҽz1vEQ/Á੧HJWfZPSM 5o[8~rrqݵ__X{hjwZߖvI;Z9t[liǏĔssضmV^A=#ϟK6Z(ʟ|Ax< 7ďlFnQ\\ܮ%[*++ñcGѯ_i;vĉXlf_1zHe{Q\T+.>_\l6VڌO` t H.KaOۘ}zwǬYS`֝D}lΎS6`c`0BF1#]8$I%%H_-d_yyyظq=fAQ466@ev~\x n7jD}{8u$q mepACQ ^,sX,~Y bEN.;eSk\SkΪUpճ0~Hl٢u˖=j rYg?J";w`,__V ^0Ç䪪j_,BC}cu/ 8eぎ!Hqq>0pp\n{XOr{c:J/ 3'ԉ8ދmK};s,X0oV} ش,~EQ""3/:aÆlQ|^o:$K5djMs8. @/c\`lx;`,7-b ۮB& L1{nr{ЧOO#{Zz44ذg~\z4|BMrT%Э[qdƻšeeٛo}tk!5q)|Wس@BR:$"$Sh]P\A 7&~w!xyrA+~vpEIlA2Hhekjl-))ÞlRe}ɱ`ZO+Vl0֒G.Z?$y߽(`eXfS!OhNCR}>_/A?,w |sA$}&_fTAM^}UR "$"BlRT$`M]X8yu/ĝxu Ba)UWw|ZL<۷W:$]H@d0(J18nt=R@W꤫6z>#2K2`kٔ{5u8ycǶoϯTXr. 0Ƙ(Xzob\y'] A1رcO?nW%2/^<3xzz\TȎ z}f$!iM?+\.SV{0aH͋38Q|!Sk+m_~fY,IQQ>Bb]صkoKTD08< xy0VQt`l-xY9ZhI} f MqN!ˍS1fPlڴSӹܹ&TuI2]hvϗi#;{-8(+K=*ϛ ߑtLd_q@zB͐"(w//:JoD2OhOSXa`QVƏolk !Ic̟-;tDZ4 }t v-;~ 9 eNCC1C E^G)h`,sIk~Պu֦oq6[SV ӍʊjGl6vXkoH$ IY͊zKĩSgu>דHGt,'~i# LxfZ$3~SgSXX{Om1j M lwLNl d?2mbd1;Wpb ZIZc#yH|>_ L$HZC& .3Ik1FII m?="$EV܄ 2^eǠA}yv޵_s=6@C1qR~3eCi-S+ᴣH멫c ǎ}sQ`҉|$.B~?Y61o{w¯*F`$QQ4 X555&f&%Ȕz)$HͅFbk clNoZOUE:!APlN|hlLM~pUpyKt,8Bҷo_WfA$d`@nn.DQDnn L&3, t::f[4^fED"#??itf:J(fF_I5/qʲ\Xj\>FjSi9Ǐwn#!A|nwz>'M3&#XnKzx8i)qf^t.9g8֯ۂ}xgWd2d2'|c!/"ڤDNCCcL18-O2C!r[[">Zёz%H8˘~6OonYW)NuU z,Ş=Y[M-]Zlٺ}2EQUW^}{bҕ8BM27rz8jI,|Z%|rϋ!LIP=cG$: M "7%p7i=eթGqqsٜ< YҿF7\? oPW[qCQ"Ӿ뾱OpG 5"j[hqy>"HBߏJyyy1P~ke2bN8-kN t1tTcl5Q/-Y,YuxZ.xx}^$ii)|BOuu5OC'-d^2C @'?F1 Ȳ3# G:ultv.S+f:%>_(jХ c-\*my992r|>,] 4tnPu4>ݺuO?N'O&|"y#">-M̱$IE19q<Đ!JUxaa!z;L8ւ )))TC( bU h/ՠKP V`wGٸep=Xd%$M-yI~ǜ9j ҚT]ͷ}' 3BMdYVZ2}K2QG2N/HBbdW˱oߑ#˖j#FP`JѣGЧOߌ =Ds:ZFW<`0 Č$gc6ySZd}<$/}elvhͲ՚{ K8x(-}^vݶ̅y\{L z|`YF* ?#?~I:͍ w{^8.tqݞ9ypeg'~JJJw_t1EG%cɢXj5FaoE<\ge=zKMۼfϞ, 4Juu%z5j8N>=zj=І  ۍZ4l χ߇@ A! #x?cc ,1Ea, "tz= z,Y0gY`6a6aʂ%+  -ATPPK+ SZZ**D)p3uNTdx;rZV\|,5$۶mc|^8w8~tL*+Dnɒ5ApݵPUY];ӓs6Vcذ{q1/p*SؙȲi8p@(zfs隉)AlfF`fMip: :=:'Bxz<1Q -ƈy 92bd6#Jt󼀬7`PCTe\ =77CgjOBbl!cIaCeT# h mvk}yt"t:ݺ"77/wޣG6 ֖wypohhik8NA u:^` c ( "Ej/,  蛄,PniI,~X"l6x& v{nNq)(GuMz"+]:u}PW릏GjЋaszpѪ,ѣcǼ/kVՠ_~i7~EL27 UOsDo =!rwE^sA:wm"}">%4 ).\CByͷyLJk` MQ;pQPt<  BQd0AQdȊtOH$و@@( L w`@> ^Qo14z>XDQ@a Ssx `MYH>@ϋ'YDF7P؀BvvS>2={B 1_=r$/:78o&F Ļ X"m&VN֭e2ڒJ_i*[k-!oKKBUJ[0 V=>Ghy%QP᱖8]NўzH-jɒyɜYtDUBMżeσO?˗/oL0%% I~qGj;=zJMЯoO NT$^[Q}KpSׁW !:knCUu]nօL=6٢( jjJdg^cϋ&rrr|DGC\҉ACpI0^?>^~3gcĈZOSuKW%aȐ[6IDATGɩUcܹ{rA}!?:.݊o _]Qg8xp,Ekڙ,CD_CE%rPq"G/a)aNଜ(dFC"ݒ,Kuܼ(As@qAAԾYt{K,Ebe-<eL058~`=üy>ST,3f]2ofsӧ;nt:EHB0؏~{;.B( >;ܴͼh l)PbL&3nς `외oqP>0/vY;$I5M(>@|`-m&*]Qn^S>(q3zA ]!26F\!ќ%_ْPHsDad*N9[7X(_۹ooKK/W{cS ۷;Fj{*,zA MŚuQ[>sԈa0_2 z5ɋrDGU]I(ޠ@\(5OT ѭyˇd ZY߿jkk0hАڙa}))c;Ug}E]tnxA\:a0T ]DMEuu}ZDQرñp7i CWPs455N*v;%j 5!Ma~> QZX9ST-(tпl\-U|dg[QЫg):r RW]]p~*JpyqyѭĜ1b,y^ZoΨPUUs_ s֢iIr9 ]hpprB>pp;yF ?Iۡ #G M;5-6uNenj1=Gck׮'3{YF??j@ző#QQYq&NU+קmL XrR^W!֟ƑÑ|^ABtV/\ лwNڡR+y睇;˫ؿ?oٲx%m57t/Dl)-5?9Y(ɂ|( Dnñïzc ۃZAttbxL4knC ]ː󦍇0tQ+fȐ!ܐ!CN'۵k:cG`Cڰuuuo@@ lx^(/N=j0vNADүo:ĵ%ݻ[1xpN4hcXs={nJK̾Lsd@qq>VжOA- `„1z*M#. ̵?S/nLCñc:e7A:ǏFuu==F UA2qX۱uЭ'Fdl$;}ܞ=KP]]Aѷo/ ^t:W]ua2f y^z*} !//M%Kp Ȍ'"';KxGBdM} ^/c ǫAiFᢙӱsA{Xyƍ2B$DFFHci7'ǂ֗OAhυ7˵kb6pu&2R8Qqsr,p9 A0nh/jVy\sLL.cd~' AptU fA2l 9sX ˣ<.1 ={t)Hs2Rx<޴G /7.EH Ico39Æ # ^lۭ:& G%)Xl-OVg\6|od iXqдyA 1syXn;vЮbM7F] ~EauuZO XEu ukmlsnfFq$`;5=Atj%E5k;e˴mw Kf"(ph&H Ji:;wҥk5qнH32C5h2j}AQYe5#0пd\8HYv',YfoA"Ŵ&a˖XMr)5j0 d a P4k;QX][@A1iX] kllKa$Fq`mVv'(BBySN}168/N$d t6Ӳٜ @aSQ\\?^'-q>| $d 1 @CǕ$ 1t"I@Al̼<:>Wl./СI@ e6i6U(tַ`(8oB'BD'8,OϘz||8]5Ku۷'8AӉɱh6׷[$`ɗAjpsƎ9m˖}N6 Y(,t(2 󜵤POD^= AD  z̼x:FdKT㻷_‚<3J2.Bx|p((G}F "%JYq1GEEӧbHb d 8e箃0  93c1p8LQ MۯLYV%ZO / (*"+Hc8?Vي뮽G'/ AD1M2uzu-f|>su5kFPv!c^Ǝδ$(Ck>o AD8 &A OGNj=-tnW] v"c t+-FVItn߽ǏAtZ 1exXEΝ7kG &ܥIتU[iNMqc0h@o,\\[BE3#Ff%kqiŌ+{w'%2:B""7yhunȲv7n܉aC`Р~8xַ Я_oL<:VoƦM;5-b~}y0 ZOːтt:Fey8E…0g娭GCMBѡ),ǤcQZj:Ζ.[]eqрOlV Id^@s|s0f`r ַ a60nh ||=>"^2 &Dd f6lU+z ph5vzjڋal*BaG á( 6l,ͻ ԚjNtTܫZYW,իPQQ)ܡ1ud:J >A i:WA;ǎmuA q0ƍ Ɉbڭx|ZO 0dH?\2"&ȑ#lҥXb9VZ )zaַ4݄[Qv˾٠=CqqnUغ {z:AI=1n(rd.߀F3`]H6mڄիVa˰qf^s´}1udf%=SDee {wÍ75q 2=aQ(**NWU6ĉ  ؝wј2e,DQ A.HdYf[no7Ka˖m>'i#bⰾږF%\ 0hP\uEvvڅť CmNuCg"k}n3hP\}Eس6oΌ Ap1QT\5 ʰwXJ1dH?\0crso:?}%K%y;vlLIXJ R6Qno鯥R2;iU-Z F'$8)Y<i<}^~q/ysGE&CI4V~6mڌef3N™sARJ ݼ=>Z<ܸxyhhhuf\DDGKV'ͬ՚tuyuc&CGvV&=w!"${=0fk TA!>pSww?=q99N\vz=$"#QQQ2LF[]{>4~\̚5i G/s,[X;X|MJ(n?֭Wqcan?@O˔bFՌr@VkbOu8YL^;ɍICC+_BAྛ>޲յI%h4j̙]Eh4px^1{ Z 9{̩Tv#֯߄H$"{XDbj QQ9 YYN%x<JRh.twNEXZم_~ IrjQ˖.JBƏQ_${HDtLVie0 JWlم-[v&i ٬X`6Śn/L8.ʖU GрsYfLS::ڵ1dƈhu(--DYY Dݮ=غe'ZVٳ+YHK31DR2LxϗÿW**΅&JYzذqP~^6,96[:j֭d&1EQV^m[vlD(=鴘9s:- IAM_+*~\wir]YV6l&}wCMGέ™gH$-bFɱMV[Q:Y =vAL7oέ|!]v>O|n'h>%񷿿`09WNXҰ,wp[Ғ\0QrIO7%Zӕh4&S[֤|6㔓g*PboNXkqvMb !7՝+\,^<EyJwGTo܂^"$a4P\\B8E!ZZ;}{=vjJS2cJJ1(,e|>!~?o68gtc:.T&3/ ׿>mɳY8{p^mN QJJK3!//psR)J_ߠݍxHj%X`26bEKc߂6.7xvM-]|>sfxIjFVV[ڥ&?% E(,̇P_ڃ;=OnƜٕ={:WUOzwXxWc*ąkkkĪp#~uV Z[;eSc9sg)^QSSƆfb*h2PPFQQ>G=nv5a` #DQaJCQ oe= ϯ'V*;tRT}c^VG=// N%==4":LD~~. ܰZ;}{ä nEE rv+}>8pg aR߆'^]Ukk/|ߺ.TUUM;}7&c*̘1 j--ر}7:;e`'vgC*hL47 -I?'rs]3%P<-CGL9\qM˒~ýp4| O~pul6B~#nw# z̜YysaQD}47qga$( 2vsvr@Q4ԷHTP'`cb̝S9>h)YSS#V*-ϗ=tyU?‚ŋ#o;w6ʾ( JJ1gN%J]߽--mŒw=lN۝\w6rrC}C ZՕJBII>fTѵCx4PWkYF|?p%T+`& _ov؃S_oP>,4fL̓pXP(,46==^Ctt:dg;Fnn622, AgOܞ 3ݞR̚9KノӞ֭['.d9m9?J c8V<҇C;..rBx\oI1?MvV&fTRed$$:m\h8fÕiJRјhoBSsړzC1 (iu)+ex Zq/uNyW>pw>[" u뷠9;FV8ӧlZ!t:Ess !:dg9Bv v(XLtv-h螴dj4bƌ2wU"6 #bX0o6֞q]w\cՁソ55'ZFqӧ,'PXtvt --|WV&p2pؠ(EOo?ލI3@T*ܨij5fA$)_GƏv8w1]@6ƛnM#fp/kۀݻeh4j塴4%0My7!V-v["@v+L&P(,z{;  NH6 ()ǴAN߭4 &6mE㞶)Ҍv"+;y,P#׏/qY: NKKl XґO EW]x<D_~@=& 9>yvl5)Y;\j vde9,Nxb1 w^x}>Bbt3-fX,fgjM!z}F z{ N+^&JQ ?Si*b@csbhjjCMn?|C~AAACaw%eLF`6!-ʹldTB08"008C}JW ɀB7(*㥹r$IGFݮ&yFj͚-q8fM͖%m季Ѩ0<pp##! `88 ܕgGCQ#7ׅ<r98R$Bۃ;RT*bNCH%q%q`Pb112Bp4T0¡H}x؟CaD"}RUj5jjhj4괣@׏^NANw'Ñ"FLDhx:xT*\N; (*E^^6j5h$ !DKK'v5b׮&Ρ8LiiFa;`6d2d4$>}o0Ll/X,&"(8s|"\ĄCFQV>hPPh5$BQD&&"MH##q##!GD|jçѨB~A sbdBN46^Crjz= G z= zT*tцZFZG+ƨT}<0h h@hp$x,X_@&OL8-IxDsKZ;֕+}Jg D|dg3>$`Aуnwtl =N;NN;\N\.;'%  H쐚tw7i :J-.N=!6DIAB50}k=OPPUZpg&ȴ$ jmmv if>ؽ^xo^/wGnhxX3,:@Q $ |>qRE9޸FAevAeqBeqAeqA{ 3O< 1ThBL&EVEVk:ҌŅE ]uuxGI𖎤?.,;bC֏7 U4;6dge*}^ x18> eȩD2PF֌Dt$, @۾o_}}sy*! C'o<!?b!?bƽTTPb,P޻2mr9{Fbpl! z} g$V`6'630bIlt>a{cBy">z!{ėss~d; y*c)1 qNJEQ14ػ//]g.a4`6f2d2l6%6(Lf2~$"Ac;wЇӿ:8hbи.qYa6Om*4(ƌD,P!\B۝60CB|Z nY~q8v76`0ghxV%u<; OY***׮pc8g-߸1B40HopSe^y+|cN$M:z.KySq4uӯ4㎻-1 Iqׯz%Yܲr@v4㻿^p:IF(?~݃ TwLn4m5MC⮻j15~;<3ϽO?O:͛/_XT\z_G_B,= "x$~ꫯⲳ~\'Ï1Fs*oŠ>o{[ۏ<⻨ƯDD!IaϮ\ Tb2>#a\_ĭw܍K/12X,xVqq@QBz65w@gh ٳdcXWo')jٲeʦ-4bƩ7>:}\ދy ;|#dffghzEEY V4;{CV|Nކ mt6 `*d -ۇ۱f?뮿?DSO٤~g͝T1+Q|I!W\.>c=~hqk̫i8!IQw~(RqN=7?|>X '"0/^!"Jq  akݾ/8?nN\/2FA2220rá)\t`IJrh ~/Dc92Fh$L&;[NmƅM<g yrױ|rFM&dhhHף EQPPPrl63B1HH:^KDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""$DDD$ct """ABDDD1HH: I !"""`b%tEXtdate:create2017-12-08T15:16:47+01:00ȁi%tEXtdate:modify2017-12-08T15:16:47+01:008tEXtSoftwarewww.inkscape.org<IENDB`confclerk-0.6.4/data/data.qrc0000664000175000017500000000012413212517317015313 0ustar gregoagregoa confclerk.svg confclerk-0.6.4/data/confclerk.desktop0000664000175000017500000000032713212517317017241 0ustar gregoagregoa[Desktop Entry] Version=1.0 Type=Application Name=ConfClerk GenericName=Offline conference schedule application Exec=confclerk Icon=confclerk Categories=Office;Calendar; Keywords=Conference;Schedule;pentabarf;frab; confclerk-0.6.4/data/confclerk.svg0000664000175000017500000022451013212517317016371 0ustar gregoagregoa image/svg+xml confclerk-0.6.4/data/confclerk.pod0000664000175000017500000001046113212517317016352 0ustar gregoagregoa=encoding utf8 =head1 NAME ConfClerk - offline conference schedule application =head1 SYNOPSIS B =head1 DESCRIPTION B is an application written in Qt, which makes conference schedules available offline. It displays the conference schedule from various views, supports searches on various items (speaker, speech topic, location, etc.) and enables you to select favorite events and create your own schedule. At the moment B is able to import schedules in XML format created by the PentaBarf conference management system (or frab) used by e.g. FOSDEM, DebConf, FrOSCon, Grazer Linuxtage, and the CCC. ConfClerk is targeted at mobile devices like the Nokia N810 and N900 but works on any system running Qt. =head1 OPTIONS None. =head1 CONFIGURATION The configuration can be done via the graphical interface. The configuration is saved in the default QSettings location, i.e.: =over =item Linux F<~/.config/Toastfreeware/ConfClerk.conf> =item Windows In the registry (search for the Toastfreeware key, should be at F). =item Other OS Cf. the QSettings documentation at L. =back =head1 FILES B keeps its database in the location proposed by the XDG Base Directory specification L: So the configuration (see L) is stored at F<~/.config/Toastfreeware/ConfClerk.conf> and the database is kept at F<~/.local/share/data/Toastfreeware/ConfClerk/ConfClerk.sqlite> (Qt4) F<~/.local/share/Toastfreeware/ConfClerk/ConfClerk.sqlite> (Qt5). =head1 COPYRIGHT AND LICENSE =head2 Main code Copyright (C) 2010 Ixonos Plc. Copyright (C) 2011-2017, Philipp Spitzer Copyright (C) 2011-2017, gregor herrmann Copyright (C) 2011-2017, Stefan Strahl This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. =head2 Additional resources =over =item data/confclerk.*: Copyright (C) 2011, Christian Kling This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. =item icons/* All icons are taken from the Debian package gnome-icon-theme, which contains the following notice (as of 2011-06-24): Copyright © 2002-2008: Ulisse Perusin Riccardo Buzzotta Josef Vybíral Hylke Bons Ricardo González Lapo Calamandrei Rodney Dawes Luca Ferretti Tuomas Kuosmanen Andreas Nilsson Jakub Steiner GNOME icon theme is distributed under the terms of either GNU LGPL v.3 or Creative Commons BY-SA 3.0 license. =item src/icons/favourite*, src/icons/alarm*, src/icons/collapse*, src/icons/expand*: Copyright (C) 2012-2017, Philipp Spitzer Copyright (C) 2012-2017, Stefan Strahl This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. =back confclerk-0.6.4/docs/0000775000175000017500000000000013212517317013715 5ustar gregoagregoaconfclerk-0.6.4/docs/fosdem-schedule/0000775000175000017500000000000013212517317016764 5ustar gregoagregoaconfclerk-0.6.4/docs/fosdem-schedule/AUTHORS0000664000175000017500000000225513212517317020040 0ustar gregoagregoaAuthors of fosdem-schedule. Copyright (C) 2010 Ixonos Plc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. Francisco Fortes Matus Hanzes Martin Komara Marek Timko Matus Uzak Monika Berendova Pavol Korinek Pavol Pavelka Maksim Kirillov Files add.png, reload.png, remove.png in src/icons/ directory are taken from Ubuntu package gnome-icon-theme. Copyright notice for them copied here: > This package was debianized by Takuo KITAME on > Fri, 17 Jan 2003 14:57:28 +0900. > > It was downloaded from > > Copyright © 2002-2008: > Ulisse Perusin > Riccardo Buzzotta > Josef Vybíral > Hylke Bons > Ricardo González > Lapo Calamandrei > Rodney Dawes > Luca Ferretti > Tuomas Kuosmanen > Andreas Nilsson > Jakub Steiner confclerk-0.6.4/docs/fosdem-schedule/INSTALL0000664000175000017500000000271113212517317020016 0ustar gregoagregoaThis is the INSTALL file for the fosdem-schedule distribution. Copyright (C) 2010 Ixonos Plc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. NOTE ==== fosdem-schedule is an application intended for Nokia N810 and N900 Internet tablet devices. Therefor the preferred distribution is a Debian package. Notice the different release of the Maemo platform on each of the devices, which requires a specific Debian package. Maemo is a trademark of Nokia Corporation. Debian is a registered trademark owned by SPI in the United States, and managed by the debian project, as explained on their site. Basic Installation ================== 1. Type `qmake' to generate Makefiles. 2. Type `make' to compile the source code. 3. Type `make install' to install the executable. 4. Type `make uninstall' to remove all installed files form your system. Maemo Package Building ====================== 1. Type `qmake' to generate Makefiles. 2. Check the "Build-Depends" section of the control file for required packages. Maemo 3 (Diablo) specific: - Ignore the version strings when building a package for Maemo 3 (Diablo). - Optification of the package is not explicitly required, to disable it comment out the "maemo-optify $(PKG_NAME)" line in debian/rules. 3. Type `dpkg-buildpackage -rfakeroot -b -uc' to build a package. confclerk-0.6.4/docs/fosdem-schedule/NEWS0000664000175000017500000000142013212517317017460 0ustar gregoagregoa This NEWS file records noteworthy changes, very tersely. Version 0.3 (3 Feb 2010) * Performance improvement for events. Version 0.2 (2 Feb 2010) * Search tab has been added. * Alarms handled by alarmd, which requests native alarm dialogs (N900 only). * A service is registered to DBus, the application is handling calls from alarm dialogs to reflect alarm states into the database. The application is started if required (N900 only). Version 0.1 (19 Jan 2010) * A user can select favourite events, which are displayed in "Favourites" tab. * FOSDEM icon is displayed in application manager and in applications menu. * Optification of the package is done using maemo-optify script. * There is now a `NEWS' file (this one), giving a history of user-visible changes. confclerk-0.6.4/docs/fosdem-schedule/README0000664000175000017500000000461513212517317017652 0ustar gregoagregoaThis is the README file for the fosdem-schedule distribution. Copyright (C) 2010 Ixonos Plc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. fosdem-schedule is an application written in Qt, which makes the FOSDEM conference schedule available offline. It displays the conference schedule from various views, support searches on various items (speaker, speech topic, location, etc.) and enables you to select favorite events and create your own schedule. For Nokia N810 and N900. See the file ./INSTALL for building and installation instructions. Primary distribution point: http://sourceforge.net/projects/fosdem-maemo/ Home page: http://sourceforge.net/apps/mediawiki/fosdem-maemo/ Mailing list: fosdem-maemo-devel@lists.sourceforge.net - please use this list for all discussion: bug reports, enhancements, etc. - archived at: http://sourceforge.net/mailarchive/forum.php?forum_name=fosdem-maemo-devel - anyone is welcome to join the list; to do so, visit https://lists.sourceforge.net/lists/listinfo/fosdem-maemo-devel Bug reports: Please include enough information for the maintainers to reproduce the problem. Generally speaking, that means: - the contents of any input files necessary to reproduce the bug and command line invocations of the program(s) involved (crucial!). - a description of the problem and any samples of the erroneous output. - the version number of the program(s) involved (use --version). - hardware, operating system, and compiler versions (uname -a). - anything else that you think would be helpful. Patches are most welcome; if possible, please make them with diff -c and include ChangeLog entries. fosdem-schedule is free software. See the file COPYING for copying conditions. About FOSDEM 2010: The tenth FOSDEM is a two-day event organized by volunteers to promote the widespread use of Free and Open Source software. Taking place in the beautiful city of Brussels (Belgium), FOSDEM meetings are recognized as "The best Free Software and Open Source events in Europe". FOSDEM name and FOSDEM brain icon are Trademarks of FOSDEM ASBL, which gave this project the rights to use the brain icon and name. Copying and distribution of the FOSDEM brain icon must follow the Creative Commons Attribution-Noncommercial-No Derivative Works 2.0 Belgium License.confclerk-0.6.4/docs/fosdem-schedule/user-stories.txt0000664000175000017500000000266413212517317022201 0ustar gregoagregoa As an user I would like to have following features available in FOSDEM application: o Id like to see all events for current day (default: current time) o Id like to see all events for other days o Id like to see all events grouped by activity o Id like to see all events grouped by room o Id like to see all details about selected event o In detail view, Id like to have option to show room on the map o If there are some links in the event detail, Id like to have option to open link in browser o In detail view, Id like to add/remove event to/from favorites o Id like to search events by title/abstract, speaker name, tags, activity category, room number/name o Id like to see my favorite events o Id like to be noticed when some of my favorite events are overlapping o Id like to add reminder into calendar for selected event o Id like to see which events are added to calendar or to favorites o Id like to option to update list of events through the web -------------------------------------------------------------------- o I'd like to have "my track" -- the personal schedule of events the user would like to attend. o I wish to have "now button" to show me what's ongoing now. ==================================================================== o I'd like to have possibility to post to eg. twitter or facebook -- some button to easy post on twitter "I'm attending now this". confclerk-0.6.4/docs/fosdem-schedule/Changelog0000664000175000017500000000000013212517317020564 0ustar gregoagregoaconfclerk-0.6.4/BUGS0000664000175000017500000000012013212517317013441 0ustar gregoagregoaBugs are managed in our trac system: http://www.toastfreeware.priv.at/confclerk