diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
commit | ed5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch) | |
tree | 7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /writerfilter/qa | |
parent | Initial commit. (diff) | |
download | libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.tar.xz libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.zip |
Adding upstream version 4:7.4.7.upstream/4%7.4.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'writerfilter/qa')
119 files changed, 4992 insertions, 0 deletions
diff --git a/writerfilter/qa/cppunittests/dmapper/CellColorHandler.cxx b/writerfilter/qa/cppunittests/dmapper/CellColorHandler.cxx new file mode 100644 index 000000000..4449e9a20 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/CellColorHandler.cxx @@ -0,0 +1,70 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/text/XTextDocument.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/drawing/FillStyle.hpp> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/dmapper/CellColorHandler.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/dmapper/data/"; + +CPPUNIT_TEST_FIXTURE(Test, test129205) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf129205.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<beans::XPropertySet> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + drawing::FillStyle eFillStyle = drawing::FillStyle::FillStyle_NONE; + xPara->getPropertyValue("FillStyle") >>= eFillStyle; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: drawing::FillStyle_NONE + // - Actual : FillStyle_SOLID + // i.e. the paragraph had a solid fill, making the header image invisible. + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, eFillStyle); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/dmapper/DomainMapper.cxx b/writerfilter/qa/cppunittests/dmapper/DomainMapper.cxx new file mode 100644 index 000000000..639c8e9e0 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/DomainMapper.cxx @@ -0,0 +1,134 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/text/XTextDocument.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/PropertyValues.hpp> + +#include <tools/UnitConversion.hxx> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/dmapper/DomainMapper.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/dmapper/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testLargeParaTopMargin) +{ + // Given a document with a paragraph with a large "before" spacing. + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "large-para-top-margin.docx"; + getComponent() = loadFromDesktop(aURL); + + // When checking the first paragraph. + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<beans::XPropertySet> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + + // Then assert its top margin. + sal_Int32 nParaTopMargin{}; + xPara->getPropertyValue("ParaTopMargin") >>= nParaTopMargin; + // <w:spacing w:before="37050"/> in the document. + sal_Int32 nExpected = convertTwipToMm100(37050); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 65352 + // - Actual : 0 + // i.e. the paragraph margin was lost, which shifted the paragraph to the right (no top margin + // -> wrap around a TextBox), which shifted the triangle shape out of the page frame. + CPPUNIT_ASSERT_EQUAL(nExpected, nParaTopMargin); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdtRunInPara) +{ + // Given a document with a block SDT, and inside that some content + a run SDT: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "sdt-run-in-para.docx"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure the content inside the block SDT but outside the run SDT is not lost: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<text::XTextRange> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: first-second + // - Actual : second + // i.e. the block-SDT-only string was lost. + CPPUNIT_ASSERT_EQUAL(OUString("first-second"), xPara->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdtDropdownNoDisplayText) +{ + // Given a document with <w:listItem w:value="..."/> (no display text): + OUString aURL + = m_directories.getURLFromSrc(DATA_DIRECTORY) + "sdt-dropdown-no-display-text.docx"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure we create a dropdown content control, not a rich text one: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParagraphsAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParagraphs = xParagraphsAccess->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xParagraph(xParagraphs->nextElement(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xPortions = xParagraph->createEnumeration(); + uno::Reference<beans::XPropertySet> xTextPortion(xPortions->nextElement(), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + uno::Reference<text::XTextContent> xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY); + uno::Sequence<beans::PropertyValues> aListItems; + xContentControlProps->getPropertyValue("ListItems") >>= aListItems; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. the list item was lost on import. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aListItems.getLength()); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx b/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx new file mode 100644 index 000000000..1accc77a1 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/DomainMapperTableHandler.cxx @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/table/BorderLine2.hpp> +#include <com/sun/star/text/XTextTable.hpp> +#include <com/sun/star/text/XTextTablesSupplier.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/dmapper/DomainMapperTableHandler.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/dmapper/data/"; + +CPPUNIT_TEST_FIXTURE(Test, test1cellInsidevRightborder) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "1cell-insidev-rightborder.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<text::XTextTablesSupplier> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTextDocument->getTextTables(), uno::UNO_QUERY); + uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + table::BorderLine2 aBorder; + xCell->getPropertyValue("RightBorder") >>= aBorder; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 18 + // i.e. the request to have no table-level right border was lost on import. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(0), aBorder.LineWidth); +} + +CPPUNIT_TEST_FIXTURE(Test, testNestedFloatingTable) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "nested-floating-table.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xFrame(xDrawPage->getByIndex(0), uno::UNO_QUERY); + bool bIsFollowingTextFlow = false; + xFrame->getPropertyValue("IsFollowingTextFlow") >>= bIsFollowingTextFlow; + // Without the accompanying fix in place, this test would have failed, the nested floating table + // was partly positioned outside the table cell, leading to overlapping text. + CPPUNIT_ASSERT(bIsFollowingTextFlow); +} +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/dmapper/DomainMapper_Impl.cxx b/writerfilter/qa/cppunittests/dmapper/DomainMapper_Impl.cxx new file mode 100644 index 000000000..16039f983 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/DomainMapper_Impl.cxx @@ -0,0 +1,323 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/text/XTextDocument.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/style/BreakType.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <com/sun/star/text/WritingMode2.hpp> +#include <com/sun/star/text/XTextTablesSupplier.hpp> +#include <com/sun/star/text/XTextTable.hpp> +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/style/XStyleFamiliesSupplier.hpp> +#include <com/sun/star/document/XDocumentInsertable.hpp> + +#include <vcl/scheduler.hxx> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/dmapper/DomainMapper_Impl.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/dmapper/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testPageBreakFooterTable) +{ + // Load a document which refers to a footer which ends with a table, and there is a page break + // in the body text right after the footer reference. + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "page-break-footer-table.docx"; + getComponent() = loadFromDesktop(aURL); + + // Check the last paragraph. + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<beans::XPropertySet> xPara; + while (xParaEnum->hasMoreElements()) + { + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + } + style::BreakType eType = style::BreakType_NONE; + xPara->getPropertyValue("BreakType") >>= eType; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 4 + // - Actual : 0 + // i.e. there was no page break before the last paragraph. + CPPUNIT_ASSERT_EQUAL(style::BreakType_PAGE_BEFORE, eType); +} + +CPPUNIT_TEST_FIXTURE(Test, testNumberingRestartStyleParent) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "num-restart-style-parent.docx"; + getComponent() = loadFromDesktop(aURL); + + // The paragraphs are A 1 2 B 1 2. + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<beans::XPropertySet> xPara; + static OUStringLiteral aProp(u"ListLabelString"); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("A."), xPara->getPropertyValue(aProp).get<OUString>()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1."), xPara->getPropertyValue(aProp).get<OUString>()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2."), xPara->getPropertyValue(aProp).get<OUString>()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("B."), xPara->getPropertyValue(aProp).get<OUString>()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1. + // - Actual : 3. + // i.e. the numbering was not restarted after B. + CPPUNIT_ASSERT_EQUAL(OUString("1."), xPara->getPropertyValue(aProp).get<OUString>()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2."), xPara->getPropertyValue(aProp).get<OUString>()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFrameDirection) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "frame-direction.docx"; + getComponent() = loadFromDesktop(aURL); + + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xFrame0(xDrawPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xFrame1(xDrawPage->getByIndex(1), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xFrame2(xDrawPage->getByIndex(2), uno::UNO_QUERY); + // Without the accompanying fix in place, all of the following values would be text::WritingMode2::CONTEXT + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::CONTEXT, + xFrame0->getPropertyValue("WritingMode").get<sal_Int16>()); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, + xFrame1->getPropertyValue("WritingMode").get<sal_Int16>()); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL, + xFrame2->getPropertyValue("WritingMode").get<sal_Int16>()); +} + +CPPUNIT_TEST_FIXTURE(Test, testAltChunk) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "alt-chunk.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<text::XTextRange> xPara; + uno::Reference<beans::XPropertySet> xParaProps; + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + xParaProps.set(xPara, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("outer, before sect break"), xPara->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("Standard"), + xParaProps->getPropertyValue("PageStyleName").get<OUString>()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + xParaProps.set(xPara, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("outer, after sect break"), xPara->getString()); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Converted1 + // - Actual : Standard + // i.e. the page break between the first and the second paragraph was missing. + CPPUNIT_ASSERT_EQUAL(OUString("Converted1"), + xParaProps->getPropertyValue("PageStyleName").get<OUString>()); + + // Without the accompanying fix in place, this test would have failed with a + // container.NoSuchElementException, as the document had only 2 paragraphs, all the "inner" + // content was lost. + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("inner doc, first para"), xPara->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFieldIfInsideIf) +{ + // Load a document with a field in a table cell: it contains an IF field with various nested + // fields. + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "field-if-inside-if.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<text::XTextTablesSupplier> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTextDocument->getTextTables(), uno::UNO_QUERY); + uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + // Get the result of the topmost field. + uno::Reference<text::XTextRange> xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 0** Expression is faulty **2 + // i.e. some of the inner fields escaped outside the outer field. + CPPUNIT_ASSERT_EQUAL(OUString("2"), xCell->getString()); + + // Test the second cell: it contains "IF ", not the usual " IF ". + xCell.set(xTable->getCellByName("A2"), uno::UNO_QUERY); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 25 + // - Actual : 025 + // i.e. some of the inner fields escaped outside the outer field. + CPPUNIT_ASSERT_EQUAL(OUString("25"), xCell->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testCreateDatePreserve) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "create-date-preserve.docx"; + getComponent() = loadFromDesktop(aURL); + // Trigger idle layout. + Scheduler::ProcessEventsToIdle(); + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xPortionEnumAccess(xParaEnum->nextElement(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xPortionEnum = xPortionEnumAccess->createEnumeration(); + uno::Reference<text::XTextRange> xPortion(xPortionEnum->nextElement(), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 7/7/2020 10:11:00 AM + // - Actual : 07/07/2020 + // i.e. the formatting of the create date field was lost. + CPPUNIT_ASSERT_EQUAL(OUString("7/7/2020 10:11:00 AM"), xPortion->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testChartZOrder) +{ + // Given a document with a chart and a shape on it: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "chart-zorder.docx"; + + // When loading the document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure the shape is on top of the chart: + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<lang::XServiceInfo> xChart(xDrawPage->getByIndex(0), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed, as the chart was on top + // of the shape. + CPPUNIT_ASSERT(xChart->supportsService("com.sun.star.text.TextEmbeddedObject")); +} + +CPPUNIT_TEST_FIXTURE(Test, testPTab) +{ + // Given a document that has a <w:ptab> to render a linebreak: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "ptab.docx"; + + // When opening that file: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that the Writer doc model contains that linebreak: + uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(getComponent(), + uno::UNO_QUERY); + uno::Reference<container::XNameAccess> xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("PageStyles"), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xStyle(xStyleFamily->getByName("Standard"), uno::UNO_QUERY); + auto xFooter = xStyle->getPropertyValue("FooterText").get<uno::Reference<text::XTextRange>>(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: <space><newline>1\n + // - Actual: <space><tab>1\n + // i.e. the layout height of the footer text was incorrect, the page number field was not + // visually inside the background shape. + CPPUNIT_ASSERT_EQUAL(OUString(" \n1" SAL_NEWLINE_STRING), xFooter->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testPasteOle) +{ + // Given an empty document: + getComponent() = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); + + // When pasting RTF into that document: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<text::XText> xText = xTextDocument->getText(); + uno::Reference<document::XDocumentInsertable> xCursor( + xText->createTextCursorByRange(xText->getStart()), uno::UNO_QUERY); + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "paste-ole.rtf"; + xCursor->insertDocumentFromURL(aURL, {}); + + // Then make sure that all the 3 paragraphs of the paste data (empty para, OLE obj, text) are + // inserted to the document: + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xText, uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + xParaEnum->nextElement(); + // Without the accompanying fix in place, this test would have failed, as the paste result was a + // single paragraph, containing the OLE object, and the content after the OLE object was lost. + CPPUNIT_ASSERT(xParaEnum->hasMoreElements()); + xParaEnum->nextElement(); + CPPUNIT_ASSERT(xParaEnum->hasMoreElements()); + uno::Reference<text::XTextRange> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("hello"), xPara->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testClearingBreak) +{ + // Given a document with a clearing break: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "clearing-break.docx"; + + // When loading that file: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that the clear property of the break is not ignored: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<text::XText> xText = xTextDocument->getText(); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xText, uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParagraphs = xParaEnumAccess->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xParagraph(xParagraphs->nextElement(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xPortions = xParagraph->createEnumeration(); + xPortions->nextElement(); + xPortions->nextElement(); + // Without the accompanying fix in place, this test would have failed with: + // An uncaught exception of type com.sun.star.container.NoSuchElementException + // i.e. the first para was just a fly + text portion, the clearing break was lost. + uno::Reference<beans::XPropertySet> xPortion(xPortions->nextElement(), uno::UNO_QUERY); + OUString aPortionType; + xPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("LineBreak"), aPortionType); + uno::Reference<text::XTextContent> xLineBreak; + xPortion->getPropertyValue("LineBreak") >>= xLineBreak; + sal_Int16 eClear{}; + uno::Reference<beans::XPropertySet> xLineBreakProps(xLineBreak, uno::UNO_QUERY); + xLineBreakProps->getPropertyValue("Clear") >>= eClear; + // SwLineBreakClear::ALL + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(3), eClear); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/dmapper/GraphicImport.cxx b/writerfilter/qa/cppunittests/dmapper/GraphicImport.cxx new file mode 100644 index 000000000..a20c84905 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/GraphicImport.cxx @@ -0,0 +1,411 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/awt/Point.hpp> +#include <com/sun/star/awt/Size.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/container/XNamed.hpp> +#include <com/sun/star/text/RelOrientation.hpp> +#include <com/sun/star/text/VertOrientation.hpp> +#include <com/sun/star/text/XTextViewCursorSupplier.hpp> +#include <com/sun/star/view/XViewCursor.hpp> +#include <com/sun/star/drawing/PointSequenceSequence.hpp> + +#include <basegfx/polygon/b2dpolypolygontools.hxx> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/dmapper/GraphicImport.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/dmapper/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testTdf143455SmartArtPosition) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf143455_SmartArtPosition.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + // Without fix in place the group, which represents the SmartArt, was placed at the initializing + // position 0|0. + sal_Int32 nHoriPosition = 0; + xShape->getPropertyValue("HoriOrientPosition") >>= nHoriPosition; + // The test would have failed with Expected: 2858, Actual: 0 + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2858), nHoriPosition); + sal_Int32 nVertPosition = 0; + xShape->getPropertyValue("VertOrientPosition") >>= nVertPosition; + // The test would have failed with Expected: 1588, Actual: 0 + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1588), nVertPosition); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf143208wrapTight) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf143208_wrapTight.docx"; + // The document has a shape with indentation and contour wrap "wrapTight". Error was, that + // the corresponding shape property 'ContourOutside=true' was not set. + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + bool bContourOutside = false; + xShape->getPropertyValue("ContourOutside") >>= bContourOutside; + CPPUNIT_ASSERT(bContourOutside); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142305StrokeGlowMargin) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf142305StrokeGlowMargin.docx"; + // The document has an arc with fat stroke and glow. Its bounding rectangle differs much + // from the snap rectangle. Error was, that the margins were not set in a way, that the shape + // would render similar to Word. + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int32 nTopMargin = 0; + xShape->getPropertyValue("TopMargin") >>= nTopMargin; + // Without fix in place top margin was 0, so that the text comes near to the shape. + // The test would have failed with Expected: 838, Actual: 0 + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(838), nTopMargin); + sal_Int32 nBottomMargin = 0; + // Without fix in place bottom margin was >0, so that the text was far from to the shape. + // The test would have failed with Expected: 0, Actual: 637 + xShape->getPropertyValue("BottomMargin") >>= nBottomMargin; + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nBottomMargin); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142305SquareWrapMargin) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf142305SquareWrapMargin.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<frame::XModel> xModel(getComponent(), uno::UNO_QUERY); + uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier( + xModel->getCurrentController(), uno::UNO_QUERY_THROW); + uno::Reference<text::XTextViewCursor> xViewCursor(xTextViewCursorSupplier->getViewCursor()); + xViewCursor->gotoStart(/*bExpand=*/false); + uno::Reference<view::XViewCursor> xCursor(xViewCursor, uno::UNO_QUERY); + xCursor->goDown(/*nCount=*/10, /*bExpand=*/false); + xViewCursor->goRight(/*nCount=*/1, /*bExpand=*/true); + OUString sText = xViewCursor->getString(); + // Without fix in place, wrap was tight to the bounding box and not around the full shape as in + // Word. That results in different text at start of line, here "u" instead of expected "m". + CPPUNIT_ASSERT(sText.startsWith("m")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142304GroupPosition) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf142304GroupPosition.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int32 nVertPosition = 0; + xShape->getPropertyValue("VertOrientPosition") >>= nVertPosition; + // Without fix in place the group was shifted left and down + // The test would have failed with Expected: 2178, Actual: 2521 + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2178), nVertPosition); + sal_Int32 nHoriPosition = 0; + // The test would have failed with Expected: 4304, Actual: 3874 + xShape->getPropertyValue("HoriOrientPosition") >>= nHoriPosition; + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(4304), nHoriPosition); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf141540ChildRotation) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf141540ChildRotation.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<container::XIndexAccess> xGroup(xDrawPage->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference<beans::XPropertySet> xRotatedShape(xGroup->getByIndex(1), uno::UNO_QUERY); + sal_Int32 nShearAngle = 9000; // initialize with invalid value + xRotatedShape->getPropertyValue("ShearAngle") >>= nShearAngle; + // Without fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 2494 + // i.e. the rotated rectangle in the group was sheared, although the group itself is not rotated + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nShearAngle); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf141540GroupRotation) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf141540GroupRotation.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int32 nShearAngle = 9000; // init with invalid value + xShape->getPropertyValue("ShearAngle") >>= nShearAngle; + // Without fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : -3190 + // i.e. the group has got a shearing although MSO does not know shearing at all. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nShearAngle); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf141540GroupLinePosSize) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "tdf141540GroupLinePosSize.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + + // Test line + uno::Reference<drawing::XShape> xLineShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + awt::Point aPosition = xLineShape->getPosition(); + awt::Size aSize = xLineShape->getSize(); + // Without fix in place, you had got Position = (19|6498), Size = 5001 x 2 + // i.e. the line was nearly horizontal instead of vertical + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(5022), aPosition.X); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2963), aPosition.Y); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aSize.Width); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(7073), aSize.Height); + + // Test group + uno::Reference<drawing::XShape> xGroupShape(xDrawPage->getByIndex(1), uno::UNO_QUERY); + aPosition = xGroupShape->getPosition(); + aSize = xGroupShape->getSize(); + // Without fix in place, you had got Position = (11511|3480), Size = 4022 x 4022 + // i.e. the group was erroneously downscaled to unrotated size + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(10679), aPosition.X); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2648), aPosition.Y); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(5687), aSize.Width); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(5687), aSize.Height); +} + +CPPUNIT_TEST_FIXTURE(Test, testGroupShapeRotation) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "group-shape-rotation.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int32 nVertPosition = 0; + xShape->getPropertyValue("VertOrientPosition") >>= nVertPosition; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1221 + // - Actual : -2048 + // i.e. the group shape had a so low vertical position that the line shape did not point into + // it. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1221), nVertPosition); +} + +CPPUNIT_TEST_FIXTURE(Test, testDrawShapeInlineEffect) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "draw-shape-inline-effect.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int32 nBottomMargin = 0; + xShape->getPropertyValue("BottomMargin") >>= nBottomMargin; + // 273 in mm100 is 98425 EMUs from the file. + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 273 + // - Actual : 0 + // i.e. the layout result had less pages than expected (compared to Word). + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(273), nBottomMargin); +} + +CPPUNIT_TEST_FIXTURE(Test, testInlineAnchoredZOrder) +{ + // Load a document which has two shapes: an inline one and an anchored one. The inline has no + // explicit ZOrder, the anchored one has, and it's set to a value so it's visible. + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "inline-anchored-zorder.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<container::XNamed> xOval(xDrawPage->getByIndex(1), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Oval 2 + // - Actual : + // i.e. the rectangle (with no name) was on top of the oval one, not the other way around. + CPPUNIT_ASSERT_EQUAL(OUString("Oval 2"), xOval->getName()); +} + +CPPUNIT_TEST_FIXTURE(Test, testInlineInShapeAnchoredZOrder) +{ + // This document has a textbox shape and then an inline shape inside that. + // The ZOrder of the inline shape is larger than the hosting textbox, so the image is visible. + OUString aURL + = m_directories.getURLFromSrc(DATA_DIRECTORY) + "inline-inshape-anchored-zorder.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<container::XNamed> xOval(xDrawPage->getByIndex(1), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Picture 1 + // - Actual : Text Box 2 + // i.e. the image was behind the textbox that was hosting it. + CPPUNIT_ASSERT_EQUAL(OUString("Picture 1"), xOval->getName()); +} + +CPPUNIT_TEST_FIXTURE(Test, testRelfromhInsidemargin) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "relfromh-insidemargin.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int16 nRelation = 0; + xShape->getPropertyValue("HoriOrientRelation") >>= nRelation; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 7 (PAGE_FRAME) + // - Actual : 0 (FRAME) + // i.e. the horizontal position was relative to the paragraph area, not to the entire page. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, nRelation); + bool bPageToggle = false; + xShape->getPropertyValue("PageToggle") >>= bPageToggle; + CPPUNIT_ASSERT(bPageToggle); +} + +CPPUNIT_TEST_FIXTURE(Test, testWrapPolyCrop) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "wrap-poly-crop.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + drawing::PointSequenceSequence aContour; + xShape->getPropertyValue("ContourPolyPolygon") >>= aContour; + auto aPolyPolygon = basegfx::utils::UnoPointSequenceSequenceToB2DPolyPolygon(aContour); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(1), aPolyPolygon.count()); + auto aPolygon = aPolyPolygon.getB2DPolygon(0); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(4), aPolygon.count()); + + // Ideally this would be 2352, because the graphic size in mm100, using the graphic's DPI is + // 10582, the lower 33% of the graphic is cropped, and the wrap polygon covers the middle third + // of the area vertically. Which means 10582*2/3 = 7054.67 is the cropped height, and the top of + // the middle third is 2351.55. + // Then there is a 15 twips shift from the origo, so it's 2351.55 + 26.46 = 2378.01 in mm100. + // + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2368 + // - Actual : 3542 + // i.e. the wrap polygon covered a larger-than-correct area, which end the end means 3 lines + // were wrapping around the image, not only 2 as Word does it. + CPPUNIT_ASSERT_EQUAL(2368., aPolygon.getB2DPoint(0).getY()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTextboxTextline) +{ + // Load a document with a shape with a textbox. + // The shape's vertical relation is <wp:positionV relativeFrom="line">. + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "textbox-textline.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int16 nActualRelation{}; + CPPUNIT_ASSERT(xShape->getPropertyValue("VertOrientRelation") >>= nActualRelation); + sal_Int32 nActualPosition{}; + CPPUNIT_ASSERT(xShape->getPropertyValue("VertOrientPosition") >>= nActualPosition); + + sal_Int16 nExpectedRelation = text::RelOrientation::TEXT_LINE; + CPPUNIT_ASSERT_EQUAL(nExpectedRelation, nActualRelation); + sal_Int32 nExpectedPosition = -2; + CPPUNIT_ASSERT_EQUAL(nExpectedPosition, nActualPosition); +} + +CPPUNIT_TEST_FIXTURE(Test, testTextboxTextlineTop) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "textbox-textline-top.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int16 nActualRelation{}; + CPPUNIT_ASSERT(xShape->getPropertyValue("VertOrientRelation") >>= nActualRelation); + sal_Int16 nExpectedRelation = text::RelOrientation::TEXT_LINE; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 9 (TEXT_LINE) + // - Actual : 0 (FRAME) + // i.e. the anchor point for the positioning was wrong, resulting in overlapping textboxes. + CPPUNIT_ASSERT_EQUAL(nExpectedRelation, nActualRelation); + + sal_Int16 nActualOrient{}; + CPPUNIT_ASSERT(xShape->getPropertyValue("VertOrient") >>= nActualOrient); + sal_Int16 nExpectedOrient = text::VertOrientation::BOTTOM; + CPPUNIT_ASSERT_EQUAL(nExpectedOrient, nActualOrient); +} + +CPPUNIT_TEST_FIXTURE(Test, testLayoutInCellWrapnoneColumn) +{ + // Given a file with a table, then a shape anchored inside the cell: + OUString aURL + = m_directories.getURLFromSrc(DATA_DIRECTORY) + "layout-in-cell-wrapnone-column.docx"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure the shape can leave the cell: + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(1), uno::UNO_QUERY); + uno::Reference<container::XNamed> xNamedShape(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text Box 1"), xNamedShape->getName()); + bool bFollowingTextFlow = true; + // Without the accompanying fix in place, this test would have failed, the shape was not allowed + // to leave the cell, leading to incorrect layout. + CPPUNIT_ASSERT(xShape->getPropertyValue("IsFollowingTextFlow") >>= bFollowingTextFlow); + CPPUNIT_ASSERT(!bFollowingTextFlow); +} + +CPPUNIT_TEST_FIXTURE(Test, testLayoutInCellOfHraphics) +{ + // Given a file with a table, then a shape anchored inside the cell: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "layout-in-cell-2.docx"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure the cell obeys the layoutInCell: + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(1), uno::UNO_QUERY); + uno::Reference<container::XNamed> xNamedShape(xShape, uno::UNO_QUERY); + bool bFollowingTextFlow = false; + CPPUNIT_ASSERT(xShape->getPropertyValue("IsFollowingTextFlow") >>= bFollowingTextFlow); + CPPUNIT_ASSERT(bFollowingTextFlow); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/dmapper/PropertyMap.cxx b/writerfilter/qa/cppunittests/dmapper/PropertyMap.cxx new file mode 100644 index 000000000..cc651d224 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/PropertyMap.cxx @@ -0,0 +1,173 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/text/XPageCursor.hpp> +#include <com/sun/star/text/XTextViewCursorSupplier.hpp> +#include <com/sun/star/style/XStyleFamiliesSupplier.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <com/sun/star/table/BorderLine2.hpp> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/dmapper/PropertyMap.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/dmapper/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testFloatingTableHeader) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "floating-table-header.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<frame::XModel> xModel(getComponent(), uno::UNO_QUERY); + uno::Reference<text::XTextViewCursorSupplier> xTextViewCursorSupplier( + xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference<text::XPageCursor> xCursor(xTextViewCursorSupplier->getViewCursor(), + uno::UNO_QUERY); + xCursor->jumpToLastPage(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 3 + // i.e. a document which is 1 page in Word was imported as a 3 page one. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(1), xCursor->getPage()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFollowPageTopMargin) +{ + // Load a document with 2 pages: first page has larger top margin, second page has smaller top + // margin. + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "follow-page-top-margin.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(getComponent(), + uno::UNO_QUERY); + uno::Reference<container::XNameAccess> xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("PageStyles"), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xStyle(xStyleFamily->getByName("Standard"), uno::UNO_QUERY); + auto nTopMargin = xStyle->getPropertyValue("TopMargin").get<sal_Int32>(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 250 + // - Actual : 1249 + // i.e. the top margin on page 2 was too large. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(250), nTopMargin); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableNegativeVerticalPos) +{ + // Given a document with a table which has a negative vertical position (moves up to overlap + // with the header): + OUString aURL + = m_directories.getURLFromSrc(DATA_DIRECTORY) + "table-negative-vertical-pos.docx"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure we don't import that as a plain table, which can't have a negative top margin: + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. this was imported as a plain table, resulting in a 0 top margin (y pos too large). + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xDrawPage->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testNegativePageBorder) +{ + // Given a document with a top margin and a border which has more spacing than the margin: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "negative-page-border.docx"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that the border distance is negative, so it can appear at the correct + // position: + uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(getComponent(), + uno::UNO_QUERY); + uno::Reference<container::XNameAccess> xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("PageStyles"), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xStyle(xStyleFamily->getByName("Standard"), uno::UNO_QUERY); + auto nTopMargin = xStyle->getPropertyValue("TopMargin").get<sal_Int32>(); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(501), nTopMargin); + auto aTopBorder = xStyle->getPropertyValue("TopBorder").get<table::BorderLine2>(); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(159), aTopBorder.LineWidth); + auto nTopBorderDistance = xStyle->getPropertyValue("TopBorderDistance").get<sal_Int32>(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: -646 + // - Actual : 0 + // i.e. the border negative distance was lost. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-646), nTopBorderDistance); +} + +CPPUNIT_TEST_FIXTURE(Test, testNegativePageBorderNoMargin) +{ + // Given a document with no top margin and a border which has spacing: + OUString aURL + = m_directories.getURLFromSrc(DATA_DIRECTORY) + "negative-page-border-no-margin.docx"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that the border distance is negative, so it can appear at the correct + // position: + uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(getComponent(), + uno::UNO_QUERY); + uno::Reference<container::XNameAccess> xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("PageStyles"), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xStyle(xStyleFamily->getByName("Standard"), uno::UNO_QUERY); + auto nTopMargin = xStyle->getPropertyValue("TopMargin").get<sal_Int32>(); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nTopMargin); + auto aTopBorder = xStyle->getPropertyValue("TopBorder").get<table::BorderLine2>(); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(159), aTopBorder.LineWidth); + auto nTopBorderDistance = xStyle->getPropertyValue("TopBorderDistance").get<sal_Int32>(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: -1147 + // - Actual : 0 + // i.e. the border negative distance was lost. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-1147), nTopBorderDistance); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx b/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx new file mode 100644 index 000000000..b2e7f1058 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/SdtHelper.cxx @@ -0,0 +1,219 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <comphelper/sequenceashashmap.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/PropertyValues.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/text/XTextDocument.hpp> + +using namespace com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/dmapper/SdtHelper.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/dmapper/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testSdtRunRichText) +{ + // Given a document with a rich text inline/run SDT: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "sdt-run-rich-text.docx"; + + // When loading the document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that formatting of the text inside the SDT is not lost: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xPortionEnum = xPara->createEnumeration(); + uno::Reference<beans::XPropertySet> xPortion(xPortionEnum->nextElement(), uno::UNO_QUERY); + OUString aTextPortionType; + xPortion->getPropertyValue("TextPortionType") >>= aTextPortionType; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: ContentControl + // - Actual : TextField + // i.e. the SDT was imported as a text field, and the whole SDT had 12pt font size. + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aTextPortionType); + uno::Reference<text::XTextContent> xContentControl; + xPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference<text::XTextRange> xContentControlRange(xContentControl, uno::UNO_QUERY); + uno::Reference<text::XText> xText = xContentControlRange->getText(); + uno::Reference<container::XEnumerationAccess> xContentEnumAccess(xText, uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xContentEnum = xContentEnumAccess->createEnumeration(); + uno::Reference<beans::XPropertySet> xContent(xContentEnum->nextElement(), uno::UNO_QUERY); + float fCharheight{}; + xContent->getPropertyValue("CharHeight") >>= fCharheight; + CPPUNIT_ASSERT_EQUAL(12.f, fCharheight); + xContent.set(xContentEnum->nextElement(), uno::UNO_QUERY); + xContent->getPropertyValue("CharHeight") >>= fCharheight; + CPPUNIT_ASSERT_EQUAL(24.f, fCharheight); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdtRunCheckbox) +{ + // Given a document with a checkbox inline/run SDT: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "sdt-run-checkbox.docx"; + + // When loading the document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that the doc model has a clickable checkbox content control: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xPortionEnum = xPara->createEnumeration(); + uno::Reference<beans::XPropertySet> xPortion(xPortionEnum->nextElement(), uno::UNO_QUERY); + OUString aTextPortionType; + xPortion->getPropertyValue("TextPortionType") >>= aTextPortionType; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: ContentControl + // - Actual : Text + // i.e. the SDT was imported as plain text, making it hard to fill in checkboxes. + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aTextPortionType); + uno::Reference<text::XTextContent> xContentControl; + xPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY); + bool bCheckbox{}; + xContentControlProps->getPropertyValue("Checkbox") >>= bCheckbox; + CPPUNIT_ASSERT(bCheckbox); + bool bChecked{}; + xContentControlProps->getPropertyValue("Checked") >>= bChecked; + CPPUNIT_ASSERT(bChecked); + OUString aCheckedState; + xContentControlProps->getPropertyValue("CheckedState") >>= aCheckedState; + CPPUNIT_ASSERT_EQUAL(OUString(u"☒"), aCheckedState); + OUString aUncheckedState; + xContentControlProps->getPropertyValue("UncheckedState") >>= aUncheckedState; + CPPUNIT_ASSERT_EQUAL(OUString(u"☐"), aUncheckedState); + uno::Reference<text::XTextRange> xContentControlRange(xContentControl, uno::UNO_QUERY); + uno::Reference<text::XText> xText = xContentControlRange->getText(); + uno::Reference<container::XEnumerationAccess> xContentEnumAccess(xText, uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xContentEnum = xContentEnumAccess->createEnumeration(); + uno::Reference<text::XTextRange> xContent(xContentEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(u"☒"), xContent->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdtRunDropdown) +{ + // Given a document with a dropdown inline/run SDT: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "sdt-run-dropdown.docx"; + + // When loading the document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that the doc model has a clickable dropdown content control: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParagraphsAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParagraphs = xParagraphsAccess->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xParagraph(xParagraphs->nextElement(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xPortions = xParagraph->createEnumeration(); + uno::Reference<beans::XPropertySet> xTextPortion(xPortions->nextElement(), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + // Without the accompanying fix in place, this failed with: + // - Expected: ContentControl + // - Actual : TextField + // i.e. the SDT was imported as a dropdown field, which does not support display-text + value + // pairs. + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + uno::Reference<text::XTextContent> xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY); + uno::Sequence<beans::PropertyValues> aListItems; + xContentControlProps->getPropertyValue("ListItems") >>= aListItems; + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(3), aListItems.getLength()); + comphelper::SequenceAsHashMap aMap0(aListItems[0]); + CPPUNIT_ASSERT_EQUAL(OUString("red"), aMap0["DisplayText"].get<OUString>()); + CPPUNIT_ASSERT_EQUAL(OUString("R"), aMap0["Value"].get<OUString>()); + comphelper::SequenceAsHashMap aMap1(aListItems[1]); + CPPUNIT_ASSERT_EQUAL(OUString("green"), aMap1["DisplayText"].get<OUString>()); + CPPUNIT_ASSERT_EQUAL(OUString("G"), aMap1["Value"].get<OUString>()); + comphelper::SequenceAsHashMap aMap2(aListItems[2]); + CPPUNIT_ASSERT_EQUAL(OUString("blue"), aMap2["DisplayText"].get<OUString>()); + CPPUNIT_ASSERT_EQUAL(OUString("B"), aMap2["Value"].get<OUString>()); + uno::Reference<text::XTextRange> xContentControlRange(xContentControl, uno::UNO_QUERY); + uno::Reference<text::XText> xText = xContentControlRange->getText(); + uno::Reference<container::XEnumerationAccess> xContentEnumAccess(xText, uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xContentEnum = xContentEnumAccess->createEnumeration(); + uno::Reference<text::XTextRange> xContent(xContentEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("choose a color"), xContent->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdtRunPicture) +{ + // Given a document with a dropdown inline/run SDT: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "sdt-run-picture.docx"; + + // When loading the document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that the doc model has a clickable picture content control: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParagraphsAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParagraphs = xParagraphsAccess->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xParagraph(xParagraphs->nextElement(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xPortions = xParagraph->createEnumeration(); + uno::Reference<beans::XPropertySet> xTextPortion(xPortions->nextElement(), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + // Without the accompanying fix in place, this failed with: + // - Expected: ContentControl + // - Actual : Frame + // i.e. the SDT was imported as a plain image, not as a clickable placeholder in a content + // control. + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + uno::Reference<text::XTextContent> xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference<beans::XPropertySet> xContentControlProps(xContentControl, uno::UNO_QUERY); + bool bPicture{}; + xContentControlProps->getPropertyValue("Picture") >>= bPicture; + CPPUNIT_ASSERT(bPicture); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/dmapper/TextEffectsHandler.cxx b/writerfilter/qa/cppunittests/dmapper/TextEffectsHandler.cxx new file mode 100644 index 000000000..45a689b6b --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/TextEffectsHandler.cxx @@ -0,0 +1,74 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/text/XTextDocument.hpp> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/dmapper/TextEffectsHandler.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/dmapper/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testSemiTransparentText) +{ + // Load a document with a single paragraph: second text portion has semi-transparent text. + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "semi-transparent-text.docx"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xPortionEnum = xPara->createEnumeration(); + xPortionEnum->nextElement(); + uno::Reference<beans::XPropertySet> xPortion(xPortionEnum->nextElement(), uno::UNO_QUERY); + sal_Int16 nCharTransparence = 0; + xPortion->getPropertyValue("CharTransparence") >>= nCharTransparence; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 74 + // - Actual : 0 + // i.e. text was imported as regular text with solid color only. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(74), nCharTransparence); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/dmapper/data/1cell-insidev-rightborder.docx b/writerfilter/qa/cppunittests/dmapper/data/1cell-insidev-rightborder.docx Binary files differnew file mode 100644 index 000000000..d0bc40e23 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/1cell-insidev-rightborder.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/alt-chunk.docx b/writerfilter/qa/cppunittests/dmapper/data/alt-chunk.docx Binary files differnew file mode 100644 index 000000000..40d071ff4 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/alt-chunk.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/chart-zorder.docx b/writerfilter/qa/cppunittests/dmapper/data/chart-zorder.docx Binary files differnew file mode 100644 index 000000000..e022a3bde --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/chart-zorder.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/clearing-break.docx b/writerfilter/qa/cppunittests/dmapper/data/clearing-break.docx Binary files differnew file mode 100644 index 000000000..453a4c2b8 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/clearing-break.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/create-date-preserve.docx b/writerfilter/qa/cppunittests/dmapper/data/create-date-preserve.docx Binary files differnew file mode 100644 index 000000000..4a587ce0d --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/create-date-preserve.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/draw-shape-inline-effect.docx b/writerfilter/qa/cppunittests/dmapper/data/draw-shape-inline-effect.docx Binary files differnew file mode 100644 index 000000000..3eb5b0e2f --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/draw-shape-inline-effect.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/field-if-inside-if.docx b/writerfilter/qa/cppunittests/dmapper/data/field-if-inside-if.docx Binary files differnew file mode 100644 index 000000000..65e238869 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/field-if-inside-if.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/floating-table-header.docx b/writerfilter/qa/cppunittests/dmapper/data/floating-table-header.docx Binary files differnew file mode 100644 index 000000000..3840b2550 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/floating-table-header.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/follow-page-top-margin.docx b/writerfilter/qa/cppunittests/dmapper/data/follow-page-top-margin.docx Binary files differnew file mode 100644 index 000000000..ceae0b784 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/follow-page-top-margin.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/frame-direction.docx b/writerfilter/qa/cppunittests/dmapper/data/frame-direction.docx Binary files differnew file mode 100644 index 000000000..33f191e80 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/frame-direction.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/group-shape-rotation.docx b/writerfilter/qa/cppunittests/dmapper/data/group-shape-rotation.docx Binary files differnew file mode 100644 index 000000000..c9fee726b --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/group-shape-rotation.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/inline-anchored-zorder.docx b/writerfilter/qa/cppunittests/dmapper/data/inline-anchored-zorder.docx Binary files differnew file mode 100644 index 000000000..93932c470 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/inline-anchored-zorder.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/inline-inshape-anchored-zorder.docx b/writerfilter/qa/cppunittests/dmapper/data/inline-inshape-anchored-zorder.docx Binary files differnew file mode 100644 index 000000000..3792285f4 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/inline-inshape-anchored-zorder.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/large-para-top-margin.docx b/writerfilter/qa/cppunittests/dmapper/data/large-para-top-margin.docx Binary files differnew file mode 100644 index 000000000..34f24a3e2 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/large-para-top-margin.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/layout-in-cell-2.docx b/writerfilter/qa/cppunittests/dmapper/data/layout-in-cell-2.docx Binary files differnew file mode 100644 index 000000000..5b6926460 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/layout-in-cell-2.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/layout-in-cell-wrapnone-column.docx b/writerfilter/qa/cppunittests/dmapper/data/layout-in-cell-wrapnone-column.docx Binary files differnew file mode 100644 index 000000000..d88761421 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/layout-in-cell-wrapnone-column.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/negative-page-border-no-margin.docx b/writerfilter/qa/cppunittests/dmapper/data/negative-page-border-no-margin.docx Binary files differnew file mode 100644 index 000000000..8bd464a9e --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/negative-page-border-no-margin.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/negative-page-border.docx b/writerfilter/qa/cppunittests/dmapper/data/negative-page-border.docx Binary files differnew file mode 100644 index 000000000..878ba1e78 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/negative-page-border.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/nested-floating-table.docx b/writerfilter/qa/cppunittests/dmapper/data/nested-floating-table.docx Binary files differnew file mode 100644 index 000000000..73fd922fc --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/nested-floating-table.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/num-restart-style-parent.docx b/writerfilter/qa/cppunittests/dmapper/data/num-restart-style-parent.docx Binary files differnew file mode 100644 index 000000000..f908d94b5 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/num-restart-style-parent.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/page-break-footer-table.docx b/writerfilter/qa/cppunittests/dmapper/data/page-break-footer-table.docx Binary files differnew file mode 100644 index 000000000..376a1fb1e --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/page-break-footer-table.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/paste-ole.rtf b/writerfilter/qa/cppunittests/dmapper/data/paste-ole.rtf new file mode 100644 index 000000000..27ce59baa --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/paste-ole.rtf @@ -0,0 +1,30 @@ +{\rtf1 +\pard\plain\par +\pard\plain +{\object\objemb\objw1287\objh832\objscalex100\objscaley99 +{\*\objclass Package} +{\*\objdata 0105000002000000080000005061636b616765000000000000000000eb010000 +020030322e73766700443a5c446e445c54657374646174656e5c416c6c654461746569547970656e5c30322e737667000000030036000000443a5c54454d505c7b42433241443335362d363732422d344345302d394136342d3033373544464134324334377d5c30322e73766700ab0000003c7376672076657273696f6e +3d22312e31222076696577426f783d223020302034342032362220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e0a203c7265637420783d222e352220793d222e35222077696474683d22343322206865696768743d223235222072783d2232222072793d2232222066696c6c3d +222366666622207374726f6b653d2223303037616666222f3e0a3c2f7376673e0a3500000044003a005c00540045004d0050005c007b00420043003200410044003300350036002d0036003700320042002d0034004300450030002d0039004100360034002d003000330037003500440046004100340032004300340037 +007d005c00300032002e0073007600670006000000300032002e007300760067002600000044003a005c0044006e0044005c00540065007300740064006100740065006e005c0041006c006c0065004400610074006500690054007900700065006e005c00300032002e007300760067000105000000000000} +{\result +{\*\shppict +{\pict +\picscalex100\picscaley99\picw2270\pich1468\picwgoal1287\pichgoal832\emfblip +010000006c00000000000000000000009500000095000000000000000000 +0000670f0000630f000020454d4600000100280100000700000002000000 +00000000000000000000000038070000bd030000e9010000fd0000000000 +00000000000000000000f675070016dd0300210000000800000062000000 +0c0000000100000027000000180000000100000000000000ff0000000000 +000047000000700000000000000000000000950000009500000050000000 +010000002000000001000000030000003000000000000000000000009600 +000096000000320000000000000064000000320000000000000032000000 +960000006400000032000000640000006400000096000000220000000c00 +0000ffffffff0e00000014000000000000001000000014000000} +} +} +} +\pard\plain\par +\pard\plain hello\par +} diff --git a/writerfilter/qa/cppunittests/dmapper/data/ptab.docx b/writerfilter/qa/cppunittests/dmapper/data/ptab.docx Binary files differnew file mode 100644 index 000000000..d1ae18a27 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/ptab.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/relfromh-insidemargin.docx b/writerfilter/qa/cppunittests/dmapper/data/relfromh-insidemargin.docx Binary files differnew file mode 100644 index 000000000..1f7a281e8 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/relfromh-insidemargin.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/sdt-dropdown-no-display-text.docx b/writerfilter/qa/cppunittests/dmapper/data/sdt-dropdown-no-display-text.docx Binary files differnew file mode 100644 index 000000000..ed6d7ac54 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/sdt-dropdown-no-display-text.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/sdt-run-checkbox.docx b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-checkbox.docx Binary files differnew file mode 100644 index 000000000..c6718b97c --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-checkbox.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/sdt-run-dropdown.docx b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-dropdown.docx Binary files differnew file mode 100644 index 000000000..7718c0b04 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-dropdown.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/sdt-run-in-para.docx b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-in-para.docx Binary files differnew file mode 100644 index 000000000..863bc9213 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-in-para.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/sdt-run-picture.docx b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-picture.docx Binary files differnew file mode 100644 index 000000000..25fcc7f6f --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-picture.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx Binary files differnew file mode 100644 index 000000000..b945d0bb3 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/sdt-run-rich-text.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/semi-transparent-text.docx b/writerfilter/qa/cppunittests/dmapper/data/semi-transparent-text.docx Binary files differnew file mode 100644 index 000000000..6c0f8a79c --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/semi-transparent-text.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/table-negative-vertical-pos.docx b/writerfilter/qa/cppunittests/dmapper/data/table-negative-vertical-pos.docx Binary files differnew file mode 100644 index 000000000..2031f4769 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/table-negative-vertical-pos.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/tdf129205.docx b/writerfilter/qa/cppunittests/dmapper/data/tdf129205.docx Binary files differnew file mode 100644 index 000000000..4289254d0 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/tdf129205.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/tdf141540ChildRotation.docx b/writerfilter/qa/cppunittests/dmapper/data/tdf141540ChildRotation.docx Binary files differnew file mode 100644 index 000000000..902bb6192 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/tdf141540ChildRotation.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/tdf141540GroupLinePosSize.docx b/writerfilter/qa/cppunittests/dmapper/data/tdf141540GroupLinePosSize.docx Binary files differnew file mode 100644 index 000000000..d0ceff118 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/tdf141540GroupLinePosSize.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/tdf141540GroupRotation.docx b/writerfilter/qa/cppunittests/dmapper/data/tdf141540GroupRotation.docx Binary files differnew file mode 100644 index 000000000..13e65c1d1 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/tdf141540GroupRotation.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/tdf142304GroupPosition.docx b/writerfilter/qa/cppunittests/dmapper/data/tdf142304GroupPosition.docx Binary files differnew file mode 100644 index 000000000..681a6e3b7 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/tdf142304GroupPosition.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/tdf142305SquareWrapMargin.docx b/writerfilter/qa/cppunittests/dmapper/data/tdf142305SquareWrapMargin.docx Binary files differnew file mode 100644 index 000000000..9a0fc8a2b --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/tdf142305SquareWrapMargin.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/tdf142305StrokeGlowMargin.docx b/writerfilter/qa/cppunittests/dmapper/data/tdf142305StrokeGlowMargin.docx Binary files differnew file mode 100644 index 000000000..3adc2d91b --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/tdf142305StrokeGlowMargin.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/tdf143208_wrapTight.docx b/writerfilter/qa/cppunittests/dmapper/data/tdf143208_wrapTight.docx Binary files differnew file mode 100644 index 000000000..fab911ad9 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/tdf143208_wrapTight.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/tdf143455_SmartArtPosition.docx b/writerfilter/qa/cppunittests/dmapper/data/tdf143455_SmartArtPosition.docx Binary files differnew file mode 100644 index 000000000..1b1881b1e --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/tdf143455_SmartArtPosition.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/textbox-textline-top.docx b/writerfilter/qa/cppunittests/dmapper/data/textbox-textline-top.docx Binary files differnew file mode 100644 index 000000000..dbd750092 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/textbox-textline-top.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/textbox-textline.docx b/writerfilter/qa/cppunittests/dmapper/data/textbox-textline.docx Binary files differnew file mode 100644 index 000000000..493604d77 --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/textbox-textline.docx diff --git a/writerfilter/qa/cppunittests/dmapper/data/wrap-poly-crop.docx b/writerfilter/qa/cppunittests/dmapper/data/wrap-poly-crop.docx Binary files differnew file mode 100644 index 000000000..1835a130d --- /dev/null +++ b/writerfilter/qa/cppunittests/dmapper/data/wrap-poly-crop.docx diff --git a/writerfilter/qa/cppunittests/filters-test/README b/writerfilter/qa/cppunittests/filters-test/README new file mode 100644 index 000000000..2cc9fb3cb --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/README @@ -0,0 +1,7 @@ +Files with the string 'CVE' in their name are encrypted to avoid +problems with virus checkers on source code download.; use: + +mdecrypt --bare -a arcfour -o hex -k 435645 -s 3 foo.doc # to unencrypt +mcrypt --bare -a arcfour -o hex -k 435645 -s 3 foo.doc # to create new tests + +to get access to the plain files for manual testing. diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/CVE-2005-2971-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/CVE-2005-2971-1.rtf Binary files differnew file mode 100644 index 000000000..5cd42052c --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/CVE-2005-2971-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/CVE-2010-3451-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/CVE-2010-3451-1.rtf Binary files differnew file mode 100644 index 000000000..0c639810d --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/CVE-2010-3451-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/EDB-18749-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/EDB-18749-1.rtf Binary files differnew file mode 100644 index 000000000..18795f5be --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/EDB-18749-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/LIBREOFFICE-N4LA0OHZ.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/LIBREOFFICE-N4LA0OHZ.rtf new file mode 100644 index 000000000..6257e1071 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/LIBREOFFICE-N4LA0OHZ.rtf @@ -0,0 +1,403 @@ +{\rtf1\nsi\ansicpg1252\deflang3081\ftnbj\uc1\deff0
+{\fonttbl{\f0 \fswiss \fcharset0 Times New Roman;}{\f4 \fswiss 3\fcharset2 Symbol;}{\f5 \froman \fchraph Font;}{\cs2\f6\fs16\b\protect\cf1\cb3\chcbpat3\expnd0\expndtw0\charscalex100\dn0 SSBookmark;}{\s3\snext0\outlinelevel0\f0\fs32\b\cf1\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0\outlinelevel0 Heading 1;}{\s4\snext0\outlinelevel1\f0\fs24\b\cf1\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0\outlinelevel1 Heading 2;}{\s5\snext0\outlinelevel2\f0\fs24\b\cf1\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0\outlinelevel2 Heading 3
+;}{\s6\snext0\outlinelevel3\f0\fs24\b\cf1\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0\outlinelevel3 Heading 4;}{\s7\snext0\outlinelevel4\f0\fs24\b\i\cf1\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0\outlinelevel4 Heading 5;}{\s8\snext0\outlinelevel5\f0\fs20\b\cf1\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0\outlinelevel5 Heading 6;}{\s9\snext0\outlinelevel6\f0\fs24\cf4\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0\outlinelevel6 Heading 7;}{\s10\snext0\outlinelevel7\f0\fs24\i\cf4\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0\outlinelevel7 Heading 8
+;}{\s11\snext0\outlinelevel8\f0\fs22\cf4\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0\outlinelevel8 Heading 9;}{\s12\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 TOC 1;}{\s13\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li180\ri0\sb0\sa0\sl0\shading0 TOC 2;}{\s14\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li360\ri0\sb0\sa0\sl0\shading0 TOC 3;}{\s15\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li540\ri0\sb0\sa0\sl0\shading0 TOC 4;}{\s16\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li360\ri0\sb0\sa0\sl0\shading0 TOC 3;}{\s15\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li540\ri0\sb0\sa0\sl0\shading0 TOC 4;}{\s16\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li720\ri0\sb0\sa0\sl0\shading0 TOC 5
+;}{\s17\snext0\f0\fs24\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li900\ri0\sb0\sa0\sl0\shading0 TOC 6;}{\s18\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li1080\ri0\sb0\sa0\sl0\shading0 TOC 7;}{\s19\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li1260\ri0\sb0\sa0\sl0\shading0 TOC 8;}{\s20\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li1440\ri0\sb0\sa0\sl0\shading0 TOC 9;}{\s21\snext0\f0\fs32\b\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb240\sa60\sl0\shading0\qc Title;}{\s22\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi-360\li360\ri0\sb0\sa0\sl0\shading0 Numbered List
+;}{\s23\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi-360\li360\ri0\sb0\sa0\sl0\shading0 Bulleted List;}{\s24\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa120\sl0\shading0 Body Text;}{\s25\snext0\f0\fs18\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa120\sl0\sl480\slmult1\shading0 Body Text 2;}{\s26\snext0\f0\fs16\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa120\sl0\shading0 Body Text 3;}{\s27\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 Note Heading;}{\s28\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 Plain Text
+;}{\s29\snext0\f0\fs20\b\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li;}{\s29\snext0\f0\fs20\b\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li;}{\s29\snext0\f0\fs20\b\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 Strong;}{\s30\snext0\f0\fs20\i\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 Emphasis;}{\s31\snext0\f0\fs20\ul\cf5\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 Hyperlink;}{\s32\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 Footer;}{\s33\snext0\f0\fs20\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 Header;}{\s34\snext0\f0\fs18\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 Code
+;}{\cs35\f0\fs20\i\cf4\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0 Field Label;}{\cs36\f0\fs22\b\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0 Table Heading;}{\cs37\f0\fs20\b\ul\cf0\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0 Object type;}{\s38\snext0\f0\fs20\b\i\cf6\cb2\chcbpat2\expnd0\expndtw0\charscalex100\dn0\fi0\li0\ri0\sb0\sa0\sl0\shading0 List Header;}{\s39\snext24\f0\fs20\i\cf5\fi0\li0\ri0\sb0\sa120\sl240 InfoBlue;}}
+{\*\revtbl{Unknown;}}
+{\*\listtable
+{\list\listtemplateid1
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'00.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List1;}\listid1
+}
+{\list\listtemplateid2
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List2;}\listid2
+}
+{\list\listtemplateid3
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f1\fs24}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List3;}\listid3
+}
+{\list\listtemplateid4
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f1\fs24}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List4;}\listid4
+}
+{\list\listtemplateid5
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f2\fs24}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List5;}\listid5
+}
+{\list\listtemplateid6
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f2\fs24}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List6;}\listid6
+}
+{\list\listtemplateid7
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'00.}{\levelnumbers \'01}\f3\fs24}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List7;}\listid7
+}
+{\list\listtemplateid8
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f2\fs24}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List8;}\listid8
+}
+{\list\listtemplateid9
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f2\fs24}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List9;}\listid9
+}
+{\list\listtemplateid10
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f2\fs24}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List10;}\listid10
+}
+{\list\listtemplateid11
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f2\fs24}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'01.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'02.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'03.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'04.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{-\leveltext \'02\'05.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'06.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'07.}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'08.}{\levelnumbers \'01}}
+{\listname List11;}\listid11
+}
+{\list\listtemplateid12
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01. \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List735674015_1;}\listid735674015
+}
+{\list\listtemplateid16
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List366130062_1;}\listid735674016
+}
+{\list\listtemplateid17
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List366148531_1;}\listid735674017
+}
+{\list\listtemplateid18
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List366155203_1;}\listid735674018
+}
+{\list\listtemplateid19
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname ;}\listid735674019
+}
+{\list\listtemplateid20
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'02\'00.}{\levelnumbers \'01}\b}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List434687953_1;}\listid735674020
+}
+{\list\listtemplateid21
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List435828312_1;}\listid735674021
+}
+{\list\listtemplateid22
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}} {\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List435835406_1;}\listid735674022
+}
+{\list\listtemplateid23
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List435856328_1;}\listid735674023
+}
+{\list\listtemplateid24
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname ;}\listid735674024
+}
+{\list\listtemplateid25
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List437350656_1;}\listid735674025
+}
+{\list\listtemplateid26
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List437406078_1;}\listid735674026
+}
+{\list\listtemplateid27
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List36741109_1;}\listid735674027
+}
+{\list\listtemplateid28
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List-1965950843_1;}\listid735674030
+}
+{\list\listtemplateid31
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'01\'00}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00stlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'03\'00.\'01}{\levelnumbers \'01\'03}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'05\'00.\'01.\'02}{\levelnumbers \'01\'03\'05}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'07\'00.\'01.\'02.\'03}{\levelnumbers \'01\'03\'05\'07}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'09\'00.\'01.\'02.\'03.\'04}{\levelnumbers \'01\'03\'05\'07\'09}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'b\'00.\'01.\'02.\'03.\'04.\'05}{\levelnumbers \'01\'03\'05\'07\'09\'b}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'d\'00.\'01.\'02.\'03.\'04.\'05.\'06}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'f\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f}}
+{\listlevel\levelnfc0\levelfollow0\levelstartat1{\leveltext \'11\'00.\'01.\'02.\'03.\'04.\'05.\'06.\'07.\'08}{\levelnumbers \'01\'03\'05\'07\'09\'b\'d\'f\'11}}
+{\listname List-1965798031_1;}\listid735674031
+}
+}
+{\*\listoverridetable
+{\listoverride\listid735674026\listoverridecount9
+{\lfolevel\listoverrideformat\listoverridestartat
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f4\fcs1\f4\af4\fcs0\rtlch\f4\af4\ltrch}
+}
+{\lfolevel\listoverrideformat\listoverridestartat
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f4\fcs1\f4\af4\fcs0\rtlch\f4\af4\ltrch}
+}
+{\lfolevel\listoverrideformat\listoverridestartat
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f4\fcs1\f4\af4\fcs0\rtlch\f4\af4\ltrch}
+}
+{\lfolevel\listoverrideformat\listoverridestartat
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f4\fcs1\f4\af4\fcs0\rtlch\f4\af4\ltrch}
+}
+{\lfolevel\listoverrideformat\listoverridestartat
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f4\fcs1\f4\af4\fcs0\rtlch\f4\af4\ltrch}
+}
+{\lfolevel\listoverrideformat\listoverridestartat
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f4\fcs1\f4\af4\fcs0\rtlch\f4\af4\ltrch}
+}
+{\lfolevel\listoverrideformat\listoverridestartat
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f4\fcs1\f4\af4\fcs0\rtlch\f4\af4\ltrch}
+}
+{\lfolevel\listoverrideformat\listoverridestartat
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f4\fcs1\f4\af4\fcs0\rtlch\f4\af4\ltrch}
+}
+{\lfolevel\listoverrideformat\listoverridestartat
+{\listlevel\levelnfc23\levelfollow0\levelstartat1{\leveltext \'01\'b7}{\levelnumbers}\f4\fcs1\f4\af4\fcs0\rtlch\f4\af4\ltrch}
+}
+\ls1}
+}
+\paperw11908\paperh16833\margl1440\margr1440\margt1440\margb1440\headery720\footery720\nogrowautofit\deftab720\formshade\fet4\aenddoc\aftnnrlc\pgbrdrhead\pgbrdrfoot
+\sectd\pgwsxn12240\pghsxn15840\titlepg\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\headery720\footery720\sbkpage\pgnstarts1\pgnrestart\pgndec
+\plain\plain\f0\fs20
+{\footer\pard\plain\f0\fs20\plain\f0\fs20\loch \par
+\plain\f0\fs20}
+{\header\pard\plain\f0\fs20\plain\f0\fs20\loch \par
+\plain\f0\fs20}
+{\headerf\pard\plain\f0\fs20\plain\f0\fs20\loch \par
+\plain\f0\fs20}
+\li108\qc\plain\f0\fs20\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\fs20\par
+\par
+\par
+\par
+\li0\ql\plain\f0\fs20{\*\bkmkstart BKM_33fd3768_22f8_4de1_91d2_533133defa34}{\*\bkmkend BKM_33fd3768_22f8_4de1_91d2_533133defa34}{\*\bkmkstart Test1}{\*\bkmkend Test1}{\*\bkmkstart BKM_AB2df357_B3ca_4a2b_86fb_B32f0a1ff7fe}{\*\bkmkend BKM_AB2df357_B3ca_4a2b_86fb_B32f0a1ff7fe}\plain\f3\fs20\lang4105\hich\f3\dbch\f3\loch\f3\cf1\fs20\par
+\trowd\trgaph60\trleft0\trrh288\trkeep
+\clvertalc\clbrdrt\brdrs\brdrw10\clbrdrb\brdrs\brdrw10\clshdng1000\cellx9360
+\pard\intbl\ssparaaux0\s0\ql\plain\f0\fs20\plain\f5\fs20\lang1033\hich\f5\dbch\f5\loch\f5\cf1\fs20\b\loch Scenario\cell
+\plain\f5\fs20\lang1033\hich\f5\dbch\f5\loch\f5\cf1\fs20\intbl\row
+\trowd\trgaph60\trleft0\trrh676
+\clvertalt\clvmgf\cellx630
+\clvertalt\cellx9360
+\pard\intbl\ssparaaux0\s0\li360\ri90\sb40\qr\plain\f0\fs20\plain\f7\fs20\cell
+\pard\intbl\ssparaaux0\s0\sb40\ql\plain\f0\fs20\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\fs20\par
+\pard\intbl\itap2\ssparaaux0\s0\sb40\sa40\ql\plain\f0\fs20\plain\f5\fs20\lang3081\hich\f5\dbch\f5\loch\f5\cf1\fs20\b\protect\loch Basic Path\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\fs20\loch \plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\fs20\b\loch (\plain\f5\fs20\lang3081\hich\f5\dbch\f5\loch\f5\cf1\fs20\b\i\protect\loch Basic Path\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\fs20\b\loch )\nestcell{\nonesttables\par}
+\intbl\itap2
+{{\*\nesttableprops\trowd\trgaph60\trleft0
+\clvertalt\clbrdrt\brdrs\brdrw1\clbrdrb\brdrs\brdrw1\clshdng1000\clcbpat2\cellx8610
+\nestrow}{\nonesttables\par}}
+\trowd\trgaph60\trleft0\trrh676
+\clvertalt\clvmgf\cellx630
+\clvertalt\cellx9360
+\pard\intbl\ssparaaux0\s0\ql\plain\f0\fs20\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\fs20\par
+\cell
+\intbl\row
+\trowd\trgaph60\trleft0\trrh676
+\clvertalt\clvmrg\cellx630
+\clvertalt\clvmgf\cellx9360
+\pard\intbl\ssparaaux0\s0{\pntext\pard\plain\f4\fs20 \'b7\tab}{\*\pn\pnlvlblt\ls1\ilvl0\pnhang\pnf0{\pntxtb \'b7}}\ls1\ilvl0\fi-180\li360\sb40\qr\plain\f0\fs20\plain\f7\fs20\lang4105\hich\f7\dbch\f7\loch\f7\cf1\ulc1\fs20\cell
+\pard\intbl\itap2\ssparaaux0\s0{\pntext\pard\plain\f4\fs20 \'b7\tab}{\*\pn\pnlvlblt\ls1\ilvl0\pnhang\pnf0{\pntxtb \'b7}}\ls1\ilvl0\fi-180\li360\sb40\qr\plain\f0\fs20\plain\f7\fs20\lang4105\hich\f7\dbch\f7\loch\f7\cf1\ulc1\fs20\nestcell{\nonesttables\par}
+\pard\intbl\itap2\ssparaaux0\s0\ql\plain\f0\fs20{\*\bkmkstart Pkg_Element_ElemScenario_Scenario_Structured_Begin}{\*\bkmkend Pkg_Element_ElemScenario_Scenario_Structured_Begin}\plain\f6\fs16\cs2\lang4105\hich\f6\dbch\f6\loch\f6\cf1\highlight3\cb3\chcbpat3\ulc1\fs16\b\protect\loch structured scenarios {\*\bkmkstart Pkg_Element_ElemScenario_Scenario_Structured_Begin_Inner}{\*\bkmkend Pkg_Element_ElemScenario_Scenario_Structured_Begin_Inner}\loch >\plain\f7\fs20\lang4105\hich\f7\dbch\f7\loch\f7\cf1\ulc1\fs20\par
+\par
+\plain\f5\fs20\lang3081\hich\f5\dbch\f5\loch\f5\cf1\ulc1\fs20\b\protect\loch 1\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\ulc1\fs20\b\loch .\plain\f7\fs20\lang4105\hich\f7\dbch\f7\loch\f7\cf1\ulc1\fs20\loch \plain\f5\fs20\lang3081\hich\f5\dbch\f5\loch\f5\cf1\ulc1\fs20\protect\loch user enter data\plain\f7\fs20\lang4105\hich\f7\dbch\f7\loch\f7\cf1\ulc1\fs20\par
+\pard\intbl\itap2\ssparaaux0\s0\tx720\ql\plain\f0\fs20\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\fs20\b\i\par
+\pard\intbl\itap3\ssparaaux0\s0\tx720\ql\plain\f0\fs20\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\fs20\ul\i\loch Rules \loch Referenced:\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\fs20\b\i\nestcell{\nonesttables\par}
+\pard\intbl\itap3\ssparaaux0\s0\ql\plain\f0\fs20\plain\f5\fs20\lang4105\hich\f5\dbch\f5\loch\f5\cf1\fs20\b\i\nestcell{\nonesttables\par}
+\intbl\itap3
+{{\*\nesttableprops\trowd\trgaph60\trleft0
+\clvertalt\clvmgf\clcbpat2\cellx7910
+\nestrow}{\nonesttables\par}}
+\pard\intbl\itap-88\ssparaaux0\s0\tx720\ql\plain\f0\fs20\plain\f5\fs20\lang4105\hich\f5\dbch\f5\dbch\f5\loch\frd\intbl\itap-88\ssparaaux0\s0\tx720\ql\plain\f0\fs20\plain\f5\fs20\lang4105\hich\f5\dbch\f5\dbch\f5\loch\frd\intbl\itap-88\ssparaaux0\s0\tx720\ql\plain\f0\fs20\plain\f5\fs20\lang4105\hich\f5\dbch\f5\dbch\f5\loch\f5\cf1\fs20\cell
+\intbl\row
+\pard\ssparaaux0\s0\ql\plain\f0\fs20\plain\f3\fs20\lang3081\hich\f3\dbch\f3\loch\f3\cf1\fs20\par
+\plain\f7\fs20\lang4105\hich\f7\dbch\f7\loch\f7\cf1\ulc1
\ No newline at end of file diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/destinationtest-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/destinationtest-1.rtf Binary files differnew file mode 100644 index 000000000..63465b073 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/destinationtest-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/destinationtest-2.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/destinationtest-2.rtf Binary files differnew file mode 100644 index 000000000..f0152b0fa --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/destinationtest-2.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/nopropertyset-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/nopropertyset-1.rtf Binary files differnew file mode 100644 index 000000000..59c3630a7 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/nopropertyset-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/popstate-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/popstate-1.rtf Binary files differnew file mode 100644 index 000000000..041891713 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/popstate-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/popstate-2.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/popstate-2.rtf new file mode 100644 index 000000000..273bb135c --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/popstate-2.rtf @@ -0,0 +1 @@ +\\rttt\noTidqtpdp{\"pb18}\p{\"ptxtbr } diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/propheight-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/propheight-1.rtf Binary files differnew file mode 100644 index 000000000..130ff3f23 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/propheight-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/sf_edeb1eb341ad4c8608af9396952724a0-128299-minimized.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/sf_edeb1eb341ad4c8608af9396952724a0-128299-minimized.rtf new file mode 100644 index 000000000..45597c085 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/sf_edeb1eb341ad4c8608af9396952724a0-128299-minimized.rtf @@ -0,0 +1,57 @@ +{\rtf1\ansi\ansicpg1252\deff0 +{\fonttbl +{\f0\fnil\fcharset0\fprq0\fttruetype Times New Roman;} +{\f1\fnil\fcharset0\fprq0\fttruetype Nimbus Sans L;} +{\f2\fnil\fcharset0\fprq0\fttruetype Dingbats;} +{\f3\fnil\fcharset0\fprq0\fttruetype Symbol;} +{\f4\fnil\fcharset0\fprq0\fttruetype Courier New;}} +{\colortbl +\red0\green0\blue0; +\red255\green255\blue255;} +{\stylesheet +{\s1\fi-431\li720\sbasedon28\snext28 Contents 1;} +{\s2\fi-431\li1440\sbasedon28\snext28 Contents 2;} +{\s3\fi-431\li2160\sbasedon28\snext28 Contents 3;} +{\s8\fi-431\li720\sbasedon28 Lower Roman List;} +{\s5\tx431\sbasedon24\snext28 Numbered Heading 1;} +{\s6\tx431\sbasedon25\snext28 Numbered Heading 2;} +{\s7\fi-431\li720 Square List;} +{\*\cs11\sbasedon28 Endnote Text;} +{\s4\fi-431\li2880\sbasedon28\snext28 Contents 4;} +{\s9\fi-431\li720 Diamond List;} +{\s10\fi-431\li720 Numbered List;} +{\*\cs12\fs20\super Endnote Reference;} +{\s13\fi-431\li720 Triangle List;} +{\s14\tx431\sbasedon26\snext28 Numbered Heading 3;} +{\s15\fi-431\li720 Dashed List;} +{\s16\fi-431\li720\sbasedon10 Upper Roman List;} +{\s17\sb440\sa60\f1\fs24\b\sbasedon28\snext28 Heading 4;} +{\s18\fi-431\li720 Heart List;} +{\s34\fi-431\li720 Box List;} +{\s20\fi-431\li720\sbasedon10 Upper Case List;} +{\s21\fi-431\li720 Bullet List;} +{\s22\fi-431\li720 Hand List;} +{\*\cs23\fs20\sbasedon28 Footnote Text;} +{\s24\sb440\sa60\f1\fs34\b\sbasedon28\snext28 Heading 1;} +{\s25\sb440\sa60\f1\fs28\b\sbasedon28\snext28 Heading 2;} +{\s19\qc\sb240\sa120\f1\fs32\b\sbasedon28\snext28 Contents Header;} +{\s27\fi-431\li720 Tick List;} +{\s26\sb440\sa60\f1\fs24\b\sbasedon28\snext28 Heading 3;} +{\s29\fi-431\li720\sbasedon10 Lower Case List;} +{\s30\li1440\ri1440\sa120\sbasedon28 Block Text;} +{\s36\f4\sbasedon28 Plain Text;} +{\s32\tx1584\sbasedon5\snext28 Section Heading;} +{\s33\fi-431\li720 Implies List;} +{\s28\f0\fs24\lang1033 Normal;} +{\s35\fi-431\li720 Star List;} +{\*\cs31\fs20\super Footnote Reference;} +{\s37\tx1584\sbasedon5\snext28 Chapter Heading;}} +{\*\listtable +{\list\listtemplateid1002\listsimple{\listlevel\levelnfc0\levelstartat1\levelspAce0\levelfollow0\fi-431\li720{\leveltext\'02\'00.{}{\levelnumbers\'01;}}\listid1000}} +{\*\listoverridetable +{\listoverride\listoverridecount0\listid1000\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-431\li720{\leveltext\'02\'00.;}{\levelnumbers\'01;}\ls1}} + +\kerning0\cf0\ftnbj\fet2\ftnstart1\ftnnar\aftnnar\ftnstart1\aftnstart1\aenddoc\facingp\titlepg\revprop3{\info}\deftab720\viewkind1\paperw12240\paperh15840\margl1440\margr1440\widowctl +\sectd\sbknone\colsx360\pgncont\ltrsect +{\listtext\pard\fi-431\li720 1. }\pard\plain{\ltrpar\ql\fi-431\li720\s28{\*\abilist\abilistid1000\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont NULL}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA}{\pntxta .}}\fn-431\li720\ls1\ilvl0\itap0{\s28\f0\fs24\lang1033{\*\listtag0}\abinodiroverride\ltrch test}{\s28\f0\fs24\lang1033{\*\listtag1001}\par} +}\pard\plain\ltrpar\ql\s28\itap0{\s28\f0\fs24\lang1033{\*\listtag0}\par}} diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/tablemanager-5.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/tablemanager-5.rtf Binary files differnew file mode 100644 index 000000000..a03be130d --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/tablemanager-5.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/tablemanager-6.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/tablemanager-6.rtf Binary files differnew file mode 100644 index 000000000..67a0ea175 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/tablemanager-6.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/tablemanager-7.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/tablemanager-7.rtf Binary files differnew file mode 100644 index 000000000..df41b1f88 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/tablemanager-7.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/topcontext-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/topcontext-1.rtf Binary files differnew file mode 100644 index 000000000..7cdb94ab2 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/topcontext-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/topcontext-2.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/topcontext-2.rtf Binary files differnew file mode 100644 index 000000000..c0bd2691c --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/topcontext-2.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/fail/topcontext-3.rtf b/writerfilter/qa/cppunittests/filters-test/data/fail/topcontext-3.rtf new file mode 100644 index 000000000..112162397 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/fail/topcontext-3.rtf @@ -0,0 +1,28 @@ +{\ul\001ll\fJ + {Ystylesheet;{;}} +{bbbbbbbbbbbbbbbbb{O\00\80\00\tc\DD\00\FFDD\BED@DDD\F7bTr\00\00*i\\FF\FB\FB\FB\FB\FB\FB\FB\FB\FB\FB\FB\FB\FB\FB\FB\FF\ +\\\BD\EB||){Tb\FD\00\00\00p\FFA\00\00\00r \00\00\00\BB +\88\83AA4A\FC\E5C\E5\F5\E5\E5\FF\80\E5\E5\E5\D3O<BZ\ +\D\00 +\EA\00\00\00\FFbT\9B\85\00{rbNNNNNNNNNNNNNNNNN\E5\E5\E5\E5\E5\E5\E5\E5\E5IA\00\FFiH\\ +\T\\\E7\00\ED(\\92\DEs\\F0 \82\AA\AA =\00V n\E7\00\ect\00\00\00\B1\B1\B1w^w\AAuu\00\00 +\d\00\00\00\00\00\00\FFbTUUQVUߘ\98U\00DF\F6\F63#\99\00\00\98\AC\98\98\00\00 x\95es\E4\B7\D3\\00\80w\80\FF\00\AAd\FF\00*\00菋\8B\8BM`I\00 \00\80\v\U\i\F8\F8\AB\98\D8\\91\sect\\F0\F0\F0\F0\F0\F0\F0ec\F0\F0\F0 \8B\00\8B\8B\8BOOOMII\C2\C2\EC\FEw{O\00\80\00d<tR}\\iL@\A4u{\E8A\00剉\89\89\89\89\89\89\{O\86]UvII<OOOOOOOOOOMI:\C2\C2\00\00\00\00\EC\F1w{O\00\80\00d\t\B5}\\iL\\00\89k \FF\DF\DF\DF\DF\DD\DF\DF\DF\DF\00 \8EiE \E5\q\FA{P\00zri\A2\00\DD\00\AAe{\00\C0DDDD\8FDD\BED\00\E8\f\\i\\FF\E9\FF\9Bc\F1[\8\00\EB{\98 +\DFh\FF\\00\\\BD\E1||||Z|||||\A1\FD\98\98\98\98\98\98\8F\90\98\98\D8\tc}ww\00\tc}\\i\FE\\00/k շ\D3\\FF\FF}wX\EB\tc}\\iL\\9F\00/k \F6\FF\FE\FFE\FF\FF\FE\E8KK\00\00\00 \00\E6ii{ۜ\80\85 +\80\q\FA\00\00\FA\F8\E5 ގ|^ +\E5\E5\E5\E5C\E5\E5\E5\E5\FF\80\E5\E5\E5\D3\E5 +BZ\ +\t\00 +\E5\FF\FFi\00 +\ \FA>\006\FA\00\00\EB\F8\E5 \00\00\\98\00xtesշ\D3^t000c\00\00\00\00ppu\00\00\00\00\00\E5\D1\E5\80\00\00\00\FA\F8\E5'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb{O\00\80\00\tc\A5\\iL\\00\E5\F2\E5\E5\E5\80\E8\E5\E5\E5\FF\FFbTUEQU\00\00\00\00\80\00\00\AD\E5\E5\E5\E5C\00\00\00\E5\E5\E5\E5\E5\E5I \00\{P\FFig\\ +{O\00\80\00d<tR\T\ect\00\00\.AK\EF +\F\80\FF +\\\E5\FF\FF\i"\00\FFw\F4\F2\D9\00\89\89\89s\89\89k\89\8AigQ\hhhhhhhA\\00Ad\00\FFiI \00iI d\00\00\009\FFH\E2\F8\006\FA\00\00 \00NNNNNNNNNNNNNNNNNNNNN\00\B6\FA\E5[\ +\Z\ +6\006\D3\00\80\E5\FF\ig\FB~\9Fo +^ +\E5\E5\E4\E5C\E5\E5\E5\E5\E5\E5\E5\E5\E5\E5IA\00\FFiH\\ +\T\\EAd\00\FF\iI \00\E8\00\\\ +\R\xKKKKKKKKKKKKKKKKKKKKKKKKK\FF\\\F8\FF\FA\00\82\00\00\00rd\00\00ppp\FF\i\\FF\FF\A0\00\00\00%C +\FF\FF\00}g ~\80\00\80xxxxxxxxxxig\\ +\\%\E5\E5\E5\E5\E5\E5\E5\C6\E5\E5tes\E4\B7\D3\\00\80}\E5\E5,TgU\\00~ +\\006\00 diff --git a/writerfilter/qa/cppunittests/filters-test/data/indeterminate/.gitignore b/writerfilter/qa/cppunittests/filters-test/data/indeterminate/.gitignore new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/indeterminate/.gitignore diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2005-2964-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2005-2964-1.rtf Binary files differnew file mode 100644 index 000000000..da97fba57 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2005-2964-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2005-2972-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2005-2972-1.rtf Binary files differnew file mode 100644 index 000000000..70321707f --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2005-2972-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2005-2972-2.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2005-2972-2.rtf Binary files differnew file mode 100644 index 000000000..c5ea695bc --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2005-2972-2.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2007-0245-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2007-0245-1.rtf Binary files differnew file mode 100644 index 000000000..757cfe62e --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2007-0245-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2010-3333-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2010-3333-1.rtf Binary files differnew file mode 100644 index 000000000..4dac58c0c --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2010-3333-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2010-3452-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2010-3452-1.rtf new file mode 100644 index 000000000..da5d0f39b --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2010-3452-1.rtf @@ -0,0 +1 @@ +2 Hv$s
Au4j
\ No newline at end of file diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2014-1761-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2014-1761-1.rtf Binary files differnew file mode 100644 index 000000000..44d28adcb --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2014-1761-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2014-1761-2.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2014-1761-2.rtf Binary files differnew file mode 100644 index 000000000..64109fbe2 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-2014-1761-2.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-pseudo-2009-0238-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-pseudo-2009-0238-1.rtf Binary files differnew file mode 100644 index 000000000..44ed96982 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/CVE-pseudo-2009-0238-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/EDB-18754-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/EDB-18754-1.rtf Binary files differnew file mode 100644 index 000000000..f4a736920 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/EDB-18754-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/EDB-18940-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/EDB-18940-1.rtf Binary files differnew file mode 100644 index 000000000..794f325c5 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/EDB-18940-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/TCI-TN65GP-DDRHDLL-partial.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/TCI-TN65GP-DDRHDLL-partial.rtf new file mode 100644 index 000000000..7cdb1e15c --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/TCI-TN65GP-DDRHDLL-partial.rtf @@ -0,0 +1,1719 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff1\deff1\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica;} +{\f10\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f46\froman\fcharset2\fprq2{\*\panose 05030102010509060703}Webdings;}{\f273\froman\fcharset238\fprq2 Times New Roman CE;}{\f274\froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f276\froman\fcharset161\fprq2 Times New Roman Greek;}{\f277\froman\fcharset162\fprq2 Times New Roman Tur;}{\f278\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f279\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f280\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f281\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f283\fswiss\fcharset238\fprq2 Arial CE;}{\f284\fswiss\fcharset204\fprq2 Arial Cyr;}{\f286\fswiss\fcharset161\fprq2 Arial Greek;} +{\f287\fswiss\fcharset162\fprq2 Arial Tur;}{\f288\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f289\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\f290\fswiss\fcharset186\fprq2 Arial Baltic;}{\f291\fswiss\fcharset163\fprq2 Arial (Vietnamese);} +{\f293\fmodern\fcharset238\fprq1 Courier New CE;}{\f294\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f296\fmodern\fcharset161\fprq1 Courier New Greek;}{\f297\fmodern\fcharset162\fprq1 Courier New Tur;} +{\f298\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f299\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f300\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f301\fmodern\fcharset163\fprq1 Courier New (Vietnamese);} +{\f313\fswiss\fcharset238\fprq2 Helvetica CE;}{\f314\fswiss\fcharset204\fprq2 Helvetica Cyr;}{\f316\fswiss\fcharset161\fprq2 Helvetica Greek;}{\f317\fswiss\fcharset162\fprq2 Helvetica Tur;}{\f318\fbidi \fswiss\fcharset177\fprq2 Helvetica (Hebrew);} +{\f319\fbidi \fswiss\fcharset178\fprq2 Helvetica (Arabic);}{\f320\fswiss\fcharset186\fprq2 Helvetica Baltic;}{\f321\fswiss\fcharset163\fprq2 Helvetica (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255; +\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0; +\red128\green128\blue128;\red192\green192\blue192;\red255\green153\blue0;}{\stylesheet{\qr \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch +\f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd Normal;}{\s1\qr \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch \ab\af1\afs28\alang1025 \ltrch +\b\caps\f1\fs28\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 1,Title Data;}{\s2\qr \li0\ri0\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch +\f1\fs16\cf8\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 2;}{\s3\qr \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 \rtlch \ab\af4\afs26\alang1025 \ltrch +\b\f4\fs26\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 3;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs20 \ltrch \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{ +\s15\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs20\alang1025 \ltrch \f1\fs20\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 \snext0 Body Spec;}{\*\cs16 \additive \rtlch \ab\af0\afs22 \ltrch +\b\scaps\fs22\expnd3\expndtw18\lang1024\langfe1024\noproof \sbasedon10 Header Spec;}{\s17\ql \fi-72\li72\ri0\sb240\widctlpar\tx72\aspalpha\aspnum\faauto\adjustright\rin0\lin72\itap0 \rtlch \af1\afs13\alang1025 \ltrch +\f1\fs13\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 \snext17 \sautoupd mouse print;}{\s18\ql \li29\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin29\itap0 \rtlch \ab\af1\afs26\alang1025 \ltrch +\b\scaps\f1\fs26\expnd4\expndtw24\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 \snext18 Datasheet Title;}{\s19\ql \li0\ri0\sl-210\slmult0\widctlpar\tx180\tx3780\tx4050\tx9180\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch +\af1\afs16\alang1025 \ltrch \f1\fs16\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 \snext19 \sautoupd Bullet Spec;}{\s20\qr \li0\ri0\widctlpar\tqc\tx4320\tqr\tx8640\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch +\af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext20 header;}{\s21\ql \li50\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin50\itap0 \rtlch \ab\af1\afs22\alang1025 \ltrch +\b\scaps\f1\fs22\expnd3\expndtw17\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 \snext21 \sautoupd Sub Header;}{\s22\ql \fi-216\li216\ri0\widctlpar\tqr\tx216\aspalpha\aspnum\faauto\ls38\adjustright\rin0\lin216\itap0 \rtlch +\af1\afs19\alang1025 \ltrch \f1\fs19\cf17\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 \snext22 \sautoupd copper bullet text;}{\s23\ql \fi-216\li216\ri0\widctlpar\tqr\tx216\aspalpha\aspnum\faauto\ls39\adjustright\rin0\lin216\itap0 \rtlch +\af1\afs19\alang1025 \ltrch \f1\fs19\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 \sbasedon22 \snext23 white bullet black text;}{\s24\ql \li0\ri0\sb40\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch +\af1\afs17\alang1025 \ltrch \f1\fs17\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 \sbasedon0 \snext24 Part No.;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\listtable +{\list\listtemplateid-1695512888{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-4044 ?;}{\levelnumbers;}\b0\i0\strike0\outl0\shad0\embo0\impr0\caps0\v0\f46\fs18\ulnone\cf17\nosupersub\striked0\fbias0 \s22\fi-216\li216\jclisttab\tx360\lin216 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\loch\af3\hich\af3\dbch\af0\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers +;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\loch\af3\hich\af3\dbch\af0\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid265384847} +{\list\listtemplateid422860360{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-4044 ?;}{\levelnumbers;}\b0\i0\strike0\outl0\shad0\embo0\impr0\caps0\v0\f46\fs18\ulnone\cf8\nosupersub\striked0\fbias0 \s23\fi-216\li216\jclisttab\tx360\lin216 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\loch\af3\hich\af3\dbch\af0\fbias0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23 +\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\loch\af3\hich\af3\dbch\af0\fbias0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid678429498} +}{\*\listoverridetable{\listoverride\listid1665083218\listoverridecount0\ls1}{\listoverride\listid1904289489\listoverridecount0\ls2} +{\listoverride\listid1272055411\listoverridecount0\ls3}{\listoverride\listid1786775403\listoverridecount0\ls4}{\listoverride\listid95443872\listoverridecount0\ls5}{\listoverride\listid610892914\listoverridecount0\ls6}{\listoverride\listid1358891263 +\listoverridecount0\ls7}{\listoverride\listid406534060\listoverridecount0\ls8}{\listoverride\listid1411807819\listoverridecount0\ls9}{\listoverride\listid1946690268\listoverridecount0\ls10}{\listoverride\listid1825658399\listoverridecount0\ls11} +{\listoverride\listid646323806\listoverridecount0\ls12}{\listoverride\listid1445687661\listoverridecount0\ls13}{\listoverride\listid379482012\listoverridecount0\ls14}{\listoverride\listid1058817243\listoverridecount0\ls15}{\listoverride\listid1246576990 +\listoverridecount0\ls16}{\listoverride\listid1776748315\listoverridecount0\ls17}{\listoverride\listid778525720\listoverridecount0\ls18}{\listoverride\listid1312296586\listoverridecount0\ls19}{\listoverride\listid1358582950\listoverridecount0\ls20} +{\listoverride\listid455831286\listoverridecount0\ls21}{\listoverride\listid673074249\listoverridecount0\ls22}{\listoverride\listid2094740677\listoverridecount0\ls23}{\listoverride\listid-129\listoverridecount0\ls24}{\listoverride\listid275143120 +\listoverridecount0\ls25}{\listoverride\listid1245842577\listoverridecount0\ls26}{\listoverride\listid804469837\listoverridecount0\ls27}{\listoverride\listid568426430\listoverridecount0\ls28}{\listoverride\listid942303892\listoverridecount0\ls29} +{\listoverride\listid1117597776\listoverridecount0\ls30}{\listoverride\listid1117597776\listoverridecount0\ls31}{\listoverride\listid1117597776\listoverridecount0\ls32}{\listoverride\listid1117597776\listoverridecount0\ls33}{\listoverride\listid1995066837 +\listoverridecount0\ls34}{\listoverride\listid529074992\listoverridecount0\ls35}{\listoverride\listid524364841\listoverridecount0\ls36}{\listoverride\listid1529562644\listoverridecount0\ls37}{\listoverride\listid265384847\listoverridecount0\ls38} +{\listoverride\listid678429498\listoverridecount0\ls39}}{\*\rsidtbl \rsid7564464\rsid8398352\rsid9049968}{\*\generator Microsoft Word 11.0.5604;}\margl0\margr0\margt0\margb0\ltrsect +\deftab14\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin0\dgvorigin0\dghshow0\dgvshow0 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\rsidroot9049968 \fet0\ltrpar \sectd \ltrsect +\linex0\headery0\footery0\sectdefaultcl\sectrsid7564464\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}} +{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar +\s20\qr \li0\ri0\sb240\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \lang1024\langfe1024\noproof\insrsid7564464 +{\shp{\*\shpinst\shpleft1281\shptop9231\shpright4476\shpbottom11909\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz5\shplid1027{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}} +{\sp{\sn lTxid}{\sv 131072}}{\sp{\sn dxTextLeft}{\sv 64008}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 137160}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn hspNext}{\sv 1027}} +{\sp{\sn fFitShapeToText}{\sv 0}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn lidRegroup}{\sv 1}}{\sp{\sn posrelh}{\sv 0}}{\sp{\sn posrelv}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}{\shptxt \ltrpar +\pard\plain \ltrpar\s21\ql \li50\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin50\itap0 \rtlch \ab\af1\afs22\alang1025 \ltrch \b\scaps\f1\fs22\expnd3\expndtw17\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch +\cf8\insrsid7564464 Deliverables +\par }\pard\plain \ltrpar\qr \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +\par {\listtext\pard\plain\ltrpar \s23 \rtlch \af46\afs18 \ltrch \f46\fs18\cf8\lang1024\langfe1024\noproof \loch\af46\dbch\af0\hich\f46 \'34\tab}}\pard\plain \ltrpar\s23\ql \fi-216\li216\ri0\widctlpar +\tqr\tx216\aspalpha\aspnum\faauto\ls39\adjustright\rin0\lin216\itap0 \rtlch \af1\afs19\alang1025 \ltrch \f1\fs19\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 GDSII and LVS Spice netlist, behavioral, synthesis, and \line LEF models, and extensive user documentation. +\par }\pard \ltrpar\s23\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af1 \ltrch \insrsid7564464 +\par {\listtext\pard\plain\ltrpar \s23 \rtlch \af46\afs18 \ltrch \f46\fs18\cf8\lang1024\langfe1024\noproof \loch\af46\dbch\af0\hich\f46 \'34\tab}}\pard \ltrpar\s23\ql \fi-216\li216\ri0\widctlpar +\tqr\tx216\aspalpha\aspnum\faauto\ls39\adjustright\rin0\lin216\itap0 {\rtlch \af1 \ltrch \insrsid7564464 Integration support to ensure \line a successful tape out (included \line in standard design license fee). +\par }\pard\plain \ltrpar\qr \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +\par +\par }}}} +{\shp{\*\shpinst\shpleft1282\shptop2362\shpright10462\shpbottom2765\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz4\shplid1028{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}} +{\sp{\sn lTxid}{\sv 196608}}{\sp{\sn dxTextLeft}{\sv 45720}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn hspNext}{\sv 1028}}{\sp{\sn fFitShapeToText}{\sv 0}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}} +{\sp{\sn lidRegroup}{\sv 1}}{\sp{\sn posrelh}{\sv 0}}{\sp{\sn posrelv}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}{\shptxt \ltrpar \pard\plain \ltrpar +\s18\ql \li29\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin29\itap0 \rtlch \ab\af1\afs26\alang1025 \ltrch \b\scaps\f1\fs26\expnd4\expndtw24\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +DDR DLL +\par }}}} +{\shp{\*\shpinst\shpleft5674\shptop12370\shpright11068\shpbottom14170\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz3\shplid1029{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}} +{\sp{\sn lTxid}{\sv 196608}}{\sp{\sn hspNext}{\sv 1029}}{\sp{\sn fFitShapeToText}{\sv 0}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn lidRegroup}{\sv 4}}{\sp{\sn fLayoutInCell}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 0}}{\shptxt \ltrpar +\pard\plain \ltrpar\qc \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\pard\plain \ltrpar +\qc \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af1\afs24 \ltrch \fs24\insrsid5645506 {\pict\wmetafile8\picw8995\pich2892 +\picwgoal5105\pichgoal1655 +0100090000034612000004006e0000000000050000000b0200000000050000000c024c01fe030500000004010d000000050000002e01180000000500000002010100000005000000090200000000050000000102ffffff00030000001e0008000000fa02060004000000daa12900040000002d010000050000001402400038 +03050000001302400029010500000014024000db010500000013026f00db0107000000fc020000daa129000000040000002d01010008000000fa0205000100000000000000040000002d01020004000000f00100000c00000024030400cf016a00db017e00e6016a00cf016a0008000000fa02060004000000daa129000400 +00002d010000050000001402400038030500000013026f003803040000002d01020004000000f00100000c000000240304002c036a0038037e0044036a002c036a0008000000fa0206000200000000000000040000002d0100000500000014024801fa03050000001302480103000500000014024801030005000000130203 +000300050000001402030003000500000013020300fa030500000014020300fa030500000013024801fa03050000001402a5002601050000001302a5009a00050000001402a5009a0005000000130221009a0005000000140221009a000500000013022100260105000000140221002601050000001302a500260107000000 +fc020000000000000000040000002d01030004000000f0010100040000002d01020004000000f00100006600000024033100c1004a00c1004a00bd004900b9004800bb004400bb004400be004500c1004600c1004600c3004500c4004400c4004400c3004300c2004200bf004200bf004200bd004100bc004000bb003e00ba +003c00ba003c00bb003900bd003700bf003600c2003500c2003500c6003600c9003700c7003b00c7003b00c5003a00c2003900c2003900c1003a00c0003b00c0003b00c1003c00c2003d00c4003d00c4003d00c8003f00c9004000ca004300ca004300c9004600c7004800c4004900c1004a00c1004a003000000024031600 +d2004a00d2004a00d0004a00ce004900ce004700ce004500ce003b00ce003b00ce003500d3003400d3003400d3003800d3004300d3004300d3004600d4004700d4004700d5004600d5004a00d5004a00d2004a00d2004a006e00000024033500e1004900e1004900df004a00dd004a00dd004a00db004a00d9004900d80047 +00d8004500d8004500d8004300da004200dc004100df004000df004000df004000df003f00df003f00df003e00de003e00de003e00dc003e00da004000d8003d00d8003d00db003b00df003a00df003a00e2003b00e4003d00e4003d00e4003f00e4004500e4004500e5004600e5004700e3004a00e3004a00e1004900e100 +4900e1004900dd004500dd004500dd004600de004700de004700df004600df004300df004300dd004400dd004500dd004500e10049001e00000024030d00f1004a00ed004a00e7003b00ec003b00ee003f00ee003f00ef004300ef004300ef004300f0003f00f1003b00f6003b00f1004a005800000024032a00ff004600ff +0046000101460003014500050148000501480002014a00ff004a00ff004a00fc004900fa004800f8004600f8004200f8004200f8003f00f9003d00fc003b00fe003a00fe003a0001013b0004013d0005013f00050143000501430005014400fd004400fd004400fd004500fe004600ff004600ff004600ff004600ff003e00 +ff003e00fd003e00fd004100000141000001410000013f00ff003e00ff003e00ff0046005400000024032800b6006d00b6006d00b2006d00af006b00af006b00ad006700ad006300ad006300ad006000ae005d00ae005d00b0005b00b2005a00b4005900b6005900b6005900b9005900bb005a00b9005e00b9005e00b6005d +00b6005d00b4005e00b4005e00b3005f00b3006200b3006200b3006600b4006800b4006800b5006900b6006900b6006900b8006900ba006800bc006b00bc006b00b9006d00b6006d00b6006d005400000024032800cc006500cc006500cb006900ca006b00c7006d00c5006d00c5006d00c2006d00c0006b00be006900be00 +6600be006600be006200c0006000c2005e00c5005e00c5005e00c8005e00ca006000cb006200cc006500cc006500cc006500c3006600c3006600c4006900c4006a00c5006a00c5006a00c6006a00c6006900c7006500c7006500c6006200c5006100c5006100c4006200c3006600c3006600cc0065003400000024031800d8 +006d00d8006400d8006400d7006200d7006200d7006200d5006300d5006d00d0006d00d0006400d0006400cf005f00d4005e00d4005e00d4005f00d4005f00d6005e00d9005e00d9005e00db005e00dc005f00dd006200dd006d00d8006d003a00000024031b00e7005e00ea005e00e9006100e7006100e7006700e7006700 +e7006900e9006a00e9006a00ea006a00ea006d00ea006d00e7006d00e7006d00e3006d00e2006c00e2006a00e2006100e1006100e1005e00e2005e00e2005e00e2005a00e7005a00e7005a00e7005e00e7005e002c00000024031400f7006200f7006200f5006200f5006200f4006200f3006300f3006d00ee006d00ee0064 +00ee006400ee005f00f2005e00f2005e00f3006000f3006000f4005e00f6005e00f6005e00f8005e00f7006200540000002403280007016500070165000601690005016b0003016d0000016d0000016d00fd006d00fb006b00fa006900f9006600f9006600fa006200fb006000fd005e0000015e0000015e0003015e000501 +600007016200070165000701650007016500ff006600ff006600ff006900ff006a0000016a0000016a0001016a00010169000201650002016500010162000001610000016100ff006200ff006600ff0066000701650030000000240316000f016d000f016d000d016d000c016c000b016a000b0168000b015e000b015e000b +015900100158001001580010015c0010016700100167001001690011016a0011016a0012016a0013016d0013016d000f016d000f016d001200000024030700cc009000c1009000c1007c00c6007c00c6008c00cd008c00cc0090005400000024032800dd008900dd008900dc008c00db008f00d9009000d6009100d6009100 +d3009000d1008f00d0008c00cf008900cf008900d0008600d1008300d3008200d6008100d6008100d9008200db008300dc008500dd008900dd008900dd008900d4008900d4008900d5008c00d5008d00d6008d00d6008d00d7008d00d7008c00d8008800d8008800d7008500d6008500d6008500d5008500d4008900d40089 +00dd0089005400000024032800ee008900ee008900ed008c00ec008f00e9009000e7009100e7009100e4009000e2008f00e0008c00e0008900e0008900e0008600e2008300e4008200e7008100e7008100ea008200ec008300ed008500ee008900ee008900ee008900e5008900e5008900e6008c00e6008d00e7008d00e700 +8d00e8008d00e8008c00e8008800e8008800e8008500e7008500e7008500e6008500e5008900e5008900ee0089005800000024032a00f9008100f9008100fd008200fe008400ff008600ff008800ff008800ff008c00fe008f00fc009000f9009100f9009100f7009000f7009000f7009300f7009600f2009700f2008700f2 +008700f1008200f6008100f6008100f6008300f6008300f7008200f9008100f9008100f9008100f7008600f7008c00f7008c00f8008d00f8008d00f9008c00fa008900fa008900fa008600f8008500f8008500f7008600f7008600f900810008000000fa0206000200000000000000040000002d0100000500000014026400 +6c0005000000130264008900040000002d01020004000000f00100000c0000002403040087006f009a0064008700590087006f004c0000002403240026006e002400680024006800230066002200650022006e001c006e001c0058002400580024005800280059002a005a002c005c002c005e002c005e002c0061002b0063 +002900640027006400270064002a0067002a0067002d006e0026006e0026006e0022005d002200610023006100230061002500610026005f0026005f0025005d0023005d0022005d0026006e00540000002403280039006e0039006e0036006d0032006b0032006b003000680030006300300063003000600031005d003100 +5d0033005b0035005900370058003a0058003a0058003d005800400059003d005d003d005d003a005c003a005c0038005d0038005d0036005f003600620036006200360066003700680037006800380069003a006a003a006a003c0069003e00680040006c0040006c003d006e0039006e0039006e00120000002403070050 +006e0044006e00440058004a0058004a0069005100690050006e002000000024030e0055006e00550058005b0058005b006e0055006e0055006e006100620067006e0060006e005b0062005f005800660058006100620055006e001e00000024030d00e4012c01e4013801e6013801e6013b01dd013b01dd013801e0013801 +e0013001e0013001dd013201dc013001e2012c01e4012c011600000024030900eb011d01eb013301ee013301ee013601e7013601e7011a01ee011a01ee011d01eb011d011600000024030900fb013301fb011d01f8011d01f8011a01ff011a01ff013601f8013601f8013301fb01330108000000fa02060002000000000000 +00040000002d010000050000001402b0006f01050000001302b0008d01040000002d01020004000000f00100000c000000240304008a01bc009d01b1008a01a5008a01bc000e000000240305004e01a5004e01ba004a01ba004a01a5004e01a5002a000000240313005801a5005c01ad005c01ad005e01b3005e01b3005e01 +ad005e01a5006201a5006201ba005d01ba005a01b2005a01b2005701ab005701ab005701b1005701ba005301ba005301a5005801a5001e00000024030d006c01b5006c01c1006e01c1006e01c4006501c4006501c1006801c1006801ba006801ba006501bb006401b9006901b5006c01b50008000000fa0206000200000000 +000000040000002d010000050000001402b0001602050000001302b0003002040000002d01020004000000f00100000c000000240304002d02bc004002b1002d02a5002d02bc006e000000240335005602af005602af005602b3005502b6005302b8005102ba005102ba004f02ba004d02bb004d02bb004902ba004602b700 +4602b7004402b4004302b0004302b0004402ac004502a9004602a7004802a5004802a5004d02a4004d02a4005102a5005402a7005502ab005602af005602af005602af004902aa004902aa004902ac004802b0004802b0004902b4004a02b6004a02b6004d02b7004d02b7004f02b7005002b5005102b3005102af005102af +005102aa005102aa004f02a9004d02a8004d02a8004b02a8004902aa004902aa005602af004000000024031e005d02a5005d02b3005d02b3005d02b5005d02b5005f02b6006002b7006002b7006302b6006402b4006402b4006402b2006402a5006802a5006802b3006802b3006802b7006802b7006702b8006602b9006402 +ba006102bb006102bb005c02ba005a02b8005a02b8005902b6005902b4005902a5005d02a50016000000240309007a02a5007902a8007402a8007402ba007002ba007002a8006a02a8006a02a5007a02a5001e00000024030d008202b5008202c1008402c1008402c4007b02c4007b02c1007e02c1007e02ba007e02ba007a +02bb007902b9007f02b5008202b50008000000fa0206000200000000000000040000002d010000050000001402e3001602050000001302e3009e01050000001402e3009e010500000013027f009e010500000014027f009e010500000013027f0016020500000014027f001602050000001302e3001602040000002d010200 +04000000f00100006600000024033100bb01a900bb01a900b701a900b301a700b501a300b501a300b801a500bb01a500bb01a500bd01a500be01a300be01a300bd01a200bb01a200b901a100b901a100b701a000b6019f00b5019d00b4019b00b4019b00b5019800b6019600b9019500bc019500bc019500c0019500c30197 +00c1019a00c1019a00be019900bc019900bc019900bb019900ba019a00ba019a00bb019b00bc019c00be019c00be019c00c2019e00c3019f00c301a200c301a200c301a500c101a700be01a900bb01a900bb01a9003000000024031600cc01a900cc01a900ca01a900c801a800c801a600c801a400c8019a00c8019a00c801 +9500cd019400cd019400cd019800cd01a300cd01a300cd01a500ce01a600ce01a600ce01a600cf01a900cf01a900cc01a900cc01a9006e00000024033500db01a800db01a800d901a900d701a900d701a900d501a900d301a800d201a600d201a400d201a400d201a300d401a100d601a000d801a000d801a000d901a000d9 +019f00d9019f00d9019e00d8019d00d8019d00d6019e00d4019f00d2019c00d2019c00d5019a00d9019a00d9019a00dc019a00de019c00de019c00de019f00de01a400de01a400de01a600df01a700dc01aa00dc01aa00db01a800db01a800db01a800d701a400d701a400d701a500d801a600d801a600d901a500d901a300 +d901a300d701a300d701a400d701a400db01a8001e00000024030d00ea01a900e601a900e1019a00e6019a00e7019e00e7019e00e801a300e901a300e901a300e9019e00eb019a00f0019a00ea01a9005800000024032a00f901a600f901a600fb01a500fd01a400ff01a700ff01a700fc01a900f901a900f901a900f601a9 +00f301a700f201a500f101a200f101a200f2019e00f3019c00f5019a00f8019a00f8019a00fb019a00fd019c00ff019e00ff01a200ff01a200ff01a300f701a300f701a300f701a500f801a600f901a600f901a600f901a600f8019d00f8019d00f7019e00f701a000fa01a000fa01a000fa019e00f8019d00f8019d00f901 +a6004800000024032200c101ca00c101ca00bf01cc00bb01cc00b401cc00b401b800bb01b800bb01b800bd01b800c001ba00c001ba00c101bb00c201bd00c301c200c301c200c301c600c101ca00c101ca00c101ca00bb01bd00b901bd00b901c800bb01c800bb01c800bc01c800bd01c700bd01c200bd01c200bd01bf00bd +01bd00bc01bd00bb01bd00bb01bd00c101ca005800000024032a00ce01c900ce01c900d001c900d201c800d401cb00d401cb00d101cc00ce01cd00ce01cd00ca01cc00c801cb00c701c800c601c500c601c500c701c200c801bf00ca01be00cd01bd00cd01bd00d001be00d201bf00d301c200d401c500d401c500d401c600 +cb01c600cb01c600cc01c800cc01c900ce01c900ce01c900ce01c900cd01c100cd01c100cc01c100cb01c300cf01c300cf01c300ce01c100cd01c100cd01c100ce01c9003000000024031600dc01cd00dc01cd00d901cc00d801cb00d801ca00d801c800d801bd00d801bd00d701b800dc01b700dc01b700dd01bb00dd01c6 +00dd01c600dd01c900de01c900de01c900de01c900df01cc00df01cc00dc01cd00dc01cd006e00000024033500ea01cb00ea01cb00e901cc00e701cd00e701cd00e401cc00e301cb00e201ca00e201c800e201c800e201c600e301c400e501c300e801c300e801c300e901c300e901c200e901c200e901c100e801c100e801 +c100e601c100e401c200e201bf00e201bf00e501be00e801bd00e801bd00ec01be00ee01c000ee01c000ee01c200ee01c700ee01c700ee01c900ef01ca00ec01cd00ec01cd00ea01cb00ea01cb00ea01cb00e601c800e601c800e701c900e801c900e801c900e901c900e901c600e901c600e701c700e601c800e601c800ea +01cb003400000024031800fb01cc00fb01cc00fa01cf00f901d100f701d300f401d300f201d000f201d000f501cf00f701cc00f601cc00f601cc00f501c900f101be00f601bd00f801c500f801c500f901c800f901c800f901c800fa01c300fc01bd000102bd00fb01cc0008000000fa020600020000000000000004000000 +2d010000050000001402e300da010500000013021801da010500000014020801cf01050000001302f200e501040000002d01020004000000f0010000480000002403220045033b0139033b0139033701390337013c0336013c033601400333014103310141033101400330013e032f013e032f013d0330013a03310138032f +0138032f013b032c013f032c013f032c0142032c0143032d0145032f0145033001450330014403330142033501420335013e0337013e0337013e0338013e033801400338014603380145033b0116000000240309004a031d014a0333014d0333014d0336014703360147031a014d031a014d031d014a031d01160000002403 +09005a0333015a031d0158031d0158031a015e031a015e03360158033601580333015a03330108000000fa0206000200000000000000040000002d010000050000001402b000cd02050000001302b000ea02040000002d01020004000000f00100000c00000024030400e702bc00fa02b100e702a500e702bc000e00000024 +030500a802a500a802ba00a402ba00a402a500a802a5002a00000024031300b102a500b502ad00b502ad00b802b300b802b300b702ad00b702a500bb02a500bb02ba00b702ba00b302b200b302b200b002ab00b002ab00b102b100b102ba00ad02ba00ad02a500b102a5004800000024032200cb02c400bf02c400bf02c100 +bf02c100c202bf00c202bf00c602bc00c702ba00c702ba00c602b900c402b800c402b800c302b900c102ba00be02b800be02b800c202b600c602b500c602b500c802b500ca02b600cb02b800cb02ba00cb02ba00ca02bc00c802be00c802be00c402c100c402c100c402c100c402c100c702c100cc02c100cb02c400080000 +00fa0206000200000000000000040000002d010000050000001402b0007403050000001302b0008d03040000002d01020004000000f00100000c000000240304008a03bc009d03b1008a03a5008a03bc006e00000024033500b303af00b303af00b303b300b203b600b103b800af03ba00af03ba00ad03ba00aa03bb00aa03 +bb00a603ba00a303b700a303b700a103b400a103b000a103b000a103ac00a203a900a403a700a603a500a603a500aa03a400aa03a400ae03a500b103a700b303ab00b303af00b303af00b303af00a703aa00a703aa00a603ac00a603b000a603b000a603b400a803b600a803b600aa03b700aa03b700ac03b700ad03b500ae +03b300ae03af00ae03af00ae03aa00ae03aa00ad03a900aa03a800aa03a800a803a800a703aa00a703aa00b303af004000000024031e00ba03a500ba03b300ba03b300bb03b500bb03b500bc03b600be03b700be03b700c003b600c103b400c103b400c103b200c103a500c603a500c603b300c603b300c503b700c503b700 +c403b800c303b900c103ba00be03bb00be03bb00ba03ba00b703b800b703b800b603b600b603b400b603a500ba03a5001600000024030900d703a500d603a800d103a800d103ba00cd03ba00cd03a800c803a800c803a500d703a5004800000024032200e403c400d803c400d803c100d803c100db03bf00db03bf00df03bc +00e003ba00e003ba00df03b900de03b800de03b800dc03b900da03ba00d703b800d703b800db03b600df03b500df03b500e103b500e303b600e403b800e403ba00e403ba00e303bc00e203be00e203be00de03c100de03c100dd03c100dd03c100e003c100e503c100e403c40008000000fa02060002000000000000000400 +00002d010000050000001402e3007303050000001302e300fb02050000001402e300fb020500000013027f00fb020500000014027f00fb020500000013027f0073030500000014027f007303050000001302e3007303040000002d01020004000000f001000066000000240331001803a9001803a9001403a9001103a70012 +03a3001203a3001503a5001803a5001803a5001a03a5001b03a3001b03a3001a03a2001903a2001603a1001603a1001403a00013039f0012039d0012039b0012039b0012039800140396001603950019039500190395001d039500210397001e039a001e039a001c0399001a0399001a0399001803990017039a0017039a00 +18039b0019039c001b039c001b039c001f039e0020039f002103a2002103a2002003a5001e03a7001c03a9001803a9001803a90030000000240316002903a9002903a9002703a9002603a8002503a6002503a40025039a0025039a00250395002a0394002a0394002a0398002a03a3002a03a3002a03a5002b03a6002b03a6 +002c03a6002d03a9002d03a9002903a9002903a9006e000000240335003803a8003803a8003603a9003403a9003403a9003203a9003003a8002f03a6002f03a4002f03a4003003a3003103a1003303a0003603a0003603a0003703a00037039f0037039f0036039e0035039d0035039d0033039e0031039f002f039c002f03 +9c0032039a0036039a0036039a003a039a003b039c003b039c003c039f003c03a4003c03a4003c03a6003d03a7003a03aa003a03aa003803a8003803a8003803a8003403a4003403a4003403a5003503a6003503a6003703a5003703a3003703a3003403a3003403a4003403a4003803a8001e00000024030d004803a90044 +03a9003e039a0043039a0045039e0045039e004603a3004603a3004603a30047039e0048039a004d039a004803a9005800000024032a005603a6005603a6005803a5005a03a4005c03a7005c03a7005903a9005603a9005603a9005303a9005103a7004f03a5004f03a2004f03a2004f039e0051039c0053039a0056039a00 +56039a0059039a005b039c005c039e005c03a2005c03a2005c03a3005403a3005403a3005403a5005503a6005603a6005603a6005603a60056039d0056039d0054039e005403a0005703a0005703a00057039e0056039d0056039d005603a60048000000240322001e03ca001e03ca001c03cc001903cc001103cc001103b8 +001803b8001803b8001b03b8001d03ba001d03ba001f03bb002003bd002003c2002003c2002003c6001e03ca001e03ca001e03ca001803bd001603bd001603c8001803c8001803c8001903c8001a03c7001b03c2001b03c2001b03bf001a03bd001903bd001803bd001803bd001e03ca005800000024032a002b03c9002b03 +c9002d03c9002f03c8003103cb003103cb002e03cc002b03cd002b03cd002803cc002503cb002403c8002403c5002403c5002403c2002503bf002703be002a03bd002a03bd002d03be002f03bf003103c2003103c5003103c5003103c6002903c6002903c6002903c8002a03c9002b03c9002b03c9002b03c9002a03c1002a +03c1002903c1002903c3002c03c3002c03c3002c03c1002a03c1002a03c1002b03c90030000000240316003903cd003903cd003703cc003503cb003503ca003503c8003503bd003503bd003503b8003a03b7003a03b7003a03bb003a03c6003a03c6003a03c9003b03c9003b03c9003c03c9003c03cc003c03cc003903cd00 +3903cd006e000000240335004803cb004803cb004603cc004403cd004403cd004203cc004003cb003f03ca003f03c8003f03c8003f03c6004103c4004303c3004603c3004603c3004603c3004603c2004603c2004603c1004503c1004503c1004303c1004103c2003f03bf003f03bf004203be004603bd004603bd004903be +004b03c0004b03c0004b03c2004b03c7004b03c7004c03c9004c03ca004a03cd004a03cd004803cb004803cb004803cb004403c8004403c8004403c9004503c9004503c9004603c9004603c6004603c6004403c7004403c8004403c8004803cb0034000000240318005903cc005903cc005803cf005603d1005403d3005103 +d3004f03d0004f03d0005303cf005403cc005303cc005303cc005203c9004e03be005303bd005603c5005603c5005603c8005603c8005603c8005703c3005903bd005e03bd005903cc0008000000fa0206000200000000000000040000002d010000050000001402e30037030500000013021801370305000000140208012c +03050000001302f2004203040000002d01020004000000f00100002a000000240313001803310118032d0113032d01120331010d03310113031e0118031e011e0331011803310118033101160326011603260115032401150324011503270114032a0117032a01160326011803310144000000240320002b032f012b032f01 +29033001260331011f0331011f031e0126031e0126031e0128031f012a031f012a031f012d0322012d0327012d0327012d032b012b032f012b032f012b032f01260322012403220124032d0126032d0126032d0127032d0127032c012803270128032701270323012703220126032201260322012b032f011c00000024030c +0035033001350330013503320133033401300336012e0334012e0334013003310130032e0130031e0135031e01350330012a00000024031300bc013101bb012d01b6012d01b5013101b0013101b6011e01bb011e01c1013101bc013101bc013101b9012601b9012601b9012401b9012401b8012701b7012a01ba012a01b901 +2601bc0131014400000024032000ce012f01ce012f01cc013001c9013101c3013101c3011e01c9011e01c9011e01cb011f01cd011f01cd011f01d0012201d1012701d1012701d0012b01ce012f01ce012f01ce012f01c9012201c7012201c7012d01c9012d01c9012d01ca012d01cb012c01cb012701cb012701cb012301ca +012201c9012201c9012201ce012f011c00000024030c00d8013001d8013001d8013201d7013401d3013601d1013401d1013401d3013101d3012e01d3011e01d8011e01d8013001040000002701ffff030000000000}}}{\rtlch \af1 \ltrch \insrsid5645506 +\par }}}} +{\shp{\*\shpinst\shpleft1281\shptop3312\shpright4428\shpbottom9000\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz2\shplid1030{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}} +{\sp{\sn lTxid}{\sv 327680}}{\sp{\sn dxTextLeft}{\sv 64008}}{\sp{\sn dyTextTop}{\sv 182880}}{\sp{\sn dxTextRight}{\sv 137160}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn hspNext}{\sv 1030}} +{\sp{\sn fFitShapeToText}{\sv 0}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn lidRegroup}{\sv 1}}{\sp{\sn posrelh}{\sv 0}}{\sp{\sn posrelv}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}{\shptxt \ltrpar +\pard\plain \ltrpar\s21\ql \li50\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin50\itap0 \rtlch \ab\af1\afs22\alang1025 \ltrch \b\scaps\f1\fs22\expnd3\expndtw17\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch +\insrsid7564464 Features +\par }\pard\plain \ltrpar\qr \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +\par {\listtext\pard\plain\ltrpar \s22 \rtlch \af46\afs18 \ltrch \f46\fs18\cf17\lang1024\langfe1024\noproof \loch\af46\dbch\af0\hich\f46 \'34\tab}}\pard\plain \ltrpar\s22\ql \fi-216\li216\ri0\widctlpar +\tqr\tx216\aspalpha\aspnum\faauto\ls38\adjustright\rin0\lin216\itap0 \rtlch \af1\afs19\alang1025 \ltrch \f1\fs19\cf17\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 Designed for high-speed DDR style interface applications. +\par }\pard\plain \ltrpar\qr \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +\par {\listtext\pard\plain\ltrpar \s22 \rtlch \af46\afs18 \ltrch \f46\fs18\cf17\lang1024\langfe1024\noproof \loch\af46\dbch\af0\hich\f46 \'34\tab}}\pard\plain \ltrpar\s22\ql \fi-216\li216\ri0\widctlpar +\tqr\tx216\aspalpha\aspnum\faauto\ls38\adjustright\rin0\lin216\itap0 \rtlch \af1\afs19\alang1025 \ltrch \f1\fs19\cf17\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 Generates precise delays that can be programmed from 0 to 360 degrees of the reference period. +\par }\pard\plain \ltrpar\qr \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +\par {\listtext\pard\plain\ltrpar \s22 \rtlch \af46\afs18 \ltrch \f46\fs18\cf17\lang1024\langfe1024\noproof \loch\af46\dbch\af0\hich\f46 \'34\tab}}\pard\plain \ltrpar\s22\ql \fi-216\li216\ri0\widctlpar +\tqr\tx216\aspalpha\aspnum\faauto\ls38\adjustright\rin0\lin216\itap0 \rtlch \af1\afs19\alang1025 \ltrch \f1\fs19\cf17\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 Delays multiple periodic or aperiodic signals independent of voltage and temperature. +\par }\pard\plain \ltrpar\qr \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +\par {\listtext\pard\plain\ltrpar \s22 \rtlch \af46\afs18 \ltrch \f46\fs18\cf17\lang1024\langfe1024\noproof \loch\af46\dbch\af0\hich\f46 \'34\tab}}\pard\plain \ltrpar\s22\ql \fi-216\li216\ri0\widctlpar +\tqr\tx216\aspalpha\aspnum\faauto\ls38\adjustright\rin0\lin216\itap0 \rtlch \af1\afs19\alang1025 \ltrch \f1\fs19\cf17\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 Delivers optimal jitter \line performance over a wide \line frequency range. +\par }\pard\plain \ltrpar\qr \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +\par {\listtext\pard\plain\ltrpar \s22 \rtlch \af46\afs18 \ltrch \f46\fs18\cf17\lang1024\langfe1024\noproof \loch\af46\dbch\af0\hich\f46 \'34\tab}}\pard\plain \ltrpar\s22\ql \fi-216\li216\ri0\widctlpar +\tqr\tx216\aspalpha\aspnum\faauto\ls38\adjustright\rin0\lin216\itap0 \rtlch \af1\afs19\alang1025 \ltrch \f1\fs19\cf17\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 Available in flexible form factors for easier integration. +\par }}}} +{\shp{\*\shpinst\shpleft5061\shptop3312\shpright11541\shpbottom11952\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz1\shplid1031{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}} +{\sp{\sn lTxid}{\sv 393216}}{\sp{\sn dxTextLeft}{\sv 274320}}{\sp{\sn dyTextTop}{\sv 182880}}{\sp{\sn dxTextRight}{\sv 137160}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn hspNext}{\sv 1031}} +{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn lidRegroup}{\sv 1}}{\sp{\sn posrelh}{\sv 0}}{\sp{\sn posrelv}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}{\shptxt \ltrpar \pard\plain \ltrpar +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs16\alang1025 \ltrch \f1\fs16\cf1\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af1\afs22 \ltrch +\cs16\b\scaps\fs22\expnd3\expndtw18\lang1024\langfe1024\noproof\insrsid7564464 Specifications +\par }\pard\plain \ltrpar\s24\ql \li0\ri0\sb40\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs17\alang1025 \ltrch \f1\fs17\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +Part No. TCI-TN65GP-DDRHDLL +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af1\afs20\alang1025 \ltrch \f1\fs20\cf1\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +\par }\pard\plain \ltrpar\s19\ql \fi-3780\li3780\ri0\sl-210\slmult0\widctlpar\tx180\tx3780\tx4050\tx9180\aspalpha\aspnum\faauto\adjustright\rin0\lin3780\itap0 \rtlch \af1\afs16\alang1025 \ltrch +\f1\fs16\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 - Reference input frequency range\tab 220MHz - 1.1GHz +\par - Slave delay adjustment range\tab 0% - 50% of reference cycle +\par - Slave delay adjustment resolution\tab 0.83% of reference cycle +\par - Specified master adjustment setting (MADJ)\tab 120 +\par - Allowed master adjustment range (MADJ)\tab 76 - 256 +\par - Specified slave adjustment range (ADJ)\tab 0 - 60 +\par - Slave delay equation\tab ADJ[7:0]/MADJ[7:0]*Tref +\par - Number of slaves in cluster\tab 2 +\par - Pulse-width distortion (max)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par - Slave delay DNL (max)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par - Slave delay INL (max)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par - Slave delay jitter (P-P) (max)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par - Total slave timing uncertainty (max)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par +\par - Power dissipation (nom)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par - Reset pulse width (min)\tab 1\'b5s +\par - Lock time (min allowed)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par - Area (master + 2 slaves, isolation) (max)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par +\par - Added core supply package pins\tab 1 VDD and 1 VSS +\par - Low freq. supply noise est. (P-P) (max)\tab 10% VDD +\par - Low freq. sub. noise est. (P-P) (max)\tab 10% VDD +\par - Reference input jitter (period, P-P) (max)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par - Reference input duty-cycle range\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par - High/low slave input pulse width (min)\tab }{\rtlch \af1 \ltrch \i\cf17\insrsid3022649\charrsid3022649 NDA Required}{\rtlch \af1 \ltrch \insrsid3022649 +\par - Slave inputs need not be periodic +\par - Reference input 10%-90% edge time (max)\tab 150ps +\par - Slave input 10%-90% edge time (max)\tab 150ps +\par - Slave output loading (max)\tab 200fF +\par +\par - Process technology\tab TSMC CLN65GP 65nm +\par - Supply voltage (nom, tol)\tab 1.0V, +/-10% +\par - Junction temperature (nom, min, max)\tab 70C, -40C, 125C +\par }\pard\plain \ltrpar\s17\ql \fi-72\li72\ri0\sb240\widctlpar\tx72\aspalpha\aspnum\faauto\adjustright\rin0\lin72\itap0 \rtlch \af1\afs13\alang1025 \ltrch \f1\fs13\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp1033 {\rtlch \af1 \ltrch \insrsid7564464 +*\tab Jitter numbers are worst-case estimates with 10% VDD supply and \line substrate noise\emdash actual results will be better. +\par }}}} +{\shp{\*\shpinst\shpleft0\shptop0\shpright11784\shpbottom15364\shpfhdr0\shpbxmargin\shpbxignore\shpbymargin\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid1032{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}} +{\sp{\sn pib}{\sv {\pict\picscalex33\picscaley33\piccropl0\piccropr0\piccropt0\piccropb0\picw62336\pich81306\picwgoal35340\pichgoal46095\wmetafile8\bliptag463789102{\*\blipuid 1ba4dc2e9856bff4bcf39ce845fe6d2b} +010009000003d7b900000400e09e000000000400000003010800050000000b0230002e00050000000c02010c3409040000000601010007000000fc020000cccc +cc000000040000002d01000008000000fa0205000000000000000000040000002d0101000f00000038050100050082002801f2002801f2003601820036018200 +2801040000000601010007000000fc020000000000000000040000002d01020004000000f00100000f000000380501000500f2002801cf012801cf013601f200 +3601f2002801040000000601020007000000fc020000efa000000000040000002d01000004000000f001020017000000380501000900fe00e100f900e100f900 +f100f400f100f400e100ef00e100ef00dd00ff00dd00fe00e10004000000060102004c0000003805020018000b000d01f1000d01f1000b01ed000b01ed000901 +ea000801e9000701e9000701f1000301f1000301dd000a01dd000a01dd000d01dd001001df001001df001101e1001201e3001201e3001101e5001001e7000e01 +e8000e01e8001301f1000d01f1000901e1000701e1000701e5000901e5000901e5000c01e5000c01e3000c01e3000c01e1000901e1000901e100040000000601 +020041000000380501001e002401ef002401ef002201f0001e01f1001e01f1001a01f0001701ef001701ef001601ed001601ea001601dd001b01dd001b01ea00 +1b01ea001b01ec001b01ec001c01ed001e01ed001e01ed002001ec002001ec002101eb002101e9002101dd002601dd002601ea002601ea002501ed002401ef00 +2401ef0004000000060102001f000000380501000d002b01f1002b01dd003801dd003701e1003001e1003001e4003601e4003601e8003001e8003001ed003801 +ed003801f1002b01f1001c000000fb02dcff000000000000900100000000000002224d657461506c7573426f6c644361707300f4cd0c00000000312027403120 +2700040000002d010200040000000601020007000000fc020000000000000000040000002d01030004000000f0010000550000003805010028004d01f1004d01 +f1004a01f0004701ef004701ef004501eb004401e7004401e7004401e4004601e1004601e1004901de004b01dd004d01dd004d01dd005001dd005301df005101 +e1005101e1004e01e0004e01e0004b01e0004901e2004901e2004801e4004801e7004801e7004801ea004901ec004901ec004b01ee004e01ee004e01ee005001 +ee005201ed005301ef005301ef005101f0004d01f1004d01f10004000000060102000f0000003805010005005701f1005701dd005b01dd005b01f1005701f100 +04000000060102005c000000380502001d000e006c01f1006c01f1006a01ee006a01ee006601e9006601e9006501e8006501f1006101f1006101dd006701dd00 +6701dd006a01de006d01df006d01df006e01e0006f01e3006f01e3006e01e5006d01e7006c01e8006901e8006901e8006a01e9006a01e9006d01ed006d01ed00 +7001f1006c01f1006501e0006501e6006701e6006701e6006a01e5006a01e5006b01e4006b01e3006b01e3006b01e1006901e0006901e0006701e0006501e000 +0400000006010200550000003805010028007d01f1007d01f1007901f0007601ef007601ef007401eb007301e7007301e7007401e4007501e1007501e1007801 +de007a01dd007d01dd007d01dd008001dd008201df008001e1008001e1007d01e0007d01e0007a01e0007801e2007801e2007701e4007701e7007701e7007701 +ea007901ec007901ec007a01ee007d01ee007d01ee007f01ee008101ed008301ef008301ef008001f0007d01f1007d01f1000400000006010200430000003805 +01001f009301ef009301ef009101f1008e01f1008e01f1008901f0008701ee008701ee008601ec008601ea008601dd008a01dd008a01e9008a01e9008a01ec00 +8a01ec008b01ee008e01ee008e01ee009001ee009101ed009101ed009201ec009201ea009201dd009501dd009501ea009501ea009501ed009301ef009301ef00 +04000000060102000f0000003805010005009c01f1009c01dd009f01dd009f01f1009c01f100040000000601020017000000380501000900b201e000ad01e000 +ad01f100a901f100a901e000a401e000a401dd00b301dd00b201e000040000000601020071000000380501003600c101f000c101f000be01f100bc01f100bc01 +f100b801f100b501ef00b601ed00b601ed00b901ee00bc01ee00bc01ee00bf01ee00bf01ee00c001ed00c001eb00c001eb00bf01ea00bd01e900ba01e800ba01 +e800b801e700b601e500b601e500b501e300b501e300b601e000b701de00ba01dd00bd01dd00bd01dd00c001dd00c401df00c201e100c201e100bf01e000bd01 +e000bd01e000ba01e000b901e200b901e200ba01e400bc01e500bf01e500bf01e500c101e600c301e700c301e700c401e900c401eb00c401eb00c301ee00c101 +f000c101f00004000000060102000f000000380501000500cf01f100cf01dd00d201dd00d201f100cf01f10004000000060102002b000000380501001300e401 +f100df01e700df01e700dc01e200dc01e200dc01e700dc01f100d901f100d901dd00dd01dd00e201e700e201e700e501ec00e501ec00e401e600e401dd00e801 +dd00e801f100e401f100040000000601020055000000380501002800f601f100f601f100f201f000ef01ef00ef01ef00ed01eb00ed01e700ed01e700ed01e400 +ee01e100ee01e100f201de00f401dd00f601dd00f601dd00f901dd00fb01df00fa01e100fa01e100f601e000f601e000f301e000f101e200f101e200f101e400 +f001e700f001e700f101ea00f201ec00f201ec00f401ee00f601ee00f601ee00f801ee00fa01ed00fc01ef00fc01ef00f901f000f601f100f601f10004000000 +0601020007000000fc020000efa000000000040000002d01000004000000f001030008000000fa0205000000000000000000040000002d01030004000000f001 +010007000000fc020000efa000000000040000002d01010004000000f00100000d0000003805010004006a007f007e0089006a0094006a007f0008000000fa02 +05000000000000000000040000002d01000004000000f001030007000000fc020100000000000000040000002d01030004000000f00101000c00000025030400 +6a007f007e0089006a0094006a007f00040000000601020007000000fc020000000000000000040000002d01010004000000f001030008000000fa0205000000 +000000000000040000002d01030004000000f001000007000000fc020000000000000000040000002d01000004000000f00101001b000000380501000b008200 +ca00820074009000740090008300e5008300e5009100900091009000bc00e400bc00e400ca008200ca0008000000fa0205000000000000000000040000002d01 +010004000000f001030007000000fc020100000000000000040000002d01030004000000f00100001a00000025030b008200ca00820074009000740090008300 +e5008300e5009100900091009000bc00e400bc00e400ca008200ca00040000000601020007000000fc020000000000000000040000002d01000004000000f001 +030008000000fa0205000000000000000000040000002d01030004000000f001010007000000fc020000000000000000040000002d01010004000000f0010000 +170000003805010009005601ca00f300ca00f30083005601830056019100010191000101bc005601bc005601ca0008000000fa02050000000000000000000400 +00002d01000004000000f001030007000000fc020100000000000000040000002d01030004000000f001010016000000250309005601ca00f300ca00f3008300 +5601830056019100010191000101bc005601bc005601ca00040000000601020007000000fc020000000000000000040000002d01010004000000f00103000800 +0000fa0205000000000000000000040000002d01030004000000f001000007000000fc020000000000000000040000002d01000004000000f00101000f000000 +3805010005007301ca006401ca0064018300730183007301ca0008000000fa0205000000000000000000040000002d01010004000000f001030007000000fc02 +0100000000000000040000002d01030004000000f00100000e000000250305007301ca006401ca0064018300730183007301ca00040000000601020007000000 +fc020000000000000000040000002d01000004000000f001030008000000fa0205000000000000000000040000002d01030004000000f001010007000000fc02 +0000000000000000040000002d01010004000000f00100003a000000380502000a0010000002ed000002f200ff01f200ff01ed00fd01ed00fd01ec000202ec00 +0202ed000002ed000002ed000902f2000902ed000902ed000702f2000602f2000502ed000402ed000402f2000302f2000302ec000502ec000702f0000802ec00 +0a02ec000a02f2000902f20008000000fa0205000000000000000000040000002d01000004000000f001030007000000fc020100000000000000040000002d01 +030004000000f00101001800000025030a000002ed000002f200ff01f200ff01ed00fd01ed00fd01ec000202ec000202ed000002ed000002ed00240000002503 +10000902f2000902ed000902ed000702f2000602f2000502ed000402ed000402f2000302f2000302ec000502ec000702f0000802ec000a02ec000a02f2000902 +f200040000000601010007000000fc020000efa000000000040000002d01010004000000f00103000f000000380501000500cf0128010c0928010c093601cf01 +3601cf012801e09e0000430f2000cc0000002700b6020000000075002208bc01ee0028000000b60200002700000001001800000000007c3d0100130b0000130b +00000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef +02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00a +a4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7 +f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf1 +1dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126 +aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1 +f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f2 +38b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341 +b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bb +f449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef4 +51bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55a +c1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5 +f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f6 +6bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674 +cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bce +f77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f7 +85d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88c +d4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7 +f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf9 +9cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4 +ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0 +faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fa +b4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbc +e6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8 +fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfc +caebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1 +eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1 +fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fd +e0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6 +f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8 +feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafe +f3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8 +fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefe +fffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06 +a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6 +f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f0 +18a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120 +acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229af +f22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f2 +32b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33b +b6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9 +f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf4 +4dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455 +c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3 +f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f5 +67c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66e +c9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677cc +f677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff7 +7fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888 +d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6 +f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f8 +98d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99f +dbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7de +f9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1fa +afe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7 +e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7 +fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafb +c6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcce +edfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4ef +fcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fd +dcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2 +f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7 +fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9fe +eff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5 +fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfe +fffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00 +a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3 +f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f0 +12a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11c +aaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125ae +f125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f2 +2eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237 +b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7 +f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf3 +48bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450 +bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1 +f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f5 +61c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66a +c8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cb +f673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf7 +7bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782 +d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4 +f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f8 +93d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99b +daf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3dd +f9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0fa +abe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3 +e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5 +fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fb +c3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9 +ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0ee +fcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fd +d8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddf +f3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6 +fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8fe +ecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2 +fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fc +fff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfeff +fdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2 +ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f0 +0ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017 +a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11fac +f120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff2 +28aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231 +b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6 +f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f3 +43b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44c +bcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bf +f454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f5 +5dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565 +c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9 +f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf6 +76ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77e +cff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2 +f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f8 +8fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897 +d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edb +f99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9 +a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faae +e1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4 +fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fb +bee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5 +eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdec +fccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effc +d4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fdda +f1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4 +fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fe +e8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feef +f9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fb +fef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdff +fafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffff +ffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f0 +08a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011 +a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaa +f11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf1 +23adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22c +b1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4 +f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f3 +3eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346 +baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbd +f450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f4 +58c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560 +c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7 +f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf6 +72caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77a +cdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0 +f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f8 +8ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892 +d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9 +f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9 +a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaa +dffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2 +fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fb +bae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1 +e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8eb +fcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfc +d0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7 +f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3 +fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fd +e5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feeb +f8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fa +fef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfe +f7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffc +fefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef +03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00d +a5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8 +f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf1 +1facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127 +aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2 +f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f3 +39b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342 +b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbc +f44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff4 +53bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55c +c2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5 +f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f6 +6cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675 +cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcf +f77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f7 +86d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88e +d5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8 +f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf9 +9edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5 +def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1 +faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fa +b5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbd +e6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9 +fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfc +ccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3 +effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1 +fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fd +e1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7 +f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9 +feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfe +f4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffa +fdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffff +ffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07 +a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6 +f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f1 +19a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122 +adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0 +f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f2 +34b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33d +b7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345ba +f346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf4 +4ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457 +c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3 +f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f6 +68c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670 +caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cd +f779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f7 +81d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889 +d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6 +f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f9 +99d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1 +dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9df +faa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fa +b1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9 +e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7 +fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafc +c7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccf +edfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0 +fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fd +ddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4 +f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7 +feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fe +f1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6 +fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfe +fffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02 +a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4 +f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f0 +15a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11e +abf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126ae +f127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f2 +2fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238 +b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8 +f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf4 +49bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452 +bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1 +f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f5 +64c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66b +c8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cb +f674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef7 +7ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785 +d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4 +f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f8 +95d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99d +dbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4dd +f9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0fa +ace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4 +e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6 +fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fb +c3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccb +ecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1ee +fcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fd +daf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0 +f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6 +fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8fe +edf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3 +fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fd +fff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefeff +fefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2 +ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f0 +0fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118 +a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121ac +f121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f2 +2ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233 +b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6 +f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f3 +45baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44d +bdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0 +f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f5 +5ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567 +c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fca +f66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf6 +78cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780 +d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3 +f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f8 +90d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998 +d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dc +f9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffa +a8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0 +e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4 +fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fb +c0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6 +eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceed +fcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effc +d5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddc +f2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5 +fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7fe +eaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0 +f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fb +fef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfeff +fbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0 +ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f0 +0aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014 +a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caa +f11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef1 +26aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22e +b1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4 +f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f3 +3fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448 +bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451be +f451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f5 +5ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561 +c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8 +f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf6 +73cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77b +cef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1 +f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f8 +8cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894 +d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bda +f99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9 +a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faab +e0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3 +fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fb +bbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3 +e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaeb +fccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefc +d1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8 +f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3 +fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fd +e6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feec +f8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fa +fef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdff +f8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffe +fefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef +06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00e +a5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9 +f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf1 +20acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229 +aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3 +f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f3 +3bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343 +b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbc +f44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff4 +54bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55d +c3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6 +f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f6 +6ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677 +ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecf +f77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f7 +88d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88f +d5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8 +f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf9 +9fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7 +def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1 +faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fa +b7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbe +e7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5ea +fbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfc +cdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4 +effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2 +fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fd +e2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9 +f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9 +feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfe +f5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffa +fdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb +00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009 +a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7 +f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf1 +1caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123 +adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1 +f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f2 +35b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33e +b7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bb +f347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef4 +50bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459 +c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4 +f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f6 +69c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672 +caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acd +f77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f7 +82d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88b +d4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7 +f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f9 +9bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2 +dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadf +faabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fa +b2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbba +e5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8 +fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfc +c9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0 +eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0 +fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fd +def3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5 +f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8 +feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafe +f2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8 +fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfe +fffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03 +a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5 +f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f0 +16a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11f +acf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128af +f228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f2 +31b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33a +b6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8 +f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf4 +4bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453 +bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2 +f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f5 +65c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66d +c9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676cc +f676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff7 +7ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786 +d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5 +f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f8 +96d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99e +dbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6de +f9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1fa +aee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6 +e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6 +fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fb +c4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfccc +ecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3ef +fcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fd +daf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1 +f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6 +fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9fe +eff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4 +fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafd +fffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffff +acb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3 +f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f0 +11a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11a +aaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122ad +f123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f2 +2bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234 +b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7 +f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf3 +46baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44f +bdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1 +f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f5 +60c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668 +c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670ca +f670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf7 +79cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781 +d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3 +f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f8 +92d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99a +d9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dc +f9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffa +a9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1 +e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5 +fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fb +c1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8 +ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0ed +fcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fc +d7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fddd +f2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5 +fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7fe +ebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1 +fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fc +fef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfeff +fcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1 +ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f0 +0ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015 +a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eab +f11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef1 +27aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230 +b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5 +f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f3 +42b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449 +bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bf +f452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f5 +5bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564 +c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8 +f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf6 +75cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77d +cff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1 +f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f8 +8dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895 +d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddb +f99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9 +a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faad +e1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3 +fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fb +bde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3 +e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbec +fccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefc +d2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fdda +f1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4 +fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fd +e7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feee +f9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fb +fef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdff +f9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffe +ffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef +07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010 +a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9 +f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf1 +22adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22a +b0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3 +f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f3 +3cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345 +baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebd +f44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f4 +57c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55f +c3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6 +f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf6 +6fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778 +cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0 +f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f8 +89d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891 +d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9 +f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9 +a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8 +dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2 +fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fb +b8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0 +e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7ea +fcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfc +cfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6 +f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2 +fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fd +e3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feea +f7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9 +fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfe +f6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffc +fefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef +02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00a +a4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7 +f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf1 +1dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126 +aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1 +f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f2 +38b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341 +b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bb +f449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef4 +51bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55a +c1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5 +f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f6 +6bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674 +cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bce +f77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f7 +85d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88c +d4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7 +f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf9 +9cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4 +ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0 +faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fa +b4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbc +e6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8 +fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfc +caebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1 +eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1 +fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fd +e0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6 +f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8 +feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafe +f3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8 +fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefe +fffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06 +a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6 +f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f0 +18a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120 +acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229af +f22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f2 +32b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33b +b6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9 +f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf4 +4dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455 +c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3 +f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f5 +67c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66e +c9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677cc +f677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff7 +7fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888 +d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6 +f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f8 +98d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99f +dbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7de +f9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1fa +afe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7 +e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7 +fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafb +c6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcce +edfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4ef +fcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fd +dcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2 +f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7 +fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9fe +eff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5 +fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfe +fffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00 +a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3 +f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f0 +12a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11c +aaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125ae +f125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f2 +2eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237 +b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7 +f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf3 +48bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450 +bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1 +f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f5 +61c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66a +c8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cb +f673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf7 +7bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782 +d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4 +f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f8 +93d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99b +daf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3dd +f9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0fa +abe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3 +e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5 +fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fb +c3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9 +ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0ee +fcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fd +d8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddf +f3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6 +fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8fe +ecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2 +fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fc +fff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfeff +fdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2 +ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f0 +0ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017 +a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11fac +f120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff2 +28aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231 +b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6 +f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f3 +43b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44c +bcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bf +f454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f5 +5dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565 +c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9 +f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf6 +76ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77e +cff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2 +f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f8 +8fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897 +d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edb +f99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9 +a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faae +e1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4 +fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fb +bee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5 +eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdec +fccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effc +d4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fdda +f1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4 +fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fe +e8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feef +f9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fb +fef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdff +fafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffff +ffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f0 +08a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011 +a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaa +f11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf1 +23adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22c +b1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4 +f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f3 +3eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346 +baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbd +f450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f4 +58c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560 +c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7 +f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf6 +72caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77a +cdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0 +f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f8 +8ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892 +d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9 +f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9 +a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaa +dffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2 +fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fb +bae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1 +e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8eb +fcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfc +d0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7 +f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3 +fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fd +e5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feeb +f8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fa +fef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfe +f7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffc +fefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef +03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00d +a5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8 +f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf1 +1facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127 +aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2 +f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f3 +39b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342 +b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbc +f44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff4 +53bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55c +c2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5 +f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f6 +6cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675 +cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcf +f77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f7 +86d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88e +d5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8 +f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf9 +9edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5 +def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1 +faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fa +b5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbd +e6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9 +fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfc +ccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3 +effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1 +fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fd +e1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7 +f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9 +feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfe +f4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffa +fdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffff +ffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07 +a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6 +f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f1 +19a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122 +adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0 +f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f2 +34b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33d +b7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345ba +f346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf4 +4ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457 +c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3 +f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f6 +68c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670 +caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cd +f779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f7 +81d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889 +d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6 +f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f9 +99d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1 +dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9df +faa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fa +b1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9 +e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7 +fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafc +c7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccf +edfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0 +fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fd +ddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4 +f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7 +feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fe +f1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6 +fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfe +fffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02 +a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4 +f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f0 +15a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11e +abf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126ae +f127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f2 +2fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238 +b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8 +f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf4 +49bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452 +bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1 +f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f5 +64c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66b +c8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cb +f674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef7 +7ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785 +d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4 +f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f8 +95d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99d +dbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4dd +f9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0fa +ace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4 +e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6 +fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fb +c3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccb +ecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1ee +fcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fd +daf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0 +f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6 +fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8fe +edf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3 +fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fd +fff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefeff +fefffffeffffffffffffffffacb0ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2 +ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f0 +0fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118 +a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121ac +f121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f2 +2ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233 +b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6 +f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f3 +45baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44d +bdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0 +f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f5 +5ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567 +c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fca +f66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf6 +78cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780 +d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3 +f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f8 +90d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998 +d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dc +f9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffa +a8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0 +e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4 +fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fb +c0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6 +eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceed +fcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effc +d5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddc +f2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5 +fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7fe +eaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0 +f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fb +fef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfeff +fbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffff2e60ffffffbfe7fb00a0ef00a0ef01a0 +ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f0 +0aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014 +a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caa +f11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef1 +26aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22e +b1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4 +f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f3 +3fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448 +bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451be +f451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f5 +5ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561 +c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8 +f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf6 +73cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77b +cef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1 +f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f8 +8cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894 +d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bda +f99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9 +a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faab +e0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3 +fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fb +bbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3 +e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaeb +fccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefc +d1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8 +f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3 +fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fd +e6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feec +f8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fa +fef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdff +f8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffe +fefffefefffefefffefffffeffffffffffffffff2e60ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef +06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00e +a5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9 +f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf1 +20acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229 +aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3 +f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f3 +3bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343 +b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbc +f44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff4 +54bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55d +c3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6 +f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f6 +6ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677 +ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecf +f77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f7 +88d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88f +d5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8 +f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf9 +9fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7 +def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1 +faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fa +b7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbe +e7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5ea +fbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfc +cdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4 +effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2 +fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fd +e2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9 +f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9 +feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfe +f5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffa +fdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffff2e60ffffffbfe7fb +00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009 +a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7 +f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf1 +1caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123 +adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1 +f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f2 +35b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33e +b7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bb +f347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef4 +50bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459 +c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4 +f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f6 +69c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672 +caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acd +f77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f7 +82d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88b +d4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7 +f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f9 +9bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2 +dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadf +faabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fa +b2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbba +e5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8 +fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfc +c9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0 +eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0 +fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fd +def3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5 +f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8 +feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafe +f2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8 +fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfe +fffdfefffdfefffefefffefefffefefffefffffeffffffffffffffff2e60ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03 +a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5 +f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f0 +16a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11f +acf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128af +f228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f2 +31b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33a +b6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8 +f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf4 +4bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453 +bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2 +f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f5 +65c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66d +c9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676cc +f676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff7 +7ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786 +d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5 +f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f8 +96d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99e +dbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6de +f9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1fa +aee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6 +e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6 +fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fb +c4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfccc +ecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3ef +fcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fd +daf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1 +f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6 +fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9fe +eff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4 +fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafd +fffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffff +2e60ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3 +f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f0 +11a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11a +aaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122ad +f123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f2 +2bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234 +b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7 +f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf3 +46baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44f +bdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1 +f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f5 +60c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668 +c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670ca +f670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf7 +79cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781 +d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3 +f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f8 +92d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99a +d9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dc +f9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffa +a9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1 +e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5 +fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fb +c1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8 +ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0ed +fcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fc +d7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fddd +f2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5 +fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7fe +ebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1 +fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fc +fef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfeff +fcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffff2e60ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1 +ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f0 +0ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015 +a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eab +f11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef1 +27aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230 +b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5 +f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f3 +42b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449 +bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bf +f452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f5 +5bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564 +c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8 +f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf6 +75cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77d +cff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1 +f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f8 +8dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895 +d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddb +f99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9 +a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faad +e1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3 +fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fb +bde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3 +e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbec +fccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefc +d2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fdda +f1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4 +fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fd +e7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feee +f9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fb +fef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdff +f9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffe +ffffffffffffffff2e60ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef +07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010 +a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9 +f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf1 +22adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22a +b0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3 +f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f3 +3cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345 +baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebd +f44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f4 +57c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55f +c3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6 +f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf6 +6fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778 +cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0 +f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f8 +89d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891 +d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9 +f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9 +a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8 +dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2 +fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fb +b8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0 +e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7ea +fcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfc +cfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6 +f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2 +fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fd +e3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feea +f7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9 +fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfe +f6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffc +fefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffff2e60ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef +02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00a +a4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7 +f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf1 +1dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126 +aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1 +f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f2 +38b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341 +b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bb +f449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef4 +51bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55a +c1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5 +f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f6 +6bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674 +cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bce +f77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f7 +85d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88c +d4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7 +f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf9 +9cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4 +ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0 +faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fa +b4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbc +e6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8 +fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfc +caebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1 +eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1 +fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fd +e0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6 +f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8 +feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafe +f3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8 +fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefe +fffefefffefffffeffffffffffffffff2e60ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06 +a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6 +f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f0 +18a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120 +acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229af +f22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f2 +32b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33b +b6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9 +f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf4 +4dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455 +c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3 +f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f5 +67c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66e +c9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677cc +f677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff7 +7fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888 +d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6 +f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f8 +98d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99f +dbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7de +f9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1fa +afe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7 +e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7 +fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafb +c6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcce +edfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4ef +fcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fd +dcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2 +f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7 +fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9fe +eff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5 +fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfe +fffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffff2e60ffffffbfe7fb00a0ef00 +a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3 +f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f00ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f0 +12a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11c +aaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11facf120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125ae +f125aef126aef126aef126aef127aef127aef127aef128aff228aff228aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f2 +2eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237 +b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7 +f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f343b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf3 +48bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44cbcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450 +bef451bef451bef451bef452bff452bff452bff453bff453bff454bff454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1 +f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f55dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f5 +61c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66a +c8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cb +f673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf676ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf7 +7bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77ecff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782 +d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4 +f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f88fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f8 +93d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99b +daf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edbf99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3dd +f9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0fa +abe0faabe0faace0faace0faace0faade1faade1faade1faaee1faaee1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3 +e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5 +fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fbbee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fb +c3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9 +ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdecfccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0ee +fcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effcd4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fd +d8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddf +f3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6 +fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fee8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8fe +ecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2 +fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fc +fff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfeff +fdfefffefefffefefffefefffefffffeffffffffffffffff2e60ffffffbfe7fb00a0ef00a0ef01a0ef01a0ef02a1ef02a1ef02a1ef03a1ef03a1ef03a1ef05a2 +ef05a2ef06a2ef06a2ef06a2ef07a3ef07a3ef07a3ef08a3f008a3f008a3f009a3f009a3f00aa4f00aa4f00aa4f00ca4f00ca4f00ca4f00da5f00da5f00ea5f0 +0ea5f00ea5f00fa6f00fa6f00fa6f010a6f010a6f010a6f011a6f011a6f012a7f012a7f012a7f014a7f014a7f014a7f015a8f015a8f016a8f016a8f016a8f017 +a9f017a9f017a9f018a9f118a9f118a9f119a9f119a9f11aaaf11aaaf11aaaf11caaf11caaf11caaf11dabf11dabf11eabf11eabf11eabf11facf11facf11fac +f120acf120acf120acf121acf121acf122adf122adf122adf123adf123adf123adf125aef125aef126aef126aef126aef127aef127aef127aef128aff228aff2 +28aff229aff229aff22ab0f22ab0f22ab0f22bb0f22bb0f22bb0f22cb1f22cb1f22eb1f22eb1f22eb1f22fb1f22fb1f22fb1f230b2f230b2f230b2f231b2f231 +b2f232b3f232b3f232b3f233b3f233b3f233b3f234b3f234b3f235b4f235b4f235b4f237b4f237b4f237b4f238b5f238b5f238b5f239b5f339b5f33ab6f33ab6 +f33ab6f33bb6f33bb6f33bb6f33cb6f33cb6f33db7f33db7f33db7f33eb7f33eb7f33eb7f33fb8f33fb8f341b8f341b8f341b8f342b8f342b8f342b8f343b9f3 +43b9f343b9f344b9f344b9f345baf345baf345baf346baf346baf346baf347bbf347bbf348bbf448bbf448bbf449bbf449bbf449bbf44bbcf44bbcf44bbcf44c +bcf44cbcf44dbdf44dbdf44dbdf44ebdf44ebdf44ebdf44fbdf44fbdf450bef450bef450bef451bef451bef451bef452bff452bff452bff453bff453bff454bf +f454bff454bff455c0f455c0f455c0f457c0f457c0f458c1f458c1f458c1f459c1f559c1f559c1f55ac1f55ac1f55ac1f55bc2f55bc2f55cc2f55cc2f55cc2f5 +5dc3f55dc3f55dc3f55ec3f55ec3f55fc3f55fc3f55fc3f560c4f560c4f560c4f561c4f561c4f561c4f563c5f563c5f564c5f564c5f564c5f565c6f565c6f565 +c6f566c6f566c6f567c6f567c6f567c6f568c7f668c7f668c7f669c7f669c7f669c7f66ac8f66ac8f66bc8f66bc8f66bc8f66cc8f66cc8f66cc8f66dc9f66dc9 +f66ec9f66ec9f66ec9f66fcaf66fcaf66fcaf670caf670caf670caf672caf672caf673cbf673cbf673cbf674cbf674cbf674cbf675cbf675cbf676ccf676ccf6 +76ccf677ccf677ccf677ccf678cdf778cdf778cdf779cdf779cdf77acdf77acdf77acdf77bcef77bcef77bcef77ccef77ccef77dcff77dcff77dcff77ecff77e +cff77ecff77fcff77fcff780d0f780d0f780d0f781d0f781d0f781d0f782d1f782d1f782d1f783d1f783d1f785d1f785d1f785d1f786d2f786d2f786d2f787d2 +f787d2f788d3f888d3f888d3f889d3f889d3f889d3f88ad3f88ad3f88ad3f88bd4f88bd4f88cd4f88cd4f88cd4f88dd4f88dd4f88dd4f88ed5f88ed5f88fd5f8 +8fd5f88fd5f890d6f890d6f890d6f891d6f891d6f891d6f892d6f892d6f893d7f893d7f893d7f894d7f894d7f894d7f895d8f895d8f896d8f896d8f896d8f897 +d8f897d8f897d8f898d9f998d9f998d9f999d9f999d9f99ad9f99ad9f99ad9f99bdaf99bdaf99bdaf99cdaf99cdaf99ddbf99ddbf99ddbf99edbf99edbf99edb +f99fdbf99fdbf99fdbf9a0dcf9a0dcf9a1dcf9a1dcf9a1dcf9a2dcf9a2dcf9a2dcf9a3ddf9a3ddf9a4ddf9a4ddf9a4ddf9a5def9a5def9a5def9a6def9a6def9 +a6def9a7def9a7def9a8dffaa8dffaa8dffaa9dffaa9dffaa9dffaaadffaaadffaabe0faabe0faabe0faace0faace0faace0faade1faade1faade1faaee1faae +e1faafe1faafe1faafe1fab0e2fab0e2fab0e2fab1e2fab1e2fab2e2fab2e2fab2e2fab3e3fab3e3fab3e3fab4e3fab4e3fab5e3fab5e3fab5e3fab6e4fab6e4 +fab6e4fab7e4fab7e4fab7e4fab8e5fbb8e5fbb9e5fbb9e5fbb9e5fbbae5fbbae5fbbae5fbbbe6fbbbe6fbbce6fbbce6fbbce6fbbde6fbbde6fbbde6fbbee7fb +bee7fbbee7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc4e9fbc4e9fbc4e9fbc5 +eafbc5eafbc6eafbc6eafbc6eafbc7eafcc7eafcc7eafcc8ebfcc8ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccbecfccbecfccbecfcccecfcccecfccdec +fccdecfccdecfcceedfcceedfcceedfccfedfccfedfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1eefcd2eefcd2eefcd3effcd3effcd3effc +d4effcd4effcd4effcd5effcd5effcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd8f0fdd8f0fdd8f0fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fdda +f1fddbf2fddbf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fddef3fddef3fddef3fddff3fddff3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4 +fde2f4fde2f4fde2f4fde3f5fde3f5fde3f5fde4f5fde4f5fde5f5fde5f5fde5f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fee7f6fee8f6fee8f6fe +e8f6fee9f7fee9f7fee9f7feeaf7feeaf7feebf7feebf7feebf7feebf8feebf8feebf8feecf8feecf8feecf8feedf8feedf8feeef9feeef9feeef9feeff9feef +f9feeff9feeff9feeff9fef0f9fef0f9fef0f9fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef5fb +fef5fbfef5fbfef5fbfef5fbfef6fcfef6fcfef6fcfef7fcfef7fcfef7fcfef8fcfff8fcfff8fdfff8fdfff8fdfff9fdfff9fdfff9fdfffafdfffafdfffafdff +fafdfffafdfffbfefffbfefffbfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffefefffefefffefefffefffffeffffffffffffffff2e60ffff +ffeff9febfe7fbbfe7fbbfe7fbbfe7fbc0e7fbc0e7fbc0e7fbc0e7fbc0e7fbc0e7fbc0e8fbc0e8fbc1e8fbc1e8fbc1e8fbc1e8fbc1e8fbc1e8fbc1e8fbc1e8fb +c1e8fbc1e8fbc1e8fbc2e8fbc2e8fbc2e8fbc2e8fbc2e8fbc2e8fbc2e8fbc2e8fbc3e8fbc3e8fbc3e8fbc3e9fbc3e9fbc3e9fbc3e9fbc3e9fbc3e9fbc3e9fbc3 +e9fbc4e9fbc4e9fbc4e9fbc4e9fbc4e9fbc4e9fbc4e9fbc4e9fbc5e9fbc5e9fbc5e9fbc5e9fbc5e9fbc5e9fbc5e9fbc5e9fbc5e9fbc5e9fbc5e9fbc6eafbc6ea +fbc6eafbc6eafbc6eafbc6eafbc6eafbc6eafbc7eafbc7eafbc7eafbc7eafbc7eafbc7eafbc7eafbc7eafbc7eafbc7eafbc7eafbc8eafbc8eafbc8eafbc8eafb +c8eafbc8eafbc8ebfbc8ebfbc9ebfbc9ebfbc9ebfbc9ebfbc9ebfbc9ebfbc9ebfcc9ebfcc9ebfcc9ebfcc9ebfccaebfccaebfccaebfccaebfccaebfccaebfcca +ebfccaebfccbebfccbebfccbebfccbebfccbebfccbebfccbecfccbecfccbecfccbecfccbecfcccecfcccecfcccecfcccecfcccecfcccecfcccecfcccecfcccec +fcccecfcccecfccdecfccdecfccdecfccdecfccdecfccdecfccdecfccdecfcceedfcceedfcceedfcceedfcceedfcceedfcceedfcceedfcceedfcceedfcceedfc +cfedfccfedfccfedfccfedfccfedfccfedfccfedfccfedfcd0edfcd0edfcd0edfcd0edfcd0edfcd0edfcd0edfcd0edfcd0eefcd0eefcd0eefcd1eefcd1eefcd1 +eefcd1eefcd1eefcd1eefcd1eefcd1eefcd1eefcd1eefcd1eefcd2eefcd2eefcd2eefcd2eefcd2eefcd2eefcd2eefcd2eefcd3eefcd3eefcd3eefcd3eefcd3ee +fcd3effcd3effcd3effcd3effcd3effcd3effcd4effcd4effcd4effcd4effcd4effcd4effcd4effcd4effcd4effcd4effcd4effcd5effcd5effcd5effcd5effc +d5effcd5effcd5effcd5effcd6effcd6effcd6effcd6f0fcd6f0fcd6f0fcd6f0fcd6f0fcd6f0fcd6f0fcd6f0fcd7f0fcd7f0fcd7f0fcd7f0fcd7f0fcd7f0fcd7 +f0fcd7f0fcd7f0fcd7f0fcd7f0fcd8f0fcd8f0fcd8f0fcd8f0fcd8f0fcd8f1fcd8f1fcd8f1fcd9f1fcd9f1fcd9f1fcd9f1fcd9f1fcd9f1fdd9f1fdd9f1fdd9f1 +fdd9f1fdd9f1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddaf1fddbf1fddbf1fddbf1fddbf2fddbf2fddbf2fddbf2fddbf2fddbf2fd +dcf2fddcf2fddcf2fddcf2fddcf2fddcf2fddcf2fddcf2fddcf2fddcf2fdddf2fdddf2fdddf2fdddf2fdddf2fdddf2fdddf2fdddf2fdddf2fdddf2fdddf2fdde +f2fddef2fddef2fddef3fddef3fddef3fddef3fddef3fddef3fddef3fddef3fddff3fddff3fddff3fddff3fddff3fddff3fddff3fddff3fddff3fddff3fddff3 +fde0f3fde0f3fde0f3fde0f3fde0f3fde0f3fde0f3fde0f3fde1f4fde1f4fde1f4fde1f4fde1f4fde1f4fde1f4fde1f4fde1f4fde1f4fde1f4fde2f4fde2f4fd +e2f4fde2f4fde2f4fde2f4fde2f4fde2f4fde2f4fde2f4fde2f4fde3f4fde3f4fde3f4fde3f4fde3f4fde3f5fde3f5fde3f5fde3f5fde3f5fde3f5fde4f5fde4 +f5fde4f5fde4f5fde4f5fde4f5fde4f5fde4f5fde4f5fde4f5fde5f5fde5f5fde5f5fde5f5fde5f5fde5f5fde5f5fde5f5fde5f5fde5f5fde5f5fde6f5fde6f5 +fde6f5fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde6f6fde7f6fde7f6fde7f6fde7f6fde7f6fde7f6fde7f6fde7f6fde7f6fde7f6fde7f6fde8f6fd +e8f6fde8f6fde8f6fde8f6fde8f6fde8f6fde8f6fde8f7fde8f7fde8f7fde9f7fde9f7fde9f7fde9f7fde9f7fde9f7fee9f7fee9f7fee9f7fee9f7fee9f7feea +f7feeaf7feeaf7feeaf7feeaf7feeaf7feeaf7feeaf7feeaf7feeaf7feeaf7feebf7feebf7feebf7feebf7feebf7feebf8feebf8feebf8feebf8feebf8feecf8 +feecf8feecf8feecf8feecf8feecf8feecf8feecf8feecf8feecf8feecf8feedf8feedf8feedf8feedf8feedf8feedf8feedf8feedf8feedf8feedf8feedf8fe +eef8feeef8feeef8feeef9feeef9feeef9feeef9feeef9feeef9feeef9feeef9feeff9feeff9feeff9feeff9feeff9feeff9feeff9feeff9feeff9feeff9feef +f9fef0f9fef0f9fef0f9fef0f9fef0f9fef0f9fef0f9fef0f9fef0f9fef0f9fef0f9fef0fafef0fafef1fafef1fafef1fafef1fafef1fafef1fafef1fafef1fa +fef1fafef1fafef1fafef2fafef2fafef2fafef2fafef2fafef2fafef2fafef2fafef2fafef2fafef2fafef3fafef3fafef3fafef3fafef3fafef3fafef3fafe +f3fafef3fbfef3fbfef3fbfef3fbfef3fbfef3fbfef4fbfef4fbfef4fbfef4fbfef4fbfef4fbfef4fbfef4fbfef4fbfef4fbfef5fbfef5fbfef5fbfef5fbfef5 +fbfef5fbfef5fbfef5fbfef5fbfef5fbfef5fbfef6fbfef6fbfef6fbfef6fbfef6fbfef6fbfef6fcfef6fcfef6fcfef6fcfef6fcfef6fcfef6fcfef6fcfef7fc +fef7fcfef7fcfef7fcfef7fcfef7fcfef7fcfef7fcfef7fcfef7fcfef7fcfef7fcfef7fcfef8fcfef8fcfef8fcfef8fcfef8fcfef8fcfef8fcfef8fcfef8fcfe +f8fcfef8fcfef9fdfef9fdfef9fdfef9fdfef9fdfef9fdfef9fdfff9fdfff9fdfff9fdfff9fdfff9fdfff9fdfff9fdfffafdfffafdfffafdfffafdfffafdfffa +fdfffafdfffafdfffafdfffafdfffafdfffafdfffafdfffbfdfffbfdfffbfdfffbfdfffbfdfffbfdfffbfdfffbfdfffbfdfffbfdfffbfdfffbfefffbfefffbfe +fffcfefffcfefffcfefffcfefffcfefffcfefffcfefffcfefffcfefffcfefffcfefffcfefffcfefffcfefffcfefffcfefffdfefffdfefffdfefffdfefffdfeff +fdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffdfefffefefffefefffefefffefefffefefffefffffefffffefffffefffffefffffefffffefffffe +fffffefffffefffffeffffffffffffffffffffffffffffffffffffffffffffff2e60ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff2e60040000000601020008000000fa0205000000000000000000040000002d01030004000000f001000007000000fc020000efa00000000004000000 +2d01000004000000f00101000d0000003805010004008200e10182000f02a300f7018200e10108000000fa0205000000000000000000040000002d0101000400 +0000f001030007000000fc020100000000000000040000002d01030004000000f00100000c000000250304008200e10182000f02a300f7018200e10104000000 +0601010007000000fc020000efa000000000040000002d01000004000000f00103000f000000380501000500f20017077603170776034b09f2004b09f2001707 +07000000fc020100000000000000040000002d01030004000000f001000008000000fa02000008000800efa00000040000002d01000004000000f00101009700 +00003805010049000909ff080909ff080809060907090e090609140903091b0900092109fc082709f8082d09f4083209ef083709e9083b09e3083e09dd084109 +d6084409cf084609c8084709c1084709410447094104470939044709320446092b044409250441091f043e0919043b09130437090e04320909042d0905042709 +02042109fe031b09fc031409fa030e09f9030609f903ff08f903d702f903d702f903d002fa03c802fc03c202fe03bb020204b5020504af020904a9020e04a402 +13049f0219049b021f049802250495022b0492023204900239048f0241048f02c1088f02c1088f02c8088f02cf089002d6089202dd089502e3089802e9089b02 +ef089f02f408a402f808a902fc08af020009b5020309bb020609c2020709c8020809d0020909d7020909ff08040000000601020007000000fc02000000000000 +0000040000002d01010004000000f001030008000000fa0205000000000000000000040000002d01030004000000f00100003f000000380501001d00c2058a0b +be058a0bbc05800bbc05800bbb057a0bbb057a0bbb057a0bba05800bb7058a0bb4058a0baf05760bb205760bb405800bb405800bb505870bb605870bb605870b +b705810bb905760bbc05760bbf05810bbf05810bc005870bc005870bc005870bc105800bc305760bc605760bc2058a0b04000000060102003f00000038050100 +1d00e0058a0bdc058a0bda05800bda05800bd9057a0bd9057a0bd9057a0bd705800bd5058a0bd2058a0bcd05760bd005760bd205800bd205800bd305870bd305 +870bd305870bd505810bd705760bda05760bdd05810bdd05810bde05870bde05870bde05870bdf05800be105760be405760be0058a0b04000000060102003f00 +0000380501001d00fd058a0bfa058a0bf805800bf805800bf7057a0bf6057a0bf6057a0bf505800bf3058a0bf0058a0beb05760bee05760bf005800bf005800b +f105870bf105870bf105870bf305810bf505760bf805760bfb05810bfb05810bfc05870bfc05870bfc05870bfd05800bff05760b0206760bfd058a0b04000000 +0601020021000000380501000e000d06880b0d06880b0c068a0b0b068b0b0b068b0b09068a0b0806880b0806880b0906870b0b06860b0b06860b0c06870b0d06 +880b0d06880b0400000006010200170000003805010009002206780b1c06780b1c068a0b1a068a0b1a06780b1406780b1406760b2206760b2206780b04000000 +0601020060000000380502001d00100034068a0b34068a0b3306870b3306870b2f06820b2f06820b2d06810b2d068a0b2a068a0b2a06760b3006760b3006760b +3306760b3506770b3506770b3606790b37067b0b37067b0b36067e0b35067f0b3306810b3106810b3106810b3306830b3306830b3506850b3506850b38068a0b +34068a0b3206780b3206780b2f06780b2d06780b2d067f0b2f067f0b2f067f0b31067f0b33067e0b33067e0b33067d0b34067b0b34067b0b3306790b3206780b +3206780b040000000601020041000000380501001e004d06880b4d06880b4b068a0b47068b0b47068b0b43068a0b4106880b4106880b4006840b4006760b4306 +760b4306830b4306830b4306850b4406870b4406870b4506880b4706880b4706880b4906880b4b06870b4b06870b4b06830b4b06760b4e06760b4e06840b4e06 +840b4e06870b4d06880b4d06880b04000000060102001f000000380501000d0059068a0b5906760b6406760b6306780b5c06780b5c067e0b62067e0b6206810b +5c06810b5c06880b6406880b64068a0b59068a0b04000000060102005700000038050100290074068b0b74068b0b71068a0b6e06870b6e06870b6c06840b6c06 +800b6c06800b6c067d0b6d067a0b6d067a0b6e06780b7006760b7206760b7506750b7506750b7706760b7a06770b7806790b7806790b7606780b7506780b7506 +780b7206780b70067a0b70067a0b6f067d0b6f06800b6f06800b7006850b7006850b7206870b7506880b7506880b7706880b7906870b7a06890b7a06890b7706 +8a0b74068b0b74068b0b04000000060102000f00000038050100050085068a0b8506760b8206760b82068a0b85068a0b04000000060102006000000038050200 +1d0010009a068a0b9a068a0b9906870b9906870b9506820b9506820b9306810b93068a0b90068a0b9006760b9606760b9606760b9906760b9b06770b9b06770b +9c06790b9d067b0b9d067b0b9d067e0b9c067f0b9a06810b9706810b9706810b9906830b9906830b9b06850b9b06850b9e068a0b9a068a0b9806780b9806780b +9606780b9306780b93067f0b95067f0b95067f0b98067f0b99067e0b99067e0b9a067d0b9a067b0b9a067b0b9906790b9806780b9806780b0400000006010200 +57000000380501002900ae068b0bae068b0bab068a0ba806870ba806870ba606840ba606800ba606800ba6067d0ba7067a0ba7067a0ba806780baa06760bac06 +760bae06750bae06750bb106760bb306770bb206790bb206790bb006780bae06780bae06780bac06780baa067a0baa067a0ba9067d0ba906800ba906800ba906 +850ba906850bac06870baf06880baf06880bb106880bb206870bb406890bb406890bb1068a0bae068b0bae068b0b040000000601020041000000380501001e00 +c906880bc906880bc7068a0bc3068b0bc3068b0bbf068a0bbd06880bbd06880bbc06840bbc06760bbf06760bbf06830bbf06830bbf06850bc006870bc006870b +c106880bc306880bc306880bc506880bc606870bc606870bc706830bc706760bca06760bca06840bca06840bca06870bc906880bc906880b0400000006010200 +0f000000380501000500d5068a0bd506760bd806760bd8068a0bd5068a0b040000000601020017000000380501000900ee06780be806780be8068a0be5068a0b +e506780be006780be006760bee06760bee06780b040000000601020067000000380501003100fb068b0bfb068b0bf7068a0bf406890bf506870bf506870bf806 +880bfb06880bfb06880bfe06870bff06860bff06850bff06850bfe06830bfc06810bfa06810bfa06810bf6067f0bf5067d0bf5067b0bf5067b0bf506790bf706 +770bf906760bfc06750bfc06750bff06760b0207770b0107790b0107790bfe06780bfc06780bfc06780bf906780bf8067b0bf8067b0bf9067d0bfb067e0bfe06 +7e0bfe067e0b0107800b0207820b0307840b0307840b0207860b0107890bfe068a0bfb068b0bfb068b0b040000000601020021000000380501000e000d07860b +0d07860b0c07870b0b07880b0b07880b0c078a0b0d078b0b0d078b0b0f078a0b0f07880b0f07880b0f07870b0d07860b0d07860b040000000601020057000000 +3805010029002607890b2407870b2407870b2307880b2007880b2007880b1d07870b1b07850b1b07850b1b07800b1b07800b1b077d0b1c077a0b1c077a0b1d07 +780b2007780b2007780b2207780b2407790b2507770b2507770b2307760b2007750b2007750b1e07760b1c07760b1a07780b19077a0b19077a0b18077d0b1707 +800b1707800b1807840b1a07870b1a07870b1c078a0b20078b0b20078b0b23078a0b2607890b2607890b04000000060102005e00000038050200160016003507 +8b0b35078b0b31078a0b2f07880b2d07840b2c07800b2c07800b2d077b0b2f07780b3107760b3507750b3507750b3907760b3b07780b3d077c0b3d07800b3d07 +800b3d07840b3b07880b38078a0b35078b0b35078b0b3507770b3507770b3207780b31077a0b30077c0b3007800b3007800b3007830b3107860b3207880b3507 +880b3507880b3707880b3907870b3a07840b3a07800b3a07800b3a077d0b39077a0b3707780b3507770b3507770b04000000060102003f000000380501001d00 +57078a0b56077c0b56077c0b5607790b5607790b5607790b55077c0b51078a0b4f078a0b4b077d0b4b077d0b4a07790b4a07790b4a07790b4a077d0b49078a0b +46078a0b4807760b4c07760b4f07820b4f07820b5007860b5007860b5007860b5107820b5507760b5907760b5a078a0b57078a0b04000000060102000f000000 +38050100050065078f0b63078f0b6b07730b6d07730b65078f0b04000000060102004c00000038050200130010008107810b8107810b8007820b7d07820b7a07 +820b7a078a0b77078a0b7707760b7c07760b7c07760b7f07760b8107770b8107770b8307790b84077c0b84077c0b83077f0b8107810b8107810b8007790b8007 +790b7e07780b7c07780b7a07780b7a07800b7d07800b7d07800b7f07800b80077f0b80077f0b81077c0b81077c0b80077a0b8007790b8007790b040000000601 +020060000000380502001d00100096078a0b96078a0b9407870b9407870b9107820b9107820b8f07810b8f078a0b8c078a0b8c07760b9207760b9207760b9507 +760b9707770b9707770b9807790b99077b0b99077b0b98077e0b97077f0b9507810b9307810b9307810b9507830b9507830b9707850b9707850b9a078a0b9607 +8a0b9407780b9407780b9107780b8f07780b8f077f0b91077f0b91077f0b93077f0b95077e0b95077e0b95077d0b96077b0b96077b0b9507790b9407780b9407 +780b04000000060102005e0000003805020016001600aa078b0baa078b0ba6078a0ba307880ba207840ba107800ba107800ba2077b0ba307780ba607760ba907 +750ba907750bad07760bb007780bb1077c0bb207800bb207800bb107840bb007880bad078a0baa078b0baa078b0ba907770ba907770ba707780ba5077a0ba507 +7c0ba407800ba407800ba507830ba507860ba707880baa07880baa07880bac07880bad07870bae07840baf07800baf07800bae077d0bad077a0bac07780ba907 +770ba907770b04000000060102004a0000003805020011001100c707870bc707870bc5078a0bc1078a0bbb078a0bbb07760bc007760bc007760bc507760bc807 +790bc807790bc9077c0bca07800bca07800bc907840bc707870bc707870bc5077a0bc5077a0bc307780bc107780bbe07780bbe07880bc107880bc107880bc407 +870bc507860bc507860bc607830bc707800bc707800bc6077d0bc5077a0bc5077a0b040000000601020041000000380501001e00e007880be007880bde078a0b +da078b0bda078b0bd6078a0bd407880bd407880bd307840bd307760bd607760bd607830bd607830bd607850bd707870bd707870bd807880bda07880bda07880b +dc07880bde07870bde07870bde07830bde07760be107760be107840be107840be107870be007880be007880b040000000601020057000000380501002900f307 +8b0bf3078b0bef078a0bed07870bed07870beb07840bea07800bea07800beb077d0bec077a0bec077a0bed07780bef07760bf107760bf307750bf307750bf607 +760bf807770bf707790bf707790bf507780bf307780bf307780bf107780bef077a0bef077a0bee077d0bee07800bee07800bee07850bee07850bf007870bf307 +880bf307880bf607880bf707870bf907890bf907890bf6078a0bf3078b0bf3078b0b0400000006010200170000003805010009000d08760bff07760bff07780b +0408780b04088a0b07088a0b0708780b0d08780b0d08760b04000000060102000f00000038050100050012088e0b12088d0b21088d0b21088e0b12088e0b0400 +0000060102003f000000380501001d003a088a0b39087c0b39087c0b3908790b3808790b3808790b38087c0b34088a0b31088a0b2d087d0b2d087d0b2c08790b +2c08790b2c08790b2c087d0b2b088a0b28088a0b2a08760b2e08760b3208820b3208820b3208860b3208860b3208860b3308820b3708760b3b08760b3d088a0b +3a088a0b040000000601020028000000380502000900080052088a0b5008840b4908840b47088a0b44088a0b4a08760b4e08760b55088a0b52088a0b4c08780b +4c08780b4c08780b4908820b4f08820b4f08820b4c08780b4c08780b0400000006010200170000003805010009006708780b6108780b61088a0b5f088a0b5f08 +780b5908780b5908760b6708760b6708780b040000000601020060000000380502001d00100079088a0b79088a0b7808870b7808870b7408820b7408820b7208 +810b72088a0b6f088a0b6f08760b7508760b7508760b7808760b7a08770b7a08770b7b08790b7c087b0b7c087b0b7b087e0b7a087f0b7908810b7608810b7608 +810b7808830b7808830b7a08850b7a08850b7d088a0b79088a0b7708780b7708780b7408780b7208780b72087f0b74087f0b74087f0b76087f0b78087e0b7808 +7e0b78087d0b79087b0b79087b0b7808790b7708780b7708780b04000000060102000f00000038050100050086088a0b8608760b8908760b89088a0b86088a0b +04000000060102001f000000380501000d009d088a0b9908810b94088a0b91088a0b97087f0b9108760b9508760b99087d0b9c08760ba008760b9a087f0ba108 +8a0b9d088a0b040000000601020021000000380501000e00aa08860baa08860ba808870ba808880ba808880ba8088a0baa088b0baa088b0bab088a0bac08880b +ac08880bab08870baa08860baa08860b04000000060102001f000000380501000d00c0088a0bc008800bb808800bb8088a0bb6088a0bb608760bb808760bb808 +7e0bc0087e0bc008760bc308760bc3088a0bc0088a0b040000000601020017000000380501000900d908780bd408780bd4088a0bd1088a0bd108780bcc08780b +cc08760bd908760bd908780b04000000060102003f000000380501001d00f2088a0bf1087c0bf1087c0bf008790bf008790bf008790bf0087c0bec088a0be908 +8a0be5087d0be5087d0be408790be408790be408790be4087d0be3088a0be0088a0be208760be608760bea08820bea08820bea08860bea08860bea08860beb08 +820bef08760bf308760bf5088a0bf2088a0b0400000006010200130000003805010007000909880b0109880b0109760bfe08760bfe088a0b09098a0b0909880b +0400000006010200170000003805010009009000780b8b00780b8b008a0b88008a0b8800780b8300780b8300760b9000760b9000780b04000000060102006000 +0000380502001d001000a3008a0ba3008a0ba100870ba100870b9d00820b9d00820b9b00810b9b008a0b99008a0b9900760b9e00760b9e00760ba100760ba300 +770ba300770ba500790ba5007b0ba5007b0ba5007e0ba4007f0ba200810ba000810ba000810ba100830ba100830ba300850ba300850ba6008a0ba3008a0ba000 +780ba000780b9e00780b9b00780b9b007f0b9d007f0b9d007f0ba0007f0ba1007e0ba1007e0ba2007d0ba2007b0ba2007b0ba200790ba000780ba000780b0400 +00000601020041000000380501001e00bc00880bbc00880bb9008a0bb6008b0bb6008b0bb2008a0baf00880baf00880baf00840baf00760bb200760bb200830b +b200830bb200850bb200870bb200870bb400880bb600880bb600880bb800880bb900870bb900870bba00830bba00760bbd00760bbd00840bbd00840bbd00870b +bc00880bbc00880b04000000060102001f000000380501000d00c7008a0bc700760bd200760bd200780bca00780bca007e0bd1007e0bd100810bca00810bca00 +880bd300880bd3008a0bc7008a0b040000000601020057000000380501002900ef008b0bef008b0beb008a0be800870be800870be600840be600800be600800b +e6007d0be7007a0be7007a0be900780bea00760bec00760bef00750bef00750bf100760bf400770bf200790bf200790bf100780bef00780bef00780bec00780b +ea007a0bea007a0be9007d0be900800be900800bea00850bea00850bec00870bef00880bef00880bf100880bf300870bf400890bf400890bf1008a0bef008b0b +ef008b0b04000000060102000f000000380501000500fd008a0bfd00760bff00760bff008a0bfd008a0b040000000601020060000000380502001d0010001501 +8a0b15018a0b1301870b1301870b0f01820b0f01820b0d01810b0d018a0b0b018a0b0b01760b1001760b1001760b1301760b1501770b1501770b1601790b1701 +7b0b17017b0b17017e0b16017f0b1401810b1201810b1201810b1301830b1301830b1501850b1501850b18018a0b15018a0b1201780b1201780b1001780b0d01 +780b0d017f0b0f017f0b0f017f0b12017f0b13017e0b13017e0b14017d0b14017b0b14017b0b1401790b1201780b1201780b0400000006010200570000003805 +0100290028018b0b28018b0b25018a0b2201870b2201870b2001840b2001800b2001800b20017d0b21017a0b21017a0b2201780b2401760b2601760b2801750b +2801750b2b01760b2d01770b2c01790b2c01790b2a01780b2801780b2801780b2601780b24017a0b24017a0b23017d0b2301800b2301800b2401850b2401850b +2601870b2901880b2901880b2b01880b2c01870b2e01890b2e01890b2b018a0b28018b0b28018b0b040000000601020041000000380501001e004301880b4301 +880b41018a0b3d018b0b3d018b0b39018a0b3701880b3701880b3601840b3601760b3901760b3901830b3901830b3901850b3a01870b3a01870b3b01880b3d01 +880b3d01880b3f01880b4001870b4001870b4101830b4101760b4401760b4401840b4401840b4401870b4301880b4301880b04000000060102000f0000003805 +010005004f018a0b4f01760b5201760b52018a0b4f018a0b0400000006010200170000003805010009006801780b6201780b62018a0b60018a0b6001780b5a01 +780b5a01760b6801760b6801780b04000000060102006700000038050100310075018b0b75018b0b71018a0b6e01890b6f01870b6f01870b7201880b7501880b +7501880b7801870b7901860b7901850b7901850b7901830b7601810b7401810b7401810b70017f0b6f017d0b6f017b0b6f017b0b6f01790b7101770b7301760b +7601750b7601750b7901760b7c01770b7b01790b7b01790b7801780b7601780b7601780b7301780b72017b0b72017b0b73017d0b75017e0b78017e0b78017e0b +7b01800b7c01820b7d01840b7d01840b7c01860b7b01890b78018a0b75018b0b75018b0b04000000060102002d00000038050100140086018f0b85018d0b8501 +8d0b86018c0b87018b0b87018b0b86018a0b86018a0b85018a0b8501880b8501880b8501870b8701860b8701860b8901870b8901890b8901890b88018c0b8601 +8f0b86018f0b04000000060102000f0000003805010005009f018a0b9f01760ba101760ba1018a0b9f018a0b04000000060102002f000000380501001500b701 +8a0bb2017f0bb2017f0baf017a0baf017a0baf017a0baf017f0baf018a0bad018a0bad01760bb001760bb601810bb601810bb801860bb801860bb801860bb801 +800bb801760bba01760bba018a0bb7018a0b040000000601020057000000380501002900cc018b0bcc018b0bc8018a0bc601870bc601870bc401840bc301800b +c301800bc4017d0bc5017a0bc5017a0bc601780bc801760bca01760bcc01750bcc01750bcf01760bd101770bd001790bd001790bce01780bcc01780bcc01780b +c901780bc8017a0bc8017a0bc7017d0bc701800bc701800bc701850bc701850bc901870bcc01880bcc01880bce01880bd001870bd201890bd201890bcf018a0b +cc018b0bcc018b0b040000000601020021000000380501000e00dd01880bdd01880bdd018a0bdb018b0bdb018b0bda018a0bd901880bd901880bda01870bdb01 +860bdb01860bdd01870bdd01880bdd01880b040000000601020057000000380501002900fa018b0bfa018b0bf6018a0bf401870bf401870bf201840bf101800b +f101800bf2017d0bf3017a0bf3017a0bf401780bf601760bf801760bfa01750bfa01750bfd01760bff01770bfe01790bfe01790bfc01780bfa01780bfa01780b +f701780bf6017a0bf6017a0bf5017d0bf501800bf501800bf501850bf501850bf701870bfa01880bfa01880bfd01880bfe01870b0002890b0002890bfd018a0b +fa018b0bfa018b0b04000000060102005e00000038050200160016000f028b0b0f028b0b0b028a0b0902880b0702840b0602800b0602800b07027b0b0902780b +0b02760b0f02750b0f02750b1302760b1502780b17027c0b1702800b1702800b1702840b1502880b12028a0b0f028b0b0f028b0b0f02770b0f02770b0c02780b +0b027a0b0a027c0b0a02800b0a02800b0a02830b0b02860b0c02880b0f02880b0f02880b1102880b1302870b1402840b1402800b1402800b14027d0b13027a0b +1102780b0f02770b0f02770b04000000060102002f0000003805010015002b028a0b26027f0b26027f0b23027a0b23027a0b23027a0b23027f0b23028a0b2102 +8a0b2102760b2402760b2a02810b2a02810b2c02860b2c02860b2c02860b2c02800b2c02760b2e02760b2e028a0b2b028a0b04000000060102001b0000003805 +01000b004402780b3c02780b3c027e0b42027e0b4202810b3c02810b3c028a0b39028a0b3902760b4402760b4402780b04000000060102000f00000038050100 +05004c028a0b4c02760b4f02760b4f028a0b4c028a0b04000000060102004c00000038050200120011006602870b6602870b64028a0b5f028a0b5a028a0b5a02 +760b5f02760b5f02760b6302760b6502770b6702790b6702790b68027c0b6902800b6902800b6802840b6602870b6602870b64027a0b64027a0b6202780b5f02 +780b5d02780b5d02880b5f02880b5f02880b6202870b6402860b6402860b6502830b6502800b6502800b65027d0b64027a0b64027a0b04000000060102001f00 +0000380501000d0072028a0b7202760b7d02760b7d02780b7502780b75027e0b7c027e0b7c02810b7502810b7502880b7e02880b7e028a0b72028a0b04000000 +060102002f00000038050100150092028a0b8c027f0b8c027f0b8a027a0b8a027a0b8a027a0b8a027f0b8a028a0b87028a0b8702760b8a02760b9002810b9002 +810b9202860b9202860b9202860b9202800b9202760b9502760b95028a0b92028a0b040000000601020017000000380501000900ab02780ba502780ba5028a0b +a2028a0ba202780b9d02780b9d02760bab02760bab02780b04000000060102000f000000380501000500b3028a0bb302760bb602760bb6028a0bb3028a0b0400 +000006010200280000003805020009000800cc028a0bca02840bc302840bc1028a0bbe028a0bc502760bc802760bcf028a0bcc028a0bc602780bc602780bc602 +780bc302820bc902820bc902820bc602780bc602780b040000000601020013000000380501000700e1028a0bd7028a0bd702760bd902760bd902880be102880b +e1028a0b04000000060102000f000000380501000500f5028a0bf502760bf802760bf8028a0bf5028a0b04000000060102002f0000003805010015000d038a0b +08037f0b08037f0b05037a0b05037a0b05037a0b05037f0b05038a0b03038a0b0303760b0603760b0c03810b0c03810b0e03860b0e03860b0e03860b0e03800b +0e03760b1003760b10038a0b0d038a0b04000000060102001b000000380501000b002603780b1e03780b1e037e0b24037e0b2403810b1e03810b1e038a0b1b03 +8a0b1b03760b2603760b2603780b04000000060102005e000000380502001600160035038b0b35038b0b31038a0b2f03880b2d03840b2d03800b2d03800b2d03 +7b0b2f03780b3203760b3503750b3503750b3903760b3c03780b3d037c0b3e03800b3e03800b3d03840b3b03880b39038a0b35038b0b35038b0b3503770b3503 +770b3303780b31037a0b30037c0b3003800b3003800b3003830b3103860b3303880b3503880b3503880b3703880b3903870b3a03840b3a03800b3a03800b3a03 +7d0b39037a0b3803780b3503770b3503770b040000000601020060000000380502001d00100051038a0b51038a0b4f03870b4f03870b4c03820b4c03820b4a03 +810b4a038a0b47038a0b4703760b4d03760b4d03760b5003760b5203770b5203770b5303790b54037b0b54037b0b53037e0b52037f0b5003810b4e03810b4e03 +810b5003830b5003830b5203850b5203850b55038a0b51038a0b4f03780b4f03780b4c03780b4a03780b4a037f0b4c037f0b4c037f0b4e037f0b50037e0b5003 +7e0b50037d0b51037b0b51037b0b5003790b4f03780b4f03780b04000000060102003f000000380501001d006e038a0b6d037c0b6d037c0b6d03790b6d03790b +6d03790b6c037c0b68038a0b66038a0b62037d0b62037d0b6103790b6103790b6103790b61037d0b60038a0b5d038a0b5f03760b6303760b6603820b6603820b +6703860b6703860b6703860b6803820b6b03760b6f03760b71038a0b6e038a0b040000000601020028000000380502000900080086038a0b8403840b7d03840b +7b038a0b78038a0b7f03760b8303760b89038a0b86038a0b8103780b8103780b8103780b7e03820b8303820b8303820b8103780b8103780b0400000006010200 +170000003805010009009b03780b9603780b96038a0b93038a0b9303780b8e03780b8e03760b9c03760b9b03780b04000000060102000f000000380501000500 +a7038a0ba703760ba403760ba4038a0ba7038a0b04000000060102005e0000003805020016001600b9038b0bb9038b0bb5038a0bb203880bb103840bb003800b +b003800bb1037b0bb203780bb503760bb803750bb803750bbc03760bbf03780bc0037c0bc103800bc103800bc003840bbf03880bbc038a0bb9038b0bb9038b0b +b803770bb803770bb603780bb4037a0bb4037c0bb303800bb303800bb403830bb403860bb603880bb903880bb903880bbb03880bbc03870bbd03840bbe03800b +be03800bbd037d0bbc037a0bbb03780bb803770bb803770b04000000060102002f000000380501001500d5038a0bcf037f0bcf037f0bcd037a0bcd037a0bcd03 +7a0bcd037f0bcd038a0bca038a0bca03760bce03760bd303810bd303810bd503860bd503860bd503860bd503800bd503760bd803760bd8038a0bd5038a0b0400 +00000601010007000000fc020000facf8a000000040000002d01000004000000f0010100f50000003805010078006009f90b6009ea0b0c09ea0b0c09a50baa08 +a50baa08ea0b6c08ea0b6c08a50b0b08a50b0b08ea0bcd07ea0bcd07a50b6c07a50b6c07ea0b2e07ea0b2e07a50bcd06a50bcd06ea0b8f06ea0b8f06a50b2d06 +a50b2d06ea0bf005ea0bf005a50b8e05a50b8e05ea0b5005ea0b5005a50bef04a50bef04ea0bb104ea0bb104a50b5004a50b5004ea0b1204ea0b1204a50bb103 +a50bb103ea0b7303ea0b7303a50b1103a50b1103ea0bc202ea0bc202ea0bc202a50b6002a50b6002ea0b2302ea0b2302a50bc101a50bc101ea0b8301ea0b8301 +a50b2201a50b2201ea0be400ea0be400a50b8300a50b8300ea0b3000ea0b3000f90b9500f90b9500b40bd200b40bd200f90b3401f90b3401b40b7201b40b7201 +b40b7201f90b7201f90bd301f90bd301b40b1102b40b1102f90b7202f90b7202b40bb002b40bb002f90b2303f90b2303b40b6103b40b6103f90bc203f90bc203 +b40b0004b40b0004f90b6204f90b6204b40b9f04b40b9f04f90b0105f90b0105b40b3f05b40b3f05f90ba005f90ba005b40bde05b40bde05f90b3f06f90b3f06 +b40b7d06b40b7d06f90bde06f90bde06b40b1c07b40b1c07f90b7e07f90b7e07b40bbb07b40bbb07f90b1d08f90b1d08b40b5b08b40b5b08f90bbc08f90bbc08b40bfa08b40bfa08f90b6009f90b04000000f001000004000000f001020004000000f00103000300000000000000} +}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn posh}{\sv 2}}{\sp{\sn posrelh}{\sv 0}}{\sp{\sn posv}{\sv 2}}{\sp{\sn posrelv}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}{\shprslt\par\pard +\ql \li0\ri0\widctlpar\phmrg\posxc\posyc\dxfrtext180\dfrmtxtx180\dfrmtxty0\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \par}} +\par }} diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/abi3623.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/abi3623.rtf new file mode 100644 index 000000000..a47161a2f --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/abi3623.rtf @@ -0,0 +1,7 @@ +{\rtf1 +{\stylesheet +{\s2\ls1\sbasedon0 heading 2;} +} +\s2 +foo\par +} diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/abi4817.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/abi4817.rtf new file mode 100644 index 000000000..58d88f5ff --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/abi4817.rtf @@ -0,0 +1,6 @@ +{\rtf1 +\super +{ +\par +\par } +} diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/fdo49666.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/fdo49666.rtf new file mode 100644 index 000000000..5a673ca04 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/fdo49666.rtf @@ -0,0 +1,13 @@ +{\rtf1 \ansi \ansicpg1252 \uc1 \deff1 \deflang1033 \deflangfe1033 +{\shp +{\*\shpinst \shpleft144 \shptop490 \shpright2049 \shpbottom1840 \shpfhdr1 \shpbxcolumn \shpbypara \shpwr4 \shpwrk2 \shpfblwtxt1 \shpz0 \shplid2053 +{\sp +{\sn shapeType} +{\sv 75} +} +{\shptxt foo +} +} +} +\par +} diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/fdo64656.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/fdo64656.rtf new file mode 100644 index 000000000..1c815c4e7 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/fdo64656.rtf @@ -0,0 +1,10 @@ +{\rtf +{\*\listtable +{\list \listtemplateid3794224 \listhybrid +{\listlevel \levelnfc0 \levelnfcn0 \leveljc0 \leveljcn0 \levelstartat1 \levelfollow0 \levelspace0 \levelindent0 \levellegal0 \levelnorestart0 +{\levelnumbers ;} +} +{\listname ;} +\listid258183 } +} +} diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/i74153.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/i74153.rtf new file mode 100644 index 000000000..7e81865ad --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/i74153.rtf @@ -0,0 +1,8 @@ +{\rtf1 +{\*\revtbl +{Unknown;} +{TAMUS HSC Mac User;} +} +{\revised\super\revauth1\revdttm-1501115711 hello} +\par +} diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/i84172.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/i84172.rtf new file mode 100644 index 000000000..ce6616e5e --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/i84172.rtf @@ -0,0 +1,11 @@ +{\rtf1 +{\*\revtbl +{Unknown;} +} +\par \pard\plain +{ +{\revised\revauth1\revdttm-1497631607 foo +{bar} +} +} +} diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/parser-state-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/parser-state-1.rtf Binary files differnew file mode 100644 index 000000000..3fe4b2876 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/parser-state-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/rhbz960019.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/rhbz960019.rtf new file mode 100644 index 000000000..869aa339b --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/rhbz960019.rtf @@ -0,0 +1,12 @@ +{\rtf1 +{\*\listtable +{\list\listtemplateid-723955400\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent0\levelstartat1{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\f0 }{\listname ;}\listid-1155484576} +} +{\*\listoverridetable +{\*\listoverride{\listid-1155484576\listoverridecount0\ls1}} +} +\pard\plain \pvpg\phpg\posx1143\posy4743\absw9615\absh-2922\dfrmtxtx72\dfrmtxty72\nowrap +Hello\par +\pard\plain\par +} + diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/sf_2063317381c4a46d642c79a4b1817dc0-101375-minimized.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/sf_2063317381c4a46d642c79a4b1817dc0-101375-minimized.rtf new file mode 100644 index 000000000..c3ffebc2b --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/sf_2063317381c4a46d642c79a4b1817dc0-101375-minimized.rtf @@ -0,0 +1,62 @@ +{\rtf1\ansi\deff0\adeflang1025
+{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset128 Times New Roman;}{\f4\froman\fprq2\fcharset128 Arial Narrow;}{\f5\froman\fprq0\fcharset128 Arial Narrow;}{\f6\froman\fprq2\fcharset128 Symbol;}{\f7\froman\fprq0\fcharset128 Symbol;}{\f8\froman\fprq2\fcharset128 Wingdings;}{\f9\froman\fprq0\fcharset128 Wingdings;}{\f10\froman\fprq0\fcharset128 Times New Roman;}{\f11\fnil\fprq2\fcharset0 Microsoft YaHei;}{\f12\fnil\fprq2\fcharset128 SimSun;}{\f13\fnil\fprq2\fcharset128 Times New Roman (Arabic);}{\f14\fnil\fprq0\fcharset128 Times New Roman (Arabic);}{\f15\fnil\fprq2\fcharset128 Times New Roman;}{\f16\fnil\fprq0\fcharset128 Times New Roman;}{\f17\fnil\fprq2\fcharset0 Mangal;}{\f18\fnil\fprq0\fcharset128 Mangal;}{\f19\fnil\fprq2\fcharset128 Mangal;}{\f20\fnil\fprq2\fcharset128 Cambria Math;}{\f21\fnil\fprq0\fcharset128 Cambria Math;}}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red128\green128\blue128;}
+{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040 Predefinito;}
+{\s15\sbasedon0\snext16\sb240\sa120\keepn\hich\af11\dbch\af17\afs28\loch\f2\fs28 Intestazione;}
+{\s16\sbasedon0\snext16\sb0\sa120 Corpo testo;}
+{\s17\sbasedon16\snext17\sb0\sa120\dbch\af18 Elenco;}
+{\s18\sbasedon0\snext18\sb120\sa120\noline\i\dbch\af18\afs24\ai\fs24 Didascalia;}
+{\s19\sbasedon0\snext19\noline\dbch\af18 Indice;}
+}{\info{\creatim\yr2011\mo9\dy28\hr16\min28}{\revtim\yr2011\mo9\dy28\hr16\min29}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern3500}}\deftab720
+
+{\*\pgdsctbl
+{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1417\margbsxn1134\pgdscnxt0 Predefinito;}}
+\formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1134\margr1134\margt1417\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1417\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
+\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx9864\pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\keepn{\scaps\b\hich\af14\langfe1040\dbch\af14\afs26\alang1025\ab\rtlch \ltrch\loch\fs26\lang1040\loch\f5
+SSSSSSS SSSSSSS curriculum vitae}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\langfe1040\dbch\af14\afs16\alang1025\rtlch \ltrch\loch\fs16\lang1040\loch\f5
+}\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\keepn{\scaps\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+Informazioni personali}\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Nome}\cell\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\scaps\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSSS SSSSSSS}\cell\cell\row\pard\trowd\trql\trleft-108\ltrrow\trrh876\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvert`lt\cellx2623\clvertalt\cellx2896\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\h{phmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Indirizzo}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\scaps\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSS S. SSSSSSSS SSSS}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40[\scaps\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSS SSSSS SSSSSS}\cell\row\pard\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2896\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Telefono}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSSSSSS}\cell\row\pard\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2896\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\langfe1040\dbch\af14\afs22\alang1025\rtlch \ltrch\loch\fs22\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+}\cell\row\pard\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2896\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+E-mail}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSSSSSSSSSSSSSSSSSS}\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb120\sa0{\rtlch \ltrch\loch
+}
+\par \trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Nazionalit\'e0}\cell\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSSSS}\cell\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20{\rtlch \ltrch\loch
+}
+\par \trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Luogo e Data di nascita}\cell\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSS SSSSSSSSSS }\cell\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par }
\ No newline at end of file diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/sf_2063317381c4a46d642c79a4b1817dc0-108116-minimized.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/sf_2063317381c4a46d642c79a4b1817dc0-108116-minimized.rtf new file mode 100644 index 000000000..9576906da --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/sf_2063317381c4a46d642c79a4b1817dc0-108116-minimized.rtf @@ -0,0 +1,62 @@ +{\rtf1\ansi\deff0\adeflang1025
+{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset128 Times New Roman;}{\f4\froman\fprq2\fcharset128 Arial Narrow;}{\f5\froman\fprq0\fcharset128 Arial Narrow;}{\f6\froman\fprq2\fcharset128 Symbol;}{\f7\froman\fprq0\fcharset128 Symbol;}{\f8\froman\fprq2\fcharset128 Wingdings;}{\f9\froman\fprq0\fcharset128 Wingdings;}{\f10\froman\fprq0\fcharset128 Times New Roman;}{\f11\fnil\fprq2\fcharset0 Microsoft YaHei;}{\f12\fnil\fprq2\fcharset128 SimSun;}{\f13\fnil\fprq2\fcharset128 Times New Roman (Arabic);}{\f14\fnil\fprq0\fcharset128 Times New Roman (Arabic);}{\f15\fnil\fprq2\fcharset128 Times New Roman;}{\f16\fnil\fprq0\fcharset128 Times New Roman;}{\f17\fnil\fprq2\fcharset0 Mangal;}{\f18\fnil\fprq0\fcharset128 Mangal;}{\f19\fnil\fprq2\fcharset128 Mangal;}{\f20\fnil\fprq2\fcharset128 Cambria Math;}{\f21\fnil\fprq0\fcharset128 Cambria Math;}}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red128\green128\blue128;}
+{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040 Predefinito;}
+{\s15\sbasedon0\snext16\sb240\sa120\keepn\hich\af11\dbch\af17\afs28\loch\f2\fs28 Intestazione;}
+{\s16\sbasedon0\snext16\sb0\sa120 Corpo testo;}
+{\s17\sbasedon16\snext17\sb0\sa120\dbch\af18 Elenco;}
+{\s18\sbasedon0\snext18\sb120\sa120\noline\i\dbch\af18\afs24\ai\fs24 Didascalia;}
+{\s19\sbasedon0\snext19\noline\dbch\af18 Indice;}
+}{\info{\creatim\yr2011\mo9\dy28\hr16\min28}{\revtim\yr2011\mo9\dy28\hr16\min29}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern3500}}\deftab720
+
+{\*\pgdsctbl
+{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1417\margbsxn1134\pgdscnxt0 Predefinito;}}
+\formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1134\margr1134\margt1417\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1134\margrsxn1134\margtsxn1417\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
+\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx9864\pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\keepn{\scaps\b\hich\af14\langfe1040\dbch\af14\afs26\alang1025\ab\rtlch \ltrch\loch\fs26\lang1040\loch\f5
+SSSSSSS SSSSSSS curriculum vitae}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\langfe1040\dbch\af14\afs16\alang1025\rtlch \ltrch\loch\fs16\lang1040\loch\f5
+}\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\keepn{\scaps\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+Informazioni personali}\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Nome}\cell\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\scaps\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSSS SSSSSSS}\cell\cell\row\pard\trowd\trql\trleft-108\ltrrow\trrh876\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2896\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Indirizzo}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\scaps\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSS S. SSSSSSSS SSSS}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\scaps\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSS SSSSS SSSSSS}\cell\row\pard\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2896\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Telefono}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSSSSSS}\cell\row\pard\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2896\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\langfe1040\dbch\af14\afs22\alang1025\rtlch \ltrch\loch\fs22\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+}\cell\row\pard\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2896\clvertalt\cellx9864\pard\plain \sp\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+E-mail}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSSSSSSSSSSSSSSSSSS}\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb120\sa0{\rtlch \ltrch\loch
+}
+\par \trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Nazionalit\'e0}\cell\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSSSS}\cell\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20{\rtlch \ltrch\loch
+}
+\par \trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\qr\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20\keepn{\hich\af14\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+Luogo e Data di nascita}\cell\trowd\trql\trleft-108\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clvertalt\cellx2623\clvertalt\cellx2895\clvertalt\cellx9864\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb20\sa20{\langfe1040\dbch\af14\afs20\alang1025\rtlch \ltrch\loch\fs20\lang1040\loch\f5
+}\cell\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\intbl\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0\sb40\sa40{\b\hich\af14\langfe1040\dbch\af14\afs24\alang1025\ab\rtlch \ltrch\loch\fs24\lang1040\loch\f5
+SSSSSS SSSSSSSSSS }\cell\cell\row\pard\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par \pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\hich\af22\langfe2052\dbch\af17\afs24\alang1081\loch\f0\fs24\lang1040\ql\nowidctlpar\faauto\li0\ri0\lin0\rin0\fi0{\rtlch \ltrch\loch
+}
+\par }
\ No newline at end of file diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/sf_edeb1eb341ad4c8608af9396952724a0-41170.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/sf_edeb1eb341ad4c8608af9396952724a0-41170.rtf Binary files differnew file mode 100644 index 000000000..0925203f8 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/sf_edeb1eb341ad4c8608af9396952724a0-41170.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-1.rtf Binary files differnew file mode 100644 index 000000000..5b34e7f61 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-2.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-2.rtf Binary files differnew file mode 100644 index 000000000..58328edc9 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-2.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-3.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-3.rtf Binary files differnew file mode 100644 index 000000000..9fd589214 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-3.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-4.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-4.rtf Binary files differnew file mode 100644 index 000000000..28093f25a --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/tablemanager-4.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/data/pass/valuelist-1.rtf b/writerfilter/qa/cppunittests/filters-test/data/pass/valuelist-1.rtf Binary files differnew file mode 100644 index 000000000..847e165c5 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/data/pass/valuelist-1.rtf diff --git a/writerfilter/qa/cppunittests/filters-test/filters-test.cxx b/writerfilter/qa/cppunittests/filters-test/filters-test.cxx new file mode 100644 index 000000000..36ebeee21 --- /dev/null +++ b/writerfilter/qa/cppunittests/filters-test/filters-test.cxx @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <unotest/filters-test.hxx> +#include <test/bootstrapfixture.hxx> +#include <com/sun/star/document/XFilter.hpp> +#include <com/sun/star/io/WrongFormatException.hpp> +#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp> + +using namespace ::com::sun::star; + +/** + * Unit test invoking writerfilter/ only. + * + * This does only minimal testing, checking if the filter crashes and returns + * the expected bool value for given inputs. More fine-grained tests can be + * found under sw/qa/extras/rtfimport/. + */ +class RtfTest : public test::FiltersTest, public test::BootstrapFixture +{ +public: + virtual void setUp() override; + + virtual bool load(const OUString&, const OUString& rURL, const OUString&, SfxFilterFlags, + SotClipboardFormatId, unsigned int) override; + +private: + uno::Reference<document::XFilter> m_xFilter; +}; + +void RtfTest::setUp() +{ + test::BootstrapFixture::setUp(); + + m_xFilter.set(m_xSFactory->createInstance("com.sun.star.comp.Writer.RtfFilter"), + uno::UNO_QUERY_THROW); +} + +bool RtfTest::load(const OUString&, const OUString& rURL, const OUString&, SfxFilterFlags, + SotClipboardFormatId, unsigned int) +{ + uno::Sequence<beans::PropertyValue> aDescriptor = { beans::PropertyValue( + "URL", sal_Int32(0), uno::Any(rURL), beans::PropertyState_DIRECT_VALUE) }; + try + { + return m_xFilter->filter(aDescriptor); + } + catch (const lang::WrappedTargetRuntimeException& rWrapped) + { + io::WrongFormatException e; + if (rWrapped.TargetException >>= e) + { + return false; + } + throw; + } + catch (const std::exception&) + { + return false; + } +} + +CPPUNIT_TEST_FIXTURE(RtfTest, testFilter) +{ +#ifndef DISABLE_CVE_TESTS + testDir(OUString(), + m_directories.getURLFromSrc(u"/writerfilter/qa/cppunittests/filters-test/data/")); +#endif +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/misc/misc.cxx b/writerfilter/qa/cppunittests/misc/misc.cxx new file mode 100644 index 000000000..ce9e9ba28 --- /dev/null +++ b/writerfilter/qa/cppunittests/misc/misc.cxx @@ -0,0 +1,175 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <tuple> +#include <vector> + +#include <cppunit/TestAssert.h> +#include <cppunit/TestFixture.h> +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/plugin/TestPlugIn.h> + +#include <sal/types.h> + +#include <rtl/ustring.hxx> +#include <dmapper/ConversionHelper.hxx> +#include <dmapper/DomainMapperFactory.hxx> + +namespace +{ +class WriterfilterMiscTest : public ::CppUnit::TestFixture +{ +public: + void testTwipConversions(); + void testFieldParameters(); + + CPPUNIT_TEST_SUITE(WriterfilterMiscTest); + CPPUNIT_TEST(testTwipConversions); + CPPUNIT_TEST(testFieldParameters); + CPPUNIT_TEST_SUITE_END(); +}; + +void WriterfilterMiscTest::testTwipConversions() +{ + using writerfilter::dmapper::ConversionHelper::convertTwipToMM100; + using writerfilter::dmapper::ConversionHelper::convertTwipToMM100Unsigned; + + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2), convertTwipToMM100(-1)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-17639), convertTwipToMM100(-10000)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-70556), convertTwipToMM100(-40000)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), convertTwipToMM100(1)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(17639), convertTwipToMM100(10000)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), convertTwipToMM100(40000)); + + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), convertTwipToMM100Unsigned(-1)); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), convertTwipToMM100Unsigned(-10000)); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), convertTwipToMM100Unsigned(-40000)); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(2), convertTwipToMM100Unsigned(1)); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(17639), convertTwipToMM100Unsigned(10000)); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), convertTwipToMM100Unsigned(40000)); +} + +void WriterfilterMiscTest::testFieldParameters() +{ + using writerfilter::dmapper::splitFieldCommand; + std::tuple<OUString, std::vector<OUString>, std::vector<OUString>> result; + + result = splitFieldCommand("PAGEREF last_page"); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + + result = splitFieldCommand(" PAGEREF last_page "); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + + result = splitFieldCommand("pageref last_page"); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + + result = splitFieldCommand("pageref \"last_page\""); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + + result = splitFieldCommand("\"PAGEREF\" \"last_page\" \"\" "); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(2), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT_EQUAL(OUString(), std::get<1>(result)[1]); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + + result = splitFieldCommand("\"PAGEREF\"\"last_page\" "); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + + result = splitFieldCommand("PAGEREF\"last_page\" "); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + + result = splitFieldCommand("\"PAGEREF\"last_page \"\""); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(2), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT_EQUAL(OUString(), std::get<1>(result)[1]); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + + result = splitFieldCommand("\"PAGEREF\"last_page \"\""); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(2), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT_EQUAL(OUString(), std::get<1>(result)[1]); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + + result = splitFieldCommand("pageref \"last\\\\pa\\\"ge\""); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last\\pa\"ge"), std::get<1>(result)[0]); + CPPUNIT_ASSERT(std::get<2>(result).empty()); + + result = splitFieldCommand("PAGEREF\"last_page\"\\*"); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<2>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("\\*"), std::get<2>(result)[0]); + + result = splitFieldCommand("PAGEREF last_page \\b foobar "); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(size_t(1), std::get<1>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("last_page"), std::get<1>(result)[0]); + CPPUNIT_ASSERT_EQUAL(size_t(2), std::get<2>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("\\B"), std::get<2>(result)[0]); + CPPUNIT_ASSERT_EQUAL(OUString("foobar"), std::get<2>(result)[1]); + + result = splitFieldCommand("PAGEREF\\bfoobar\\A\"\""); + CPPUNIT_ASSERT_EQUAL(OUString("PAGEREF"), std::get<0>(result)); + CPPUNIT_ASSERT(std::get<1>(result).empty()); + CPPUNIT_ASSERT_EQUAL(size_t(4), std::get<2>(result).size()); + CPPUNIT_ASSERT_EQUAL(OUString("\\B"), std::get<2>(result)[0]); + CPPUNIT_ASSERT_EQUAL(OUString("foobar"), std::get<2>(result)[1]); + CPPUNIT_ASSERT_EQUAL(OUString("\\A"), std::get<2>(result)[2]); + CPPUNIT_ASSERT_EQUAL(OUString(), std::get<2>(result)[3]); + + for (auto prefix : { "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", + ";", "<", ">", "?", "@", "[", "]", "^", "_", "`", "{", "|", "}", "~" }) + { + OUString test(OUString::createFromAscii(prefix) + "PAGE"); + result = splitFieldCommand(test + " "); + CPPUNIT_ASSERT_EQUAL(test, std::get<0>(result)); + } + result = splitFieldCommand("\\PAGE "); + CPPUNIT_ASSERT_EQUAL(OUString("PAGE"), std::get<0>(result)); + result = splitFieldCommand("\\ PAGE "); + CPPUNIT_ASSERT_EQUAL(OUString("\\ "), std::get<0>(result)); + CPPUNIT_ASSERT_EQUAL(OUString("PAGE"), std::get<1>(result)[0]); + result = splitFieldCommand("\\\\PAGE "); + CPPUNIT_ASSERT_EQUAL(OUString("\\PAGE"), std::get<0>(result)); + result = splitFieldCommand("\"PAGE\" "); + CPPUNIT_ASSERT_EQUAL(OUString("PAGE"), std::get<0>(result)); + result = splitFieldCommand("\"PAGE "); + CPPUNIT_ASSERT_EQUAL(OUString("PAGE "), std::get<0>(result)); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(WriterfilterMiscTest); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/rtftok/data/char-hidden-intbl.rtf b/writerfilter/qa/cppunittests/rtftok/data/char-hidden-intbl.rtf new file mode 100644 index 000000000..76fea92fa --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/char-hidden-intbl.rtf @@ -0,0 +1,6 @@ +{\rtf1 +\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\pard\plain before\par +\trowd\cellx4475\cellx9058\pard\plain\intbl A1\cell +\pard\intbl{\v \line}B1\cell\row +\pard\plain after\par +} diff --git a/writerfilter/qa/cppunittests/rtftok/data/duplicated-image.rtf b/writerfilter/qa/cppunittests/rtftok/data/duplicated-image.rtf new file mode 100644 index 000000000..f225ff1f2 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/duplicated-image.rtf @@ -0,0 +1,41 @@ +{\rtf1 +before table\par +\trowd\cellx4819\cellx9638\pard\plain\intbl +A1 +\cell\pard\plain +{\shp +{\*\shpinst\shpwr1\shpbypara\shpbyignore\shptop113\shpbottom1352\shpbxcolumn\shpbxignore\shpleft-22\shpright4733 +{\sp +{\sn shapeType} +{\sv 75} +} +{\sp +{\sn pib} +{\sv +{\pict\picscalex92\picscaley92\piccropl0\piccropr0\piccropt0\piccropb0\picw341\pich89\picwgoal5115\pichgoal1335\pngblip +89504e470d0a1a0a0000000d4948445200000010000000100403000000eddde25200000030504c54450000008000000080008080000000808000800080808080 +80c0c0c0ff000000ff00ffff000000ffff00ff00ffffffffff7b1fb1c40000005b49444154789c458db10ac03008445d33e5b71d04d764caef3808f99d0604ab +b5a5b778dc933bf057f01bdd650ca98cf8d885ce240d0c3ecf40a41dc9097011f4d67a2ad18ac8f239af44f33255e19c1044ce42e39a60f9469fc06fa01a6b07 +bcd70bc70000000049454e44ae426082 +} +} +} +} +} +\cell\row +\pard\plain after table\par +\pard\plain +{\*\shppict +{\pict +{\*\picprop +} +\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw16\pich16\picwgoal240\pichgoal240\pngblip +89504e470d0a1a0a0000000d4948445200000010000000100403000000eddde25200000030504c54450000008000000080008080000000808000800080808080 +80c0c0c0ff000000ff00ffff000000ffff00ff00ffffffffff7b1fb1c40000005b49444154789c458db10ac03008445d33e5b71d04d764caef3808f99d0604ab +b5a5b778dc933bf057f01bdd650ca98cf8d885ce240d0c3ecf40a41dc9097011f4d67a2ad18ac8f239af44f33255e19c1044ce42e39a60f9469fc06fa01a6b07 +bcd70bc70000000049454e44ae426082 +} +} +end +\par +} diff --git a/writerfilter/qa/cppunittests/rtftok/data/follow-style.rtf b/writerfilter/qa/cppunittests/rtftok/data/follow-style.rtf new file mode 100644 index 000000000..6e627c784 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/follow-style.rtf @@ -0,0 +1,7 @@ +{\rtf1 +{\stylesheet +{\s0\ql Normal;} +{\s1\snext0 Heading 1;} +} +\pard\plain\s1 x\par +} diff --git a/writerfilter/qa/cppunittests/rtftok/data/invalid-hex.rtf b/writerfilter/qa/cppunittests/rtftok/data/invalid-hex.rtf new file mode 100644 index 000000000..8f9224c0e --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/invalid-hex.rtf @@ -0,0 +1,3 @@ +{\rtf1 +x\u345\'3?x +\par} diff --git a/writerfilter/qa/cppunittests/rtftok/data/left-margin-dedup.rtf b/writerfilter/qa/cppunittests/rtftok/data/left-margin-dedup.rtf new file mode 100644 index 000000000..8536694a2 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/left-margin-dedup.rtf @@ -0,0 +1,26 @@ +{\rtf1 +{\fonttbl +{\f0 Times New Roman;} +{\f3\froman\fcharset2\fprq2 Symbol;} +} +{\stylesheet +{\ql Normal;} +{\s44\ql\fi-288\li360 Table Text Bullet;} +{\s59\ql\li720 List Paragraph;} +} +{\*\listtable +{\list +{\listlevel\levelnfc23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0 +{\leveltext\'01\u-3913 ?;} +{\levelnumbers;} +\f3\fbias0 \fi-360\li1305 } +{\listname ;} +\listid845246918} +} +{\*\listoverridetable +{\listoverride\listid845246918\listoverridecount0\ls27} +} +\pard\plain\s44\ql\fi-360\li720\ls27 P1\par +\pard\plain\s59\ql\fi-360\li720\ls27 P2\par +} diff --git a/writerfilter/qa/cppunittests/rtftok/data/negative-page-border.rtf b/writerfilter/qa/cppunittests/rtftok/data/negative-page-border.rtf new file mode 100644 index 000000000..e5bec712a --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/negative-page-border.rtf @@ -0,0 +1,7 @@ +{\rtf1 +\paperw11906\paperh16838\margl1134\margr1134\margt284\margb1134 +\sectd\pgbrdropt32\pgbrdrt\brdrs\brdrw90\brsp560 \pgbrdrl\brdrs\brdrw90\brsp560 \pgbrdrb\brdrs\brdrw90\brsp560 \pgbrdrr\brdrs\brdrw90\brsp560 +\pard\plain +In this example, the page top margin (0.5cm) is the same as the border top margin (0.5 cm). +\par +} diff --git a/writerfilter/qa/cppunittests/rtftok/data/old-para-num-left-margin.rtf b/writerfilter/qa/cppunittests/rtftok/data/old-para-num-left-margin.rtf new file mode 100644 index 000000000..99825370e --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/old-para-num-left-margin.rtf @@ -0,0 +1,14 @@ +{\rtf1\ansi +\margt1497\margb590\margl590\margr590\pgwsxn11906\pghsxn16838 +\pard\plain First\par +\pard\plain +{\*\pn \pnlvlbody +{\pntxtb \'78} +} +{\b\f7\fs22 Second\par} +\pard\plain\li1191 +{\*\pn \pnlvlbody +{\pntxtb \'78} +} +{\f7\fs22 Third, with left indent\par} +} diff --git a/writerfilter/qa/cppunittests/rtftok/data/page.rtf b/writerfilter/qa/cppunittests/rtftok/data/page.rtf new file mode 100644 index 000000000..75e137638 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/page.rtf @@ -0,0 +1,6 @@ +{\rtf1 +\pard\plain +page 1\par +\page +page 2\par +} diff --git a/writerfilter/qa/cppunittests/rtftok/data/picture-in-textframe.rtf b/writerfilter/qa/cppunittests/rtftok/data/picture-in-textframe.rtf new file mode 100644 index 000000000..ec0a07690 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/picture-in-textframe.rtf @@ -0,0 +1,29 @@ +{\rtf1 +\paperw10080\paperh12960\margl1066\margr1066\margt1642\margb1066 +\pard\plain +{\shp +{\*\shpinst\shpleft31\shptop105\shpright4108\shpbottom3887\shpfhdr0\shpwr2\shpwrk3\shpfblwtxt0 +{\sp +{\sn shapeType} +{\sv 202} +} +{\shptxt \pard\plain +before +{\*\shppict +{\pict +{\*\picprop\shplid1025 +{\sp +{\sn shapeType} +{\sv 75} +} +} +\picscalex23\picscaley24\piccropl0\piccropr0\piccropt0\piccropb0\picw30372\pich22437\picwgoal17219\pichgoal12720\pngblip +47494638396110001000d5ff00000000ffffffc0c0c0555f00ffffaafcfcfcf6f6f6eaeaeae6e6e6e4e4e4e3e3e3c2c2c2c1c1c1bcbcbcb5b5b5b3b3b3b0b0b0adadada5a5a5a2a2a2a1a1a19f9f9f9494948a8a8a8888888686867b7b7b6c6c6c5c5c5c4e4e4e4b4b4b4747474646463d3d3d3c3c3c2e2e2e2525251b1b1b18181810101009090906060603030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021f90401000002002c0000000010001000000684408170482c0a06c8a4728924389f506833b281302a8e6b164b18103024c52111504cca67332102e0042e9a40d9319f8300a343c1200f54e47f7e2a00001e0b0a7d0d728a010d838400261a7c0d94947784252700127e9d159f6c8411140019080ea7a9a85f842122281612b1b3b25d6b1f29291d0fbbbdbc5d5e51c34e4cc64a46c94341003b +} +} +after\par +} +} +} +\par +} diff --git a/writerfilter/qa/cppunittests/rtftok/data/picw-pich.rtf b/writerfilter/qa/cppunittests/rtftok/data/picw-pich.rtf new file mode 100644 index 000000000..56a2b0d1e --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/picw-pich.rtf @@ -0,0 +1,6 @@ +{\rtf1 +\pard\plain +{\pict\wmetafile8\picwgoal2134\pichgoal2264\picscalex100\picscaley100\picw99\pich105 +010009000003d13d00000000a73d0000000005000000070103000000050000000102ffffff0005000000090200000000a73d0000410b2000cc006900630000000000690063000000000028000000630000006900000001001800000000000c7b000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafb9c8a3de3e0cbfefffdfffffffffdfffbfffbfffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffffffffffffffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ffffdcccafa2975bfffff9e1dee0b8b3b5aaacaccad2c8f5f5f5fffffffffffffdfdfdfffffffffffffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffeffaa9e58fffdfdfefefefffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafdfbfffff7a19363d0ceabb6b2b17b777d7475798c9489d3d3d3fffffffcfcfcfefefefffffffffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffdfdfdfffffffffffffcfcfcfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfbfda79b55fffffffffffffffffffafffcfffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffdfcd9d3c67d732d949484b6b2b8bcb9c29ba097828282a2a2a2edededfffffffffffffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffaa9e58fffffffdfdfdfefcfcfafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9faf8a6a6ac85773cbbb483f7fcfdfffcfefcfcfccdcdcd898989979797e4e4e4fffffffffffffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffefefefffffffefefefbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffefefffffffffffffafffcfffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffdfe7e7706a6bdfd7ca928539f2fae9fffffcfffafffffffffbfbfb909090979797f7f7f7fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffffffffdfdfdfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffa99d57fffdfdfffffffffffff9fffbfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf9fbbbc3c28c8a89ede5ecc2be8db3a874f5fffdfffdfffefefeffffffdddddd888888d0d0d0fffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbfdfdfdf4f4f4f7f7f7fffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfcfea79b55fffffffffffffffefef7fef9fffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4f6f7b7b5b4929897f5f0effcfcf6968449ebeed5fffffafffffffffffffefefea4a4a4a7a7a7fafafafefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefec2c2c2979797c5c5c5fbfbfbfffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffefefcfcfcfffffffafffcfffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5f7f7b2adaf9da299edf5f4fffbffd3d1afae965afafffefefefefffffffdfdfda6a6a6a1a1a1fffffffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9b9b9b898989b4b4b48e8e8e9a9a9af9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffeffa89c56e5e3e3cbcbcbdcdadaf3faf5fffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fcf7c9c6c88f8a89eeececfdf9fffeffef959853ebd5acf6f9fffffff8fafffea8a6a6aaa19efafdfffcfefefffffefcfcfcfffffffffffffdfdfdfefefefdfdfdfffffffefefefefefefffffffefefefefefefffffffdfdfdfdfdfdfefefec5c5c5838383d5d5d5ffffffd8d8d8767676cacacafcfcfcfefefefffffffefefefffffffffffffdfdfdfffffffdfdfdfffffffffffffefefefffffffcfcfcfffffffffffffefefeedededbebdbf8377318a88889292928c8a8aa7aea9fffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdffffe8e6e5736f6ed0d0d0fbfffffffffee5ddc6958b4ffff9f6f9fffafbfff7bdb3bf888385fdfffcfbfffffffcfdfffffffbfbfbfffffffdfdfdfffffffffffffafafafffffffffffffdfdfdfffffffefefefefefefffffffffffff0f0f0787878bfbfbffffffffefefeffffffcacaca7d7d7de6e6e6fffffffdfdfdfffffffefefefffffffffffffefefefffffffdfdfdfffffffffffffdfdfdfefefeffffffdfdfdfb5b5b59494948e8d8f867a34d6d4d4e7e7e7c2c0c07a817cfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfcfefcfaf9aeaaa9939296d1d9cef9f9f9fffbffa8a471d4c196fafffffafef2dfd7de7b7a83dddedaf8fefdfffdfefdfdfdfefefefffffffffffffdfdfdfcfcfcfffffffefefefffffffdfdfdfffffffffffffdfdfdffffffffffffd5d5d5767676e7e7e7fffffffdfdfdfffffff6f6f67f7f7fbcbcbcfbfbfbfffffffefefefffffffffffffdfdfdfffffffcfcfcfffffffafafafffffffcfcfcedededc6c6c68888887d7d7db9b9b9faf9fba89c56fffffffafafaa9a7a7a1a8a3fffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffdfc9c9ba46e7372c9cec5faf5f6f7efe291803dfdfaecfffdfffafff6adafb78d8a8cf1f5f0fffffffefefefffffffbfbfbfcfcfcfffffffcfcfcfffffffffffffffffffffffffffffffffffffffffffcfcfcf6f6f6b0b0b0a2a2a2f1f1f1fcfcfcfffffffbfbfbffffffd7d7d7838383d8d8d8fffffffffffffcfcfcfdfdfdfffffffefefefffffffffffffcfcfcf8f8f8d2d2d2828282737373c1c1c1fffffffffffffffeffa49852fcfafad4d4d46e6c6cdce3defffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfbfdfffffbfefefef8f9fdc2c5ca757b76c7cbc0fff8ffcbbf8fbaad79fffbfff4fff5e1e0e47b787ac4c1bcf8fdfefdfdfdfdfdfdfffffffffffffffffffffffffdfdfdfefefefefefefffffffcfcfcfffffffffffffdfdfdececec898989c3c3c3f7f7f7fffffffefefefffffffdfdfdfdfdfd9090909d9d9dfffffffffffffffffffffffffefefefffffffefefefbfbfbcdcdcd7f7f7f777777bebebef2f2f2fffffffefefefefefefffeffa69a54efeded8c8c8cb2b0b0f5fcf7fff9feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffcfff5fefefefdfefcfbfdfeb3b2bc787c77e6e6e6fdf7ec93893bf0e8dbfbfffffefbfdcfceca797672bbc3c3fefefefffffffbfbfbfefefefffffffffffffdfdfdfffffffffffffffffffdfdfdfffffffdfdfdffffffe2e2e2757575e4e4e4fefefefffffffdfdfdfffffffefefeffffffe9e9e9838383979797f9f9f9fcfcfcfffffffdfdfdebebebb3b3b3868686848484b7b7b7e0e0e0f8f8f8fffffffcfcfcfffffffefefefffeffada15ba2a0a0858585f8f6f6fafffcfffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffffdfffefdfffffffffcfffffffaf6fca1a0a2979b95faf9fdd3cea1a29b6afffff9fffdfffdfdfdc6c4c3767b7aadadadf9f9f9fffffffcfcfcfffffffffffffefefefdfdfdfffffffefefefffffffffffffdfdfdffffffcdcdcd7e7e7ef5f5f5fffffffffffffffffffdfdfdfefefefdfdfdffffffdadada8f8f8f8585859f9f9f9e9e9e9393938383839a9a9ab9b9b9e0e0e0fffffffefefefdfdfdfefefefffffffefefefffffffefdff877b35838181dfdfdffffdfdf9fffbfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfff7fdfcfff9fbfbfffefffffefffffff7dfe0dc6c6e6ee4e9e7fdf9ffa09c4ee4d5bbfffbfffffcfffbfffcc4c7c58282829f9f9fcececef8f8f8fefefefffffffffffffffffffefefefffffffffffffefefefffffffbfbfbb8b8b8909090f8f8f8fefefefefefefefefefffffffffffffffffffefefeffffffefefefb1b1b19d9d9d999999a6a6a6cdcdcdf4f4f4fffffffffffffffffffcfcfcfffffffefefeffffffffffffffffffc0bfc17c702acdcbcbfffffffffffff9fffbfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffffffffefefeffffffefefef9b9b9bc2babbf2faffd9ddb99b8a47fdfff5fffefefbfffffefdffeeeeee8e8e8e767676a5a5a5cacacadddddde6e6e6eeeeeef8f8f8ffffffffffffffffffffffffededed979797bfbfbffbfbfbfdfdfdfffffffffffffffffffffffffffffffffffffefefefffffffefefefffffffffffffffffffefefefffffffffffffcfcfcfffffffffffffffffffffffffdfdfdfbfbfbcdccc8747474938741fffefffbfafcfffefefafffcfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffffffffffffffbfbfbbebebe969192e6eee4fffff8a8a46fd6c69bf8fbfffffffffdfffffefefeffffffdfdfdf9d9d9d7878787272727d7d7d999999bfbfbfe8e8e8f6f6f6fdfdfdfbfbfbdddddd848484e3e3e3fcfcfcfefefefffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffefefefffffffffffffefefefefefefffffffefefefffffffffffffbfbfbfffffff5f5f5c2c2c2696864cacacaaa9e58fffcfefffefffffefefafffcfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefefefefefefefefefed5d5d581837de6e4e3fffeffebedda9b883ff9faf0f9f8fcfdfffcfefefefffffffffffff9f9f9f3f3f3eaeaead0d0d0b3b3b38686867474748d8d8de4e4e4ffffffbfbfbf808080fbfbfbfefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffefefefbfbfbfffffffbfbfbfffffffffffffefefefffffffffffffbfbfbfffffff4f4f4acacac6f6f6fd5d4d0fefefea79b55fffcfefefdfffffffff7fef9fffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffdfdfdfefefeffffffffffffdfdfdf787e73e5dce9fffefdfffdffb9b07ebfb37dfbfefffffffcfffffffdfdfdfdfdfdfffffffefefefafafafefefefbfbfbebebebd8d8d8acacac7e7e7e9696967f7f7fb0b0b0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9fffffffffffffffffffffffffefefefdfdfdfffffffffffffffffffefefececece838383909090e0e0e0f9f8f4f9f9f9aa9e58fffefffefdfffffffffafffcfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffdfdfdffffffffffffffffffe1e1e1737a77e5dee3fffefffdfbfaf8f5f096893bf2eedcfcfefffefefefffffffdfdfdfefefefffffffffffffffffffafafafdfdfdfffffff8f8f8cacaca7f7f7f979797f3f3f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbfffffffefefefffffff9f9f9fffffffffffffbfbfbefefefcfcfcfaaaaaa909090888888abababe4e4e4fffffff6f5f1fefefeaa9e58fefbfdfffefffffdfdf9fffbfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffffffffdfdfdffffffdedede767981e8e3dafdfdfdfdfffffdfeffcdc59db0a46afffffefffffffdfdfdfdfdfdfffffffefefefcfcfcfffffffffffffffffffffffffefefefcfcfcf3f3f3edededfffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffefefeddddddb1b1b1929292858585929292b1b1b1ddddddfffffffffffffdfdfdf5f4f0ffffffab9f59fffcfefbfafcfffffffafffcfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffefefeffffffffffffffffffffffffcecece838089e8e9dffffff9f6f8fffffffefdf8f59f9359eae2c5fefefefffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffff8f8f8fcfcfcc6c6c6868686858585b7b7b7edededfdfdfdfafafafffffffffffffffffffffffff8f7f3ffffffa1954ffffefffffefffffdfdfafffcfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffefefefefefefefefefefefef5f5f5b1b1b1a89da5eef6effbfef5fbfffffaf9fffffffce3dac6ab9a5bfffffffdfdfdfefefefffffffffffffffffffffffffdfdfdfefefefffffffdfdfdfefefefffffffffffffefefefffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffcfcfcc6c6c6727272bebebefffffffffffffcfcfcfffffffffffffffffffffffffffffffffffff8f7f3fcfcfcab9f59fffcfefdfcfefffffff8fffafffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffefefefffffffffffffdfdfdfefefefffffffffffffdfdfdfffffffffffffefefefefefefffffffffffffdfdfdededed838383ccc8cefdfdfdfbfefcfdfffffffefffffdfcfffff1a4a182d8d499fffcfefffcfffffff9fffefffcfefff8fffbfffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffcfcfcffffffececec707070c6c6c6f8f8f8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffffffffffffffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbfffffffdfdfdfdfdfdfffffffffffffefefefffffffdfdfdfffffffffffffbfbfbfffffffffffffefefefdfdfdfffffffefefeffffffffffffffffffc9c9c96f6f6fefeceefdfefcfdfffbfbfefcfcfbfffffefffffef5ece9d4988d53fbf5f6fdfff9fffdfffdfffefcfdf9fffefff8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffdfdfdfffffffbfbfbfffffffffffffefefeffffffffffffc8c8c8828282e5e5e5fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffffffffffffffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffefefefdfdfdfffffffefefefcfcfcfffffffffffffffffffffffffffffffdfdfdfffffffffffffffffffefefefffffffffffffffffffdfdfdf0f0f0a1a1a1a8a8a8fffdfdfffffbfdfff9fbfffafdfefffdfbfffffdfdfffffbc3b591cac497f4f4fadadbd9bfbdbcb2b1adada2a4949da09090909393939494949191918e8e8e909090989898a0a0a0a8a8a8c0c0c0e9e9e9fffffffdfdfdfffffffffffffafafafffffffefefef5f5f5b6b6b6a1a1a1efefeffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffffffffffffffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffcfcfcfffffffffffffcfcfcfefefefffffffdfdfdfefefefffffffffffffdfdfdfffffffffffffcfcfcffffffffffffffffffd3d3d37e7e7ee9e9e9fffdfffffdfcfefffafbfffaf9fefdfdfefffffefffbfbfbfaeee8877d308a847d858d8c948f8c989394939595a3a3a3aeaeaeb0b0b0b2b2b2b3b3b3b1b1b1abababa4a4a49e9e9e9191918282828c8c8cb7b7b7f5f5f5fffffffbfbfbfffffffefefefffffff4f4f4b2b2b29f9f9ff1f1f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffffffffffffffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffefefefcfcfcfffffffffffffdfdfdfdfdfdfefefefffffff4f4f4ebebebf0f0f0fdfdfdfffffffffffffffffffffffffffffffefefefffffffcfcfcffffffb7b7b77e7e7efffffffffcfffffdfffffffefdfffcfbfefcfdfffff9fbfcfafcfcbeb9ba7d6f45938e51e6e5eff8f6f5fffffbf6fffffffefbfffffffefefefdfdfdfefefefffffffffffffffffffdfdfdfffffff6f6f6bababa7b7b7bb1b1b1fffffffffffffffffffefefefffffffefefec9c9c9848484efefeffbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffffffffffffffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffcfcfcfffffffffffffcfcfcd1d1d19e9e9e989898a0a0a0bfbfbfe3e3e3f5f5f5fafafafdfdfdfffffffffffffefefeffffffffffffa7a7a7969696fefefefffdfffffefffcfbfdfcfcfcfffffefcfffdfdfffec0c3c17c7d7bd4cec9a1984feaddcffbfefffafff6fbfffffffffcfefefefffffffffffffffffffefefefdfdfdfefefefffffffffffffafafaffffffd4d4d47b7b7bd1d1d1fefefefcfcfcfffffffefefeffffffededed797979d4d4d4fffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffffffffffffffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdfffffffffffffefefefefefec0c0c07a7a7aa9a9a9b9b9b9aaaaaa8787877575757e7e7eb0b0b0eeeeeefdfdfdfffffffdfdfdfffffffdfdfda2a2a2a5a5a5fefefefffffefefefefffefffffefffffffffffffed8d9d7737472b6babbfdffffe0d2b6a59a68fffff9fafffffffffffffefdfefefefdfdfdfdfdfdfefefefffffffffffffffffffefefefffffffdfdfdfffffffafafac1c1c1747474edededfffffffefefefffffffdfdfdf8f8f8a2a2a2a2a2a2f6f6f6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffffffffffffffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefffffff3f3f3828282c0c0c0f1f1f1f8f8f8f4f4f4e9e9e9ddddddc2c2c29a9a9a7e7e7e8e8e8eb7b7b7e9e9e9fffffffbfbfba4a4a4a0a0a0fffffffdfff9fefffbfffffffffefffffdffedebeb767474b4b2b2f0fafafdfafcfffdffaaa168dbd8acf9fbfffefdfffffffbfefefefffffffffffffffffffefefefefefefffffffffffffdfdfdfffffffcfcfcffffffefefef9c9c9ca4a4a4f5f5f5fffffffffffffffffffdfdfdeeeeee747474bdbdbdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffa89c56fffffffffffffffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffcfcfcfffffff8f8f8717171d9d9d9fffffffffffffffffffffffffcfcfcffffffecececcececeb0b0b0939393878787929292999999757575a9a9a9fffffffffffffffffffefefefffffff5f5f58c8c8c9c9c9cf7f7f7fffff9f9fefdf6fffff3e9d1a08f4cfcfff4fffff7fafffffefdfffffefffffcfffffbfffafefffafffbfdfefafffbfffffffffefefefdfdfdffffffffffffe3e3e3767676cececefffffffefefeffffffffffffffffffc8c8c87d7d7db7b7b7fffffffffffffffffffefefefdfdfdfffffffffffffdfdfdfefefefffeffa89c56fffffffffffffffffff6fdf8fffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffefefef6f6f6a5a5a5a7a7a7f7f7f7fffffffefefefefefefffffffffffffffffffefefeffffffefefefd0d0d0a5a5a59696969f9f9fd9d9d9fffffffefefefffffffffffff9f9f9b2b2b27d7d7df2f2f2fffffffffefdfdfffefbfefffffff0beb28acdbd8ffafcfffdfdfffcfefefffffbfffffcfffdfffbfefff9fffafefffbfffcfffffffffffffffffffffcfcfcfffffffefefeb3b3b39b9b9befefeffffffffdfdfdfdfdfdfffffffbfbfbbfbfbf818181a4a4a4dadadafafafafffffffffffffdfdfdfffffffffffffefefefffeffa59953fffefefdfdfdfffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefcfcfcfffffffdfdfdffffffe3e3e3818181cececefffffffffffffdfdfdfffffffcfcfcfffffffffffffffffffdfdfdfffffffffffffffffffdfdfdfffffffdfdfdfefefefffffffdfdfdcecece777777dededefffffffdfdfdfffefffdfffffefffdfbfff8f2f0e5ab8e55f6f3ebfefafffafffffdfffbfffff8fffffefffffffbfefcfdfffefffefffffffffffffffffffffffffffffffffffffff9f9f97c7c7ccdcdcdfffffffffffffffffffcfcfcfefefeffffffdfdfdf888888818181c5c5c5edededfffffffffffffffffffcfcfcfdfdfdfffeffa79b55fffffffefefefdfbfbfafffcfffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfefefefffffffdfdfd9f9f9fa3a3a3f9f9f9fffffffefefefffffffffffffffffffcfcfcfffffffffffffbfbfbfefefefffffffefefefffffffffffffffffffdfdfdf4f4f4909090a2a2a2fffffffbfbfbfffffffffefffcfbfffbfffafffffbfaffffcebf9ebdaf7bfffffef9fdfff9fefcfffffbfefdf9fffffffffefffdfffefdfffefffffffefefefefefefffffffcfcfcfffffff7f7f77d7d7dcacacafdfdfdfcfcfcfefefefffffffdfdfdffffffffffffffffffc7c7c7707070999999e6e6e6fcfcfcfafafafffffffffffffffeffa59953fffefefffffffffffff9fffbfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffefefefffffffdfdfdffffffe9e9e98d8d8dc7c7c7fffffffdfdfdfefefefefefefffffffffffff8f8f8fffffffffffffffffffdfdfdfffffffdfdfdfefefefefefeffffffb0b0b0858585fbfbfbfcfcfcfffffff8f8f8fffffefcfbfffffffcfffbfefbfbfff6fbf2a59552ebe9c6fdfdfff9fafefffefffffffffffefffffefffcfefefbfffbfdfdfdfffffffefefefbfbfbfffffffbfbfbafafaf919191e7e7e7fffffffffffffbfbfbfefefefffffffdfdfdfffffffffffffafafaefefef9b9b9b777777d8d8d8fffffffffffffdfdfdfefdffaa9e58fffefefdfdfdfffffff7fef9fffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffcfcfcfefefeffffffa0a0a0999999fffffffffffffffffffdfdfdfffffffffffffffffffefefefbfbfbfffffffffffffffffffefefeffffffffffffe8e8e87f7f7fbdbdbdfffffffffffffcfcfcfffffffbfffffcfffdfffffefbfefffffdfff6fffed9d9b1ada465fffff8fffefffffcfffdfefffdfdfdfffefffffffffcfffbfffffffdfdfdfefefefffffffcfcfcdfdfdf6b6b6bcececefdfdfdfffffffcfcfcfffffffffffffffffffffffffffffffffffffdfdfdfefefef1f1f1b6b6b67b7b7bc3c3c3fafafafffffffbfafca89c56fffffffdfdfdfffffffafffcfffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffcfcfcfffffffdfdfdfefefefefefefffffffffffffdfdfdcccccc8d8d8de6e6e6fefefefefefefefefefffffffefefefffffffdfdfdfffffffffffffffffffdfdfdffffffffffffffffff9b9b9b9b9b9bf8f8f8fffffffffffffdfdfdfffffffbfffffdfff9fffffffafffffef9fafefffbfdfefaa79c6adbd5b2fffff8fefbfffbfefffcfffdfffffffffefffbfdfdfffffffffffffdfdfdfefefeefefef8b8b8baaaaaaf7f7f7fdfdfdfffffffefefefffffffffffffefefefffffffffffffcfcfcfffffffffffffcfcfcfcfcfcbcbcbc7a7a7abbbbbbfbfbfbfffeffa59953fffffffffffffffefefafffcfffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffcfcfcfffffffdfdfdfffffff1f1f1949494c2c2c2fefefefffffffffffffefefefefefefefefefffffffffffffcfcfcfffffffefefefefefeffffffededed767676cdcdcdfffffffcfcfcfffffffffffffefefefafefffffffcfafffffefffdfafffbfffdfffffbffebe3cc98915affffebfffdfffafdfffdfffbfffffefffdfffffefffefefefffffffefefef9f9f9b3b3b37c7c7cf3f3f3fffffffffffffdfdfdfffffffffffffffffffffffffefefefefefefffffffffffffdfdfdfffffffffffffefefec7c7c7787878b7b7b7f8f7f9aa9e58fffdfdfffffffffefefafffcfffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffefefefefefefffffffffffffefefefefefefffffffffffffffffffdfdfdfffffffcfcfcfffffffdfdfdfffffff5f5f5979797bcbcbcfffffffffffffefefefffffffefefefffffffefefefffffffffffffefefefffffffffffffafafab4b4b49a9a9aebebebfffffffffffffdfdfdfffffffefefeffffffffffffffffffffffffffffffffffffffffffffffffbab17fcac89ffffdfef8fefdfafffff6f7fffdfffefffffbfcfcfcffffffffffffc3c3c37a7a7ae4e4e4fffffffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffdfdfdfffffffefefefffffffcfcfcd7d7d774736fbdbfbfaa9a55fcfefffffbfefdfffff9fffafffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffefefefefefefffffffffffffffffffffffffffffffcfcfcfffffffefefefffffffffffffffffffffffffdfdfdd5d5d5818181dadadafffffffefefefffffffffffffffffffffffffefefefffffffefefefdfdfdfffffffefefef6f6f6878787bebebefffffffffffffdfdfdfffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffff5f6dca59560fcf6e9fffbfef2fbfefffffffffefffefffdffffffffffffe0e0e08a8a8ab2b2b2fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffdfdfdfdfdfdfffffffcfcfcd2d1cd777979958540fcfefffffdfffdfffffbfffcfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfbfbfbfffffffffffffefefeffffff9090908f8f8ffdfdfdfffffffdfdfdfffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffff6f6f67d7d7dc6c6c6fffffffefefefdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fff8d3c2a1c0bc89fffefffdfffefafffdfffffefbfcfffefefefefefe9797978a8a8af6f6f6fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffefefefffffffffffffcfcfcfdfdfdfffffff6f5f1b2b4b483732ee4e6e7fffbfefafcfcfbfffcfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffefefefefefefefefefefefefcfcfcfffffffffffffafafafffffffcfcfc939393888888e2e2e2fffffffafafafffffffafafafffffffdfdfdfffffffefefefffffffefefefdfdfdfefefefefefefbfbfb9e9e9ea9a9a9f9f9f9fefefefffffffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffcfff9fea69a5af1f0d6fffcfefdfffefffffcfffdffffffffa6a6a6848484e8e8e8fffffffffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffefefefdfdfdfffffffffffffdfdfdfefefefffffbf1f3f3887833909293fffdfffdfffffbfffcfffafcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffdfdfdffffffcbcbcb8d8d8d909090ddddddfffffffffffffffffffcfcfcfffffffefefefdfdfdfffffffefefefffffffffffffffffffffffffdfdfdfcfcfcd8d8d8888888ddddddfdfdfdfffffffcfcfcfffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffefdf9fafbffdcd5b4b7ab6bfcfefffffffbfdffffffffffc5c5c57a7a7ad4d4d4fffffffbfbfbfefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffefefefdfdfdfffffffffffffffffffffffcf9fbfba4944f868889beb7bafafcfcf9fffafffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffefefefefefeffffffdededeadadad878787a0a0a0f3f3f3fefefefffffff9f9f9fcfcfcfffffffcfcfcfefefefffffffffffffefefefefefeffffffffffffffffffffffffffffffffffff808080b5b5b5fffffffffffffffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffefff7fffefefcfbb4a66ce3dfc3fbfffffffdfecccdcb737373c7c7c7fcfcfcfffffffffffffffffffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffffffffefefefefefefefefefdfdfdfffffbfdffffa59550c7c9ca797275eceeeefbfffcfffcfeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffefefefcfcfcffffffeaeaeac4c4c4878787898989d7d7d7fcfcfcfffffffffffffbfbfbfffffffffffffffffffffffffffffff8f8f8f9f9f9fefefefffffffffffffdfdfdfefefeffffffffffffffffffaeaeae9a9a9af0f0f0fffffffcfcfcfffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffcfffbfffbfefefee8e3ceab9d6cf5f9edd0cbc879787abababafdfdfdfcfcfcfffffffdfdfdfbfbfbfffffffbfbfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfefefefffffffffffffffffffffffff6f5f1fbfdfdac9c57edeff09e979aabadadf5fbf6fffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffefefefffffffefefefbfbfbf7f7f7d2d2d28b8b8b717171c7c7c7fdfdfdfffffffffffffefefefefefefffffffdfdfdfffffffdfdfdf8f8f8e4e4e4c5c5c5bdbdbdd6d6d6f0f0f0fcfcfcfffffffffffffffffffdfdfdfefefef4f4f4858585bcbcbcfffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffdfefffffff8f8fef9fdfbfab1a87daca0786f7a78c0b9c0fffffffdfdfdfffffffcfcfcfffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcfffffffffffffefefefefefefefefefffffffdfdfdf7f6f2fdffffab9b56fcfeffdad3d6797b7bedf3eefffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fefefefffffffefefefffffffdfdfdffffffe0e0e0888888727272b4b4b4edededfdfdfdfdfdfdfffffffffffffffffffffffffffffffafafafffffff3f3f39a9a9a717171898989919191787878747474cdcdcdfffffffafafafffffffffffffffffffbfbfba7a7a7868686fdfdfdfffffffdfdfdfffffffffffffffffffffffffefefefdfdfdfffffffffffffffffff7fdf8efede5d7d0d79ea9b77b7a667d6e2fd6cec1f5faf8fffcfffffefefdfffff9fafefffffefffff9fdfefafdfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f6eefbfdfeac9956fdfffeeae5e4828387ccd1d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffdfdfdfcfcfcf4f4f49797977b7b7bb3b3b3ddddddf2f2f2fffffffffffffffffffffffffffffffdfdfdfefefefdfdfdffffffc8c8c8727272a1a1a1dededeeaeaeaececece1e1e1c0c0c0707070b2b2b2fffffffffffffefefefdfdfdffffffeeeeee959595848484b3b3b3bababab3b3b3b1b1b1afafafaaaaaaa6a6a6a4a4a49e9e9e9393938989897a7c7d84827a8b8a8c9d9fa7c9c6c1b8af8ac2bd8cfffffffffbfffffffcf8fbfffdfffefefffafefafffffefffafdfbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f6eefcfeffaf9c59fbfefcf7f2f1a8a9ada4a9a8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fefefeffffffffffffc8c8c8848484999999d0d0d0fcfcfcfffffffffffffffffffefefefdfdfdfefefeffffffffffffffffffffffffacacac797979bababaf6f6f6fbfbfbfefefefefefefffffffdfdfdd0d0d07d7d7dc4c4c4fefefefffffffffffffdfdfdfefefee7e7e7a5a5a59595959898989b9b9b9b9b9ba0a0a0a2a2a2a1a1a1a1a1a1a7a7a7b1b1b1b7b7b7c9c8cad2d3cfe2e7e5fdf4f7fffefef7f5eda39a61f1ead9fffbfffffffbf8fdfcfbfffefefffdfffcfffffefffffffbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f6eefdffffae9b58fbfefcfffefdd0d1d57e8382ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffdfdfdb9b9b97b7b7bafafaffffffffefefefffffffffffffefefefffffffefefefefefefffffffffffffcfcfcdbdbdba0a0a0868686c9c9c9fdfdfdfffffffffffffefefefffffffdfdfdfcfcfcffffffb7b7b78a8a8aefefeffffffffafafafffffffdfdfdfffffffefefef7f7f7f7f7f7f6f6f6fafafafefefefffffffffffffefefefefefefffffffffffffefdfffbfdfefdfffbfffbfefdfdfdfdffffd2c7b1bcb381fffffbfffffefbfffbf9fdfefffcfffffffffefcfbfffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f5edfdffffac9956fdfffefffffee5e6ea747978ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffcacaca6f6f6fd2d2d2fffffff6f6f6fffffffdfdfdfffffffdfdfdfdfdfdfffffff9f9f9ecececd7d7d7c2c2c2808080898989e3e3e3fffffffefefefafafafffffffdfdfdfffffffefefefffffffbfbfbf2f2f2959595b8b8b8fefefefffffffffffffffffffbfbfbfffffffffffffefefefefefefffffffffffffefefefefefefffffffffffffffffffefefefffefffbfffffffffbfefbfdfffcfffcfffdfdfbfba79a62e0e1bffffbfffdfffcfafffdfdfcfffffff9fffcfefffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f6eefdffffac9956fdfffefffffeecedf1767b7affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff8a8a8ab8b8b8f3f3f3f7f7f7fefefef6f6f6f7f7f7f5f5f5f3f3f3efefefd9d9d9b2b2b28f8f8f8080807d7d7dcacacafffffffefefefffffffffffffffffffdfdfdfffffffdfdfdfffffffafafaffffffffffffbbbbbb838383fffffffefefefefefefdfdfdfffffffdfdfdfbfbfbfffffffffffffefefefffffffffffffffffffffffffefefefefefefefefefffcfffbfff9fffffcfdfffefef4fffffffcf8fff9f1e0c5a3a46cfff5fdfffefffdfffbfffffffffffcfffdfffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f7effcfeffae9b58fafdfbfffffef0f1f5727776ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fefefeb5b5b57b7b7b959595abababa9a9a9a9a9a99a9a9a8989898080807878787f7f7f959595b9b9b9dfdfdff7f7f7fbfbfbfefefefffffffdfdfdfffffffffffffcfcfcfffffffffffffdfdfdfffffffffffffefefec5c5c5868686f1f1f1fcfcfcfefefefffffffffffffdfdfdfffffffdfdfdfcfcfcfffffffffffffefefefefefefffffffffffffffffffffffffffefffafffbfbfcfafffffefffcfffdfffffbfff5fffeffb3ab7cd8d1b6fffffcfffefffffffefffffffefdfffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f6eefcfeffae9b58fbfefcfffffeeeeff36e7372ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fefefef2f2f2cdcdcdb3b3b3a3a3a3a4a4a4a8a8a8b1b1b1bcbcbcccccccdcdcdce5e5e5efefeffafafafefefefcfcfcfffffffdfdfdfffffffffffffffffffdfdfdfffffffffffffffffffffffffffffffefefefdfdfddbdbdb808080e8e8e8fefefefffffffefefefefefefffffffefefefcfcfcfffffffffffffefefefffffffffffffffffffffffffffffffffffffffffcfbfefffafffefffdfffdfff7fafffffffefff6fbffffecd3989a58fcf9ebfffafffdfcfefffffffffff8fdfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f5edfdffffab9855fdfffefffdfce8e9ed6f7473ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fdfdfdfffffffffffffdfdfdf7f7f7f5f5f5f9f9f9fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeffffffffffffffffffffffffd5d5d5848484e8e8e8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ffffcdbb92c8c295fffefef9fefdfffffefffefffbfefcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f3eefdfeffae9a59fcfffdfffefdcecfd37e8382ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffefefefefefefefefefefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0d0d0808080f0f0f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefaf9eba39463f6f5e1fffefffbfcfffefdfffdfffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf7f2fdfeffac9857fcfffdfffaf9acadb19ca1a0fffefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeffffffcfcfcf7d7d7df6f6f6fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdfbffffcfc7aab7b079fffefffffdfffafdfffffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f5f0fcfdffaa9655fdfffee9e4e3818286ccd1d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fefefefefefefefefefffffffffffffffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffcfcfcffffffd2d2d27d7d7df4f4f4fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9fcfafafcfcad9f64ece5ccfdfbfffbfffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f6f1fdfeffaa9655fdfffed6d1d0727377ebf0efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffdfdfdffffffd3d3d3808080f1f1f1fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefbfffffffdffe2dbc2b2a469fdfffff9fcfafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafdfeffaf9b5af4f7f5b8b3b2929397eef3f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffefefefefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfefefeffffffffffffd6d6d6848484e7e7e7fcfcfcfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfbfefffffdfffffdfeb0a972dbd3b6fbfffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf7f2f8f9fdae9a59dde0de847f7ed3d4d8f8fdfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffefefefdfdfdfefefefffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefeffffffffffffdfdfdf8c8c8cd4d4d4fcfcfcfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffefffefff9fafefffeffeeedd9a89968faf9ebfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f5f0fdfeffac9857b6b9b7847f7ef8f9fdfbfffffefcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeffffffebebeb949494c1c1c1fcfcfcfefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffefffdfffffffef8fdfcfffefebfb98cd6c49bf6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f6f1fdfeffa692518b8e8cc2bdbcfdfefffbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffefefefdfdfdf7f7f7acacaca1a1a1f8f8f8fffffffffffffffffffdfdfdfffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfbfffffffcfffffffdfff7fffdfff7f4e698985cfff2dcfbfffffffdfffbfefffffff3fffcfff8fefffffcfffffffffffffffefefefdfdfdfffffffefefefffffffefefefffffff7f5edfdffff8d7938868987fffcfbfbfdfefbfffefffefdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffefefebbbbbb878787f5f5f5fffffffcfcfcfefefefffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffffefffdfffffcfefefefffdfffffffbcfcaabbdb488fffffbfafdfbfafbfffffefffffffffafcfdfbfff9fffdfffffffffefefefffffffcfcfcfffffffffffffffffffcfcfcfbf9f1e0e2e3836f2ebdc0befffffefdfffff7fcfafffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffdfdfdfffffffefefeffffffd1d1d1767676efefeffefefefffffffdfdfdfffffffefefefffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfefefefffffbfffcfffcfdfffffffffdf2f49fa165f2e4c8fdfefffffefffcfbfffefdf9fffffcf6fff5fffefffffffffffffffbfbfbfffffffefefefefefefffffffdfdfdf7f5ed8688898b7736f7faf8fffdfcfdfffffbfffefffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffefefefffffffcfcfcffffffe3e3e37b7b7be3e3e3fcfcfcfffffffefefefefefefffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffafffefffffffcfdfcfff9fefcfcfefefffbffd5d9afb4a86efffcfffafcfdfdfffffffefdfffffcfafffffffdfcfdfdfdfffffffdfdfdfffffffffffffffffff7f7f7ffffffc0beb6818384a4904ffdfffefffbfafcfefffafffdfffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffefefefefefeffffffeeeeee979797bcbcbcf9f9f9fbfbfbfffffffffffffffffffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffdfffefffffdfdfffffffbfffbfbfffbfffefffffffab5a973d7d0b7fdfffffffffcfffdfcfbfffefffcfffffffffffffffffffffffffffffffffdfdfdfefefeffffffd4d4d4737169c6c8c9ac9857fdfffefffffefdfffffafffdfdfbfaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffefefefffffffffffff9f9f9c8c8c8828282efefeffffffffffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffefffcfef8fbfffbf9fff9fdfff7fff9ffefe4cea1a063fefbf3fffffefcfdf9fafffffff7fffdfffffffffffffffffdfdfdffffffffffffffffffdcdcdc7f7f7fb1afa7f8fafbad9958fdfffefffdfcfdfffffbfffefffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffefefefefefefdfdfdffffffefefef777777cececefffffffffffffefefefdfdfdfffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfefffffffefffffffefffbfdfffffbfffefffffbfff9fffffeffbcb885d1c6a6fffffbfafffffcfdfffffefffbfffafcfcfcfffffffffffffdfdfdffffffe2e2e28f8f8f969696f9f7effbfdfead9958fcfffdfffffefdfffff5faf8fffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffffffffffffff8f8f89a9a9aa9a9a9f8f8f8fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffcfffffcfffffffbfcfffdfdfffefcfcfffffefbfffffff2e6a4955df3f7e4f0fafffffcfffefffdfffff5fffffffefefefffffffefefeebebeb939393888888fffffff7f5edfdffffad9958fdfffefffcfbfdfffffbfffefffefdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0e0e07d7d7ddadadafefefefffffffefefefffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffffffffefefefffffffefefefffffffffffbfcfbffd0c7a2b8b382fffefffafffffffff9fffffffdfdfdfffefffffeffeeedf185868a919393f5f9f4f9fff9f7f5edfffffcaa9c54fffefffdfdfdfffffef8fff9fffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfc8d8d8d9f9f9ffefefefffffffffffffdfdfdfdfdfdfcfcfcfffffffffffffdfdfdfffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfcfcfcfffffffffffffefefefffffffefefefffffffffff9fffdfffbf8f0a99e65f0ecd9fffafff8fff7fffefffffefffefdffdadada7c7b7da2a1a3edecf0fbfbfffdfcfff7f4f6fffeffa79951fffdfdfffefffffcfff7fffffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdddddd7d7d7dcacacafffffffcfcfcfffffffffffffdfdfdfffffffffffffffffffffffffefefefefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffefefefffffffffff8f8fbfffffeffd7d0afb1a771fffdfffafffefffefffefdffb3b4b27d7f79b1b4abf6f9f0fefef8fffffefffcfef7f5f4fffefeab9f59fffdfffaf8fefffefff6fff7fffff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeb7b7b77c7c7cdededefffffffdfdfdfffffffffffffffffffdfdfdfffffffffffffffffffdfdfdfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffffffffffffffffffffffef9fdfdfffefffbfffffbb3a76ddad6b9fffbffd7dad89a9c9c898a88babbb7fffffcfefdf9fffffefffdfcfffefff3f8e9fffffba49852fffdfffffefffffefffafffefffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefdfdfda2a2a28c8c8ce6e6e6fffffffcfcfcfdfdfdfefefefffffffffffffcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefffffffffffffefefefefefefefefefbfefffffefff8fffcfffdfcece5d2a79e5ec2bdbc8183838f908ee8e8e8fefdfffbf8fffffcfffef9fffffdfffffdfff7f8f4fbfafea8995bfffcfffffffffdfbfafafffffff8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef0f0f0949494818181e6e6e6fefefefffffffdfdfdfefefefffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefdfdfdfffffffffffffbfefffffbfef9fdf7ebf5efe0d7e1897e4c767249cac7c9fffefffcfbfffffefffbfafcfffffefdfffcfbfff7fcfff7f1f8e9fdfffba79d57fffefffbfdfdfffffcf8fff6fffefdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffcfcfcffffffecececa0a0a0717171cececefefefefffffffffffffbfbfbfefefefffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefefefefffffffefefefffffffffffffbfbfbfefcfcfdfeffd3d1c9788484817983b2aa999a9354faf5e6fffbfffffffffefffafdfff9f7fef7fafffefafdfff4f6fff3f2fbfbfdfea7a051fafbf7fdfefffffcfffafffefffefdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffdfdfdf0f0f0bababa808080858585cdcdcdfffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffbfbfbe6e6e6b8b2b37b807e84898ab6b6b6dbe1e6fff9f5ccc594c5bd95fffffffffffcfdfff7fdfffcfbfbffe0d9febaacecb8a6f9956ee86b53a1a69564fffffbfdfffefdf9fffafffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffdfdfdfffffffcfcfcdadadaa9a9a98d8d8d8d8d8da6a6a6bdbdbdddddddf9f9f9fdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffff8f8f8e1e1e1c5c5c5a8a8a89292928989899c9b9fbdb9bededfddfcfffafbfefffffdfffffbe79d965fefebd8faf9fbf4ffffb2b6f08774e86a5aed8265ea6c52ec7d53d6ac97c8a6994ffdfffff9fdfefffffcfbfffbfffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcffffffdededeb2b2b29595958a8a8a8b8b8b979797a4a4a4b1b1b1bcbcbcc5c5c5c6c6c6c7c7c7c8c8c8c3c3c3bababaaeaeaea8a8a89b9b9b8f8f8f8b8b8b959595b1b1b1d1d1d1f8fafafffefffffffffdfffefbfefffdfafffffff6dcd6b3afa67aa487fa6b3be7784fee9e93f3bfaeffc6c0f7e8edfffdfafffefbf6b0a456fafbfff9fefcfffffbfbfffbfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffffffffbfbfbfffffffffffffffffffffffffffffffffffff7f7f7d7d7d7b0b0b09e9e9e8a8a8a8686868181817e7e7e7c7c7c7d7d7d8181818585859595959c9c9cb1b1b1d4d4d4f4f4f4fefefefdfdfdfffffffdfffcfffffffffdfffafafafdfefffefbfffffefffffef5a6a1628062b5c9c3f8f3f0ffeef2fffffffaf9fcfffffff8fdfff1fffff8a89659fdfcfffbfff9fffffefbfefffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffdfdfdfffffffffffffffffffffffffdfdfdfffffffefefefffffffffffffffffffefefefffffffffffffffffff9f9f9f2f2f2f1f1f1efefefedededf2f2f2fafafafefefefffffffffffffffffffffffffffffffffffffffffffafffaf9fbfbfffefffffdfffffffffffefffdfefffdfdffe1ddc5a19658f8ffeff9fefffffefffffffefdfcfffffffcfbfcfffffbffa9955efdfefff9fff7fffcfffbfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffefefefffffffffffffcfcfcfefefefffffffefefefdfdfdfffffffffffffffffffffffffffffffffffffefefefffffffffffffffffffcfcfcfefefefffffffffffffdfdfdfdfffefcfffdfffefffffefefefdf9fffffbfbfffefafefffffeffb1a067d4cba5f7fff8fffefff8fff7fefff7fffefffbfffafffffba99a55fdfffff9fffafffdfffbfffffcfff5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefefffffffdfdfdfdfdfdfffffffefefefffffffffffffdfdfdfdfdfdfffffffffffffffffffefefefffffffffffffffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffefefefdfdfdfefefefffffffefdfffdfffefdfffefffffffffefdfffff7fdfffbfafffffffeffeee4da978538fbf8eafafffff6fffcfdfafffbfffcfdfffbfffff7ab9c57fdfdfff7fdf8fffffcfafffdfffffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfefefefffffffffffffffffffffffffffffffcfcfcfffffffffffffefefefdfdfdfcfcfcfdfdfdfffffffffffffcfcfcfefefefffffffffffffdfdfdfcfcfcfffffffffffffefefefefefefffffffffffffffffffffffffffffffffbfffffffcfafffbfbfefffffdfffffffbfefffafdfffffefff2fffffbbfb17cbdb181fffff9f6fdfafbfffefffff9fdfcfffffbffa9975cfdfdfffbfffbfffefffbfefffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcfffffffffffffdfdfdfdfdfdfffffffffffffffffffffffffefefefffffffffffffefefefffffffffffffefefefefefefffffffffffffdfdfdfdfdfdfffffffffffffefefefefefefffffffffffffefefefdfdfdfefefefffffffefefefffbfffefffbf9fffaf9fdfffefafffffdfffffefffffefffbfffcfff7fff9f2ef96853cf9e6e3fdfffcf8fdfefffffcfcfffbfffffea99956fbfdfdfbfffefff9fffbfcfffdfefaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffffffffbf4f8fdd6c39da89f5ffffffbfafefffdfefffffdfefffdffa89b57fffffefdfffffffcfffafffffffffaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfbfffefffffffcfceea29152dfd9bcfdfafffbfffefffffbfffeffa79b53fffffafcfffdfefafffafffffffefdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefef9fbfcfbfffbfbffffddd3bba4954dfffafcfbfffcfdfffcfdffffa79b53fffff9fffffcfffdfffafffffffdfeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffbfffffafff8fcfcfcfafcffad9b5adaca9cf9fdfefbfffffcfcffa69856fffffbfffffcfffcfef8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfffffffffffdfafafffcf8fcfdebe1d79c8b3afcf8f3fdfcfefffbffa9995efffefffffffefffbfdf6fffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8fffffff8fffffdfcfafff8fffffcfffcffb4aa7ac4b890fdf8effffbffa9975cfefafffffffffffefffafffefffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafffcfff8fffbfffefffff8fdfefffcfdf9f1f1eb938243efeacbfffdf4b09f5cfffcfefbfffffffefffafffefffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfff4fffefffefffffefefffdfff8fffffdfff6d6c58da6a170dfd8bfa9994cfffffefafffffefdfff9fffdfffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefe968b3bd6b89fa79d57fffff7fffff8fafffffffafffafffaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefefefed6caa6958839b09a58fffffcfdfffef9fefdfffbfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8ef90883b998832fffafffbfdfdfdfffbfffdfefffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9eae0c8837d30fffcfffffefffafef8fffbfffbfffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffcfffff2fdfff7fffafdfbfffefcfcfcf8fffcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafff5fffefafdfff8fdfffffff9f8fffcf9fefcfaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfff4faf9fefefefaf9fffffff5fafffbfffdfffdfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfcfafffff7fffafffafefffffffefbfff8fffafffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000050000000701010000000500000001020100000005000000090201000000030000000000} +\par +} diff --git a/writerfilter/qa/cppunittests/rtftok/data/watermark.rtf b/writerfilter/qa/cppunittests/rtftok/data/watermark.rtf new file mode 100644 index 000000000..552f93844 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/data/watermark.rtf @@ -0,0 +1,47 @@ +{\rtf1 +{\header\pard\plain +{\shp +{\*\shpinst\shpleft0\shptop0\shpright9359\shpbottom9359\shpfhdr1\shpbxmargin\shpbxignore\shpbymargin\shpbyignore\shpwr3\shpwrk0\shpfblwtxt1\shpz1\shplid2050 +{\sp +{\sn shapeType} +{\sv 75} +} +{\sp +{\sn pib} +{\sv +{\pict\picscalex914\picscaley914\piccropl0\piccropr0\piccropt0\piccropb0\picw1806\pich1806\picwgoal1024\pichgoal1024\pngblip\bliptag133373369 +89504e470d0a1a0a0000000d49484452000000400000004008040000000060b9550000000467414d410000b18f0bfc6105000000017352474200aece1ce90000 +00206348524d00007a26000080840000fa00000080e8000075300000ea6000003a98000017709cba513c00000002624b47440000aa8d2332000000096f464673 +0000000600000000000c7355d3000000097048597300000dd700000dd70142289b7800000009767041670000004c00000040009d31381b000001cd4944415468 +deedd93d4fc24018c0f17f89c6cdc44940e3e222be2c0e7e0417e3a8113571707632514012a320c6f84d34be2c2ec2b750f40be8e6e4a00113cfe14a5b69b108 +f4589ee71652eefafce0b9f42e3d7063822aaac3f641d173a75d3efee85b6582c0c8749c5eb7332cfb4e6f213d336ed29807304477b1c7a94db80ae9e9c934d0 +fcdd12e7ffcefcc9168f9a0059143b8cb0d2de581f609854073fbecc220f60b18722479d0d14abed8c8cb5d3293ce2949903b0d8a7047cb1c98541008cba840c +a736e1d2200046b967567f740961d3b197008873cf74835002eaac7363100009ca0d4296121675d2dc1a0440d2256428625163ed2f42cf011e8245d621b42c44 +0400485261a699706d1000092fa100d4490713220240dc25e438b1090185880ca09f8ece5c28d9843b009e82471ca25069d5cb785529bd007fdbfb8541b65b2f +531100947a51530d42c1d92f9829818e31ca4ce9421c70e427440e80712a7a89b7c8fb0906003046a5311df31cf501a01f4d0ee1b80f00bd4c398558ee0340ff +0b939a30df17002459f05d330a080a0108400002108000042000010840000210800004200001f8ce0ddf798e30dd7b38e0ce7ea16d2abc25a819cbda225337c7 +f7ff69bf8eef7f0084e08d42bdf8a03e00000025744558746372656174652d6461746500323031302d31322d32305431373a30383a33362b30313a30307ae51b1c00000025744558746d6f646966792d6461746500323031302d31322d32305431373a30383a33372b30313a30308323669c0000000049454e44ae426082} +} +} +{\sp +{\sn pictureContrast} +{\sv 19661} +} +{\sp +{\sn pictureBrightness} +{\sv 22938} +} +{\sp +{\sn posh} +{\sv 2} +} +{\sp +{\sn posv} +{\sv 2} +} +} +} +\par +} +\pard\plain\par +} diff --git a/writerfilter/qa/cppunittests/rtftok/rtfdispatchsymbol.cxx b/writerfilter/qa/cppunittests/rtftok/rtfdispatchsymbol.cxx new file mode 100644 index 000000000..5f4091688 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/rtfdispatchsymbol.cxx @@ -0,0 +1,72 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/style/XStyleFamiliesSupplier.hpp> +#include <com/sun/star/table/BorderLine2.hpp> +#include <com/sun/star/text/XTextDocument.hpp> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/rtftok/rtfdispatchsymbol.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/rtftok/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testPage) +{ + // Given a file with a \page and 2 \par tokens: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "page.rtf"; + + // When loading that file: + getComponent() = loadFromDesktop(aURL); + + // Then make sure we get exactly two paragraphs: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xText(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParagraphs = xText->createEnumeration(); + xParagraphs->nextElement(); + xParagraphs->nextElement(); + // Without the accompanying fix in place, this test would have failed, the document had 3 + // paragraphs, not 2. + CPPUNIT_ASSERT(!xParagraphs->hasMoreElements()); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/rtftok/rtfdispatchvalue.cxx b/writerfilter/qa/cppunittests/rtftok/rtfdispatchvalue.cxx new file mode 100644 index 000000000..4479a0c3c --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/rtfdispatchvalue.cxx @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/style/XStyleFamiliesSupplier.hpp> +#include <com/sun/star/table/BorderLine2.hpp> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/rtftok/rtfdispatchvalue.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/rtftok/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testFollowStyle) +{ + // Given a file with \snext: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "follow-style.rtf"; + + // When loading that file: + getComponent() = loadFromDesktop(aURL); + + // Then make sure we set the follow of the para style correctly: + uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(getComponent(), + uno::UNO_QUERY); + uno::Reference<container::XNameAccess> xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference<container::XNameAccess> xStyleFamily( + xStyleFamilies->getByName("ParagraphStyles"), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xStyle(xStyleFamily->getByName("Heading 1"), + uno::UNO_QUERY); + OUString aFollowStyle; + xStyle->getPropertyValue("FollowStyle") >>= aFollowStyle; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Standard + // - Actual : Heading 1 + // i.e. \snext was ignored. + CPPUNIT_ASSERT_EQUAL(OUString("Standard"), aFollowStyle); +} + +CPPUNIT_TEST_FIXTURE(Test, testNegativePageBorder) +{ + // Given a document with a top margin and a border which has more spacing than the margin: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "negative-page-border.rtf"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that the border distance is negative, so it can appear at the correct + // position: + uno::Reference<style::XStyleFamiliesSupplier> xStyleFamiliesSupplier(getComponent(), + uno::UNO_QUERY); + uno::Reference<container::XNameAccess> xStyleFamilies + = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference<container::XNameAccess> xStyleFamily(xStyleFamilies->getByName("PageStyles"), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xStyle(xStyleFamily->getByName("Standard"), uno::UNO_QUERY); + auto nTopMargin = xStyle->getPropertyValue("TopMargin").get<sal_Int32>(); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(501), nTopMargin); + auto aTopBorder = xStyle->getPropertyValue("TopBorder").get<table::BorderLine2>(); + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt32>(159), aTopBorder.LineWidth); + auto nTopBorderDistance = xStyle->getPropertyValue("TopBorderDistance").get<sal_Int32>(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: -646 + // - Actual : 342 + // i.e. the border negative distance was lost. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(-646), nTopBorderDistance); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/rtftok/rtfdocumentimpl.cxx b/writerfilter/qa/cppunittests/rtftok/rtfdocumentimpl.cxx new file mode 100644 index 000000000..f33f0f0e5 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/rtfdocumentimpl.cxx @@ -0,0 +1,149 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/graphic/XGraphic.hpp> +#include <com/sun/star/text/XTextTablesSupplier.hpp> +#include <com/sun/star/text/XTextTable.hpp> +#include <com/sun/star/text/XTextDocument.hpp> + +#include <vcl/graph.hxx> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/rtftok/rtfdocumentimpl.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/rtftok/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testPicwPich) +{ + // Given a document with a WMF file where picwgoal and picscalex is provided, so picw is not + // relevant: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "picw-pich.rtf"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure the graphic's preferred size is correct: + uno::Reference<drawing::XDrawPageSupplier> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xTextDocument->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference<graphic::XGraphic> xGraphic; + xShape->getPropertyValue("Graphic") >>= xGraphic; + Graphic aGraphic(xGraphic); + Size aPrefSize = aGraphic.GetPrefSize(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2619 + // - Actual : 132 + // i.e. the graphic width didn't match 2.62 cm from the Word UI. + CPPUNIT_ASSERT_EQUAL(static_cast<tools::Long>(2619), aPrefSize.Width()); +} + +CPPUNIT_TEST_FIXTURE(Test, testCharHiddenInTable) +{ + // Given a document with a table, and a hidden \line in it: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "char-hidden-intbl.rtf"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that line is indeed hidden: + uno::Reference<text::XTextTablesSupplier> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xTables(xTextDocument->getTextTables(), uno::UNO_QUERY); + uno::Reference<text::XTextTable> xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xCell(xTable->getCellByName("B1"), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParagraphs = xCell->createEnumeration(); + uno::Reference<container::XEnumerationAccess> xParagraph(xParagraphs->nextElement(), + uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xPortions = xParagraph->createEnumeration(); + uno::Reference<beans::XPropertySet> xPortion(xPortions->nextElement(), uno::UNO_QUERY); + bool bCharHidden{}; + xPortion->getPropertyValue("CharHidden") >>= bCharHidden; + // Without the accompanying fix in place, this test would have failed, the newline was not + // hidden. + CPPUNIT_ASSERT(bCharHidden); +} + +CPPUNIT_TEST_FIXTURE(Test, testDuplicatedImage) +{ + // Given a document with 2 images: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "duplicated-image.rtf"; + + // When importing that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure no duplicated images are created: + uno::Reference<drawing::XDrawPageSupplier> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xTextDocument->getDrawPage(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 3 + // i.e. there was a 3rd, duplicated image. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2), xDrawPage->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testOldParaNumLeftMargin) +{ + // Given a document with 3 paragraphs, the third one with a left indent: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "old-para-num-left-margin.rtf"; + + // When importing that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure that the third paragraph has a left indent: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xText(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParagraphs = xText->createEnumeration(); + xParagraphs->nextElement(); + xParagraphs->nextElement(); + uno::Reference<beans::XPropertySet> xParagraph(xParagraphs->nextElement(), uno::UNO_QUERY); + sal_Int32 nParaLeftMargin{}; + xParagraph->getPropertyValue("ParaLeftMargin") >>= nParaLeftMargin; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2101 + // - Actual : 0 + // i.e. the left indent was 0, not 1191 twips (from the file) in mm100. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(2101), nParaLeftMargin); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/rtftok/rtfsdrimport.cxx b/writerfilter/qa/cppunittests/rtftok/rtfsdrimport.cxx new file mode 100644 index 000000000..74af1dcf1 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/rtfsdrimport.cxx @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <com/sun/star/drawing/ColorMode.hpp> +#include <com/sun/star/text/TextContentAnchorType.hpp> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/rtftok/rtfsdrimport.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/rtftok/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testPictureInTextframe) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "picture-in-textframe.rtf"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<drawing::XDrawPageSupplier> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xTextDocument->getDrawPage(); + uno::Reference<beans::XPropertySet> xInnerShape(xDrawPage->getByIndex(1), uno::UNO_QUERY); + text::TextContentAnchorType eAnchorType = text::TextContentAnchorType_AT_PARAGRAPH; + xInnerShape->getPropertyValue("AnchorType") >>= eAnchorType; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 4 + // i.e. the properties of the inner shape (including its anchor type and bitmap fill) were lost + // on import. + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER, eAnchorType); +} + +CPPUNIT_TEST_FIXTURE(Test, testWatermark) +{ + // Given a document with a picture watermark, and the "washout" checkbox is ticked on the Word + // UI: + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "watermark.rtf"; + + // When loading that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure the watermark effect is not lost on import: + uno::Reference<drawing::XDrawPageSupplier> xDrawPagesSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPagesSupplier->getDrawPage(); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + drawing::ColorMode eMode{}; + xShape->getPropertyValue("GraphicColorMode") >>= eMode; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 3 + // - Actual : 0 + // i.e. the color mode was STANDARD, not WATERMARK. + CPPUNIT_ASSERT_EQUAL(drawing::ColorMode_WATERMARK, eMode); +} +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/rtftok/rtfsprm.cxx b/writerfilter/qa/cppunittests/rtftok/rtfsprm.cxx new file mode 100644 index 000000000..abb0a19f4 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/rtfsprm.cxx @@ -0,0 +1,83 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/XPropertyState.hpp> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/text/XTextDocument.hpp> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/rtftok/rtfsprm.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/rtftok/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testLeftMarginDedup) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "left-margin-dedup.rtf"; + getComponent() = loadFromDesktop(aURL); + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + uno::Reference<container::XEnumerationAccess> xText(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference<container::XEnumeration> xParagraphs = xText->createEnumeration(); + uno::Reference<beans::XPropertySet> xParagraph(xParagraphs->nextElement(), uno::UNO_QUERY); + sal_Int32 nLeftMargin = 0; + xParagraph->getPropertyValue("ParaLeftMargin") >>= nLeftMargin; + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), nLeftMargin); + + uno::Reference<beans::XPropertyState> xParagraphState(xParagraph, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DIRECT_VALUE, + xParagraphState->getPropertyState("ParaLeftMargin")); + + xParagraph.set(xParagraphs->nextElement(), uno::UNO_QUERY); + nLeftMargin = 0; + xParagraph->getPropertyValue("ParaLeftMargin") >>= nLeftMargin; + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), nLeftMargin); + + xParagraphState.set(xParagraph, uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 (DIRECT_VALUE) + // - Actual : 1 (DEFAULT_VALUE) + // i.e. the left margin was not a direct formatting, which means left margin from the numbering + // was used instead. + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DIRECT_VALUE, + xParagraphState->getPropertyState("ParaLeftMargin")); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/cppunittests/rtftok/rtftokenizer.cxx b/writerfilter/qa/cppunittests/rtftok/rtftokenizer.cxx new file mode 100644 index 000000000..530e9bb72 --- /dev/null +++ b/writerfilter/qa/cppunittests/rtftok/rtftokenizer.cxx @@ -0,0 +1,63 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <test/bootstrapfixture.hxx> +#include <unotest/macros_test.hxx> + +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/text/XTextDocument.hpp> + +using namespace ::com::sun::star; + +namespace +{ +/// Tests for writerfilter/source/rtftok/rtftokenizer.cxx. +class Test : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference<lang::XComponent> mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference<lang::XComponent>& getComponent() { return mxComponent; } +}; + +void Test::setUp() +{ + test::BootstrapFixture::setUp(); + + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void Test::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +constexpr OUStringLiteral DATA_DIRECTORY = u"/writerfilter/qa/cppunittests/rtftok/data/"; + +CPPUNIT_TEST_FIXTURE(Test, testInvalidHex) +{ + // Given a document with a markup like "\'3?": + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "invalid-hex.rtf"; + + // When load that document: + getComponent() = loadFromDesktop(aURL); + + // Then make sure the result matches Word, rather than just refusing to import the document: + uno::Reference<text::XTextDocument> xTextDocument(getComponent(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString::fromUtf8("xřx"), xTextDocument->getText()->getString()); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/qa/ooxml/watch-generated-code.sh b/writerfilter/qa/ooxml/watch-generated-code.sh new file mode 100755 index 000000000..d7026be82 --- /dev/null +++ b/writerfilter/qa/ooxml/watch-generated-code.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +if [ ! -e bin/get_config_variables ]; then + cd ../../.. +fi + +. bin/get_config_variables SRCDIR + +if [ "$PWD" != "$SRCDIR" ]; then + echo "error: not in the expected SRCDIR" + exit 1 +fi + +cd writerfilter +echo 'include Makefile' > watch.mk +echo 'watch:' >> watch.mk +echo $'\techo $(writerfilter_ALL)' >> watch.mk +mydir=workdir/CustomTarget/writerfilter +writerfilter_ALL=$(make -sr -f watch.mk watch|sed "s|$SRCDIR/$mydir/||g") +rm watch.mk +cd - >/dev/null + +case $1 in +reference) + rm -rf $mydir-reference + mkdir -p $mydir-reference/source/ooxml + for i in $writerfilter_ALL + do + cp $mydir/"$i" $mydir-reference/"$i" + done + ;; +compare) + for i in $writerfilter_ALL + do + if [ "$(basename "$i")" == "model_preprocessed.xml" ]; then + continue + fi + diff -u $mydir-reference/"$i" $mydir/"$i" + done + ;; +*) + echo "usage: $0 [ reference | compare ]" + echo + echo "$0 first saves a reference output of all generated files by writerfilter, then" + echo "allows comparing against it. This helps seeing the effect of changes made on" + echo "the code generator scripts." + ;; +esac + +# vi:set shiftwidth=4 expandtab: |