From 0f8591bfd4f92de2420c74f6f702eff1d840b0f2 Mon Sep 17 00:00:00 2001 From: CVS To Bazaar Migration Date: Fri, 11 May 2007 19:59:40 +0000 Subject: [PATCH 01/21] This commit was manufactured by cvs2bzr to create the 'TESTOPIA_1_2' tag. Cherrypick from TESTOPIA_1_2_BUGZILLA-222 2007-05-11 19:59:39 UTC CVS To Bazaar Migration 'This commit was manufactured by cvs2bzr to create the': tr_import_environment.cgi testopia/img/selected_value.png template/en/default/testopia/case/choose.html.tmpl template/en/default/testopia/plan/show.csv.tmpl template/en/default/testopia/run/list.html.tmpl testopia/img/1x1.gif template/en/default/testopia/environment/show.html.tmpl template/en/default/testopia/plan/history.html.tmpl template/en/default/testopia/caserun/list.html.tmpl Bugzilla/WebService.pm template/en/default/testopia/admin/plantypes/edit.html.tmpl testopia/scripts/create_testscript.sh .project template/en/default/testopia/tag/table.html.tmpl template/en/default/testopia/tag/list.html.tmpl template/en/default/testopia/reports/bug-stats-form.html.tmpl template/en/default/testopia/style.none.tmpl template/en/default/testopia/case/list.csv.tmpl testopia/img/BLOCKED.gif template/en/default/testopia/plan/list-product.html.tmpl Bugzilla/WebService/Testopia/TestCaseRun.pm testopia/scripts/cvs_update.sh Bugzilla/Config/Testopia.pm template/en/default/hook/global/useful-links.html.tmpl/end/tr.html.tmpl testopia/img/square.gif template/en/default/testopia/admin/plantypes/show.html.tmpl testopia/img/BLOCKED_small.gif testopia/scripts/fail_id.sh template/en/default/testopia/case/filter.html.tmpl tr_importxml.pl template/en/default/testopia/case/list.html.tmpl template/en/default/testopia/reports/header.html.tmpl template/en/default/testopia/environment/table.html.tmpl testopia/img/testopia_logo_128.png testopia/img/error.gif testopia/img/BLOCKED_gray.gif template/en/default/testopia/tag/show.html.tmpl template/en/default/testopia/plan/list.html.tmpl testopia/img/square.png template/en/default/testopia/run/navigate.html.tmpl Bugzilla/Testopia/Table.pm template/en/default/testopia/attachment/choose.html.tmpl template/en/default/testopia/caserun/short-form-header.html.tmpl Bugzilla/Testopia/Classification.pm testopia/img/Testopia_pocket.eps template/en/default/testopia/run/regression.html.tmpl tr_admin.cgi testopia/img/folder.gif template/en/default/testopia/environment/admin/category.html.tmpl template/en/default/hook/global/user-error.html.tmpl/errors/tr-user-error.html.tmpl template/en/default/testopia/reports/log.html.tmpl template/en/default/testopia/attachment/delete.html.tmpl tr_show_plan.cgi Bugzilla/Testopia/Xml.pm testopia/scripts/readme.txt template/en/default/testopia/caserun/short-form.html.tmpl template/en/default/testopia/environment/admin/element.html.tmpl testopia/img/folder_blue.gif template/en/default/testopia/case/form.html.tmpl template/en/default/testopia/run/show.html.tmpl testopia/img/td.gif testopia/scripts/regression_test.sh template/en/default/testopia/plan/navigate.html.tmpl template/en/default/testopia/environment/admin/property.html.tmpl Bugzilla/WebService/Testopia/TestRun.pm template/en/default/testopia/attachment/show.html.tmpl tr_list_environments.cgi testopia/img/folder_red.gif template/en/default/testopia/plan/show.html.tmpl template/en/default/testopia/reports/report-bar.png.tmpl testopia/img/RUNNING_gray.gif Bugzilla/Testopia/XmlReferences.pm testopia/img/FAILED.gif template/en/default/testopia/environment/admin/show.html.tmpl testopia/img/testopia_big_picture.png template/en/default/hook/index.html.tmpl/links/tr.html.tmpl template/en/default/testopia/build/form.html.tmpl template/en/default/testopia/attachment/table.html.tmpl template/en/default/testopia/case/navigate.html.tmpl testopia/css/print.css template/en/default/testopia/reports/report-line.png.tmpl testopia/README testopia/img/aw.gif tr_builds.cgi template/en/default/testopia/environment/admin/tree.html.tmpl Bugzilla/Testopia/XmlTestCase.pm testopia/img/FAILED_gray.gif template/en/default/testopia/build/delete.html.tmpl template/en/default/testopia/caserun/table.html.tmpl testopia/img/testopia_city_128.png template/en/default/testopia/case/buglist-to-case-add.html.tmpl template/en/default/testopia/reports/report-pie.png.tmpl template/en/default/testopia/case/clone.html.tmpl testopia/img/green_bar.gif template/en/default/testopia/environment/admin/valid_exp.html.tmpl tr_show_environment.cgi testopia/environment.dtd template/en/default/testopia/run/table.html.tmpl template/en/default/hook/list/list.html.tmpl/links/tr.html.tmpl testopia/img/awg.gif template/en/default/testopia/plan/choose.html.tmpl template/en/default/testopia/case/show.csv.tmpl tr_attachment.cgi testopia/img/FAILED_small.gif template/en/default/testopia/reports/report-table.html.tmpl template/en/default/testopia/category/delete.html.tmpl testopia/img/testopia_city_256.png testopia/doc/Manual.odt template/en/default/testopia/run/tabs.html.tmpl template/en/default/testopia/build/list.html.tmpl tr_case_reports.cgi template/en/default/testopia/blocks.html.tmpl template/en/default/testopia/reports/report.csv.tmpl testopia/img/IDLE.gif template/en/default/testopia/export/csv.caseheader.tmpl testopia/img/testopia_city_512.png template/en/default/testopia/saved-search.html.tmpl testopia/css/default.css template/en/default/testopia/search/advanced.html.tmpl template/en/default/hook/global/banner.html.tmpl/version/testopia.html.tmpl testopia/doc/Manual.pdf template/en/default/testopia/category/list.html.tmpl template/en/default/testopia/reports/report.html.tmpl testopia/img/circle.gif template/en/default/testopia/export/csv.case.tmpl template/en/default/testopia/case/add.html.tmpl template/en/default/testopia/export/xml.case.tmpl testopia/img/env_lookup.png testopia/img/IDLE_gray.gif template/en/default/admin/params/testopia.html.tmpl template/en/default/testopia/messages.html.tmpl Bugzilla/Testopia/Constants.pm template/en/default/testopia/plan/show.print.tmpl testopia/ChangeLog template/en/default/hook/bug/create/create.html.tmpl/end/tr.html.tmpl testopia/img/circle.png template/en/default/testopia/export/xml.footer.tmpl tr_caserun_reports.cgi template/en/default/testopia/environment/add.html.tmpl testopia/doc/Manual.rtf template/en/default/testopia/search/case.html.tmpl template/en/default/testopia/percent_bar.html.tmpl template/en/default/testopia/reports/test-burnout-form.html.tmpl template/en/default/testopia/case/show.xml.tmpl template/en/default/testopia/case/list.xml.tmpl testopia/img/IDLE_small.gif testopia/img/testopia_logo_256.png testopia/img/orange_bar.gif template/en/default/testopia/plan/show.xml.tmpl testopia/css/report.css testopia/img/city.eps template/en/default/testopia/case/show.print.tmpl template/en/default/testopia/export/xml.header.tmpl template/en/default/testopia/case/buglist-to-case-entry.html.tmpl template/en/default/testopia/plan/table.html.tmpl template/en/default/testopia/progress.html.tmpl tr_list_plans.cgi template/en/default/testopia/reports/bug-severity-status-form.html.tmpl tr_categories.cgi Bugzilla/Testopia/Environment/Xml.pm testopia/img/RUNNING_small.gif template/en/default/testopia/environment/choose.html.tmpl template/en/default/testopia/case/show.html.tmpl testopia/img/pb.gif testopia/scripts/trenv.sh testopia/doc/Manual.xhtml testopia/img/PASSED.gif template/en/default/testopia/case/bugs.html.tmpl testopia/img/confirm.png template/en/default/testopia/search/caserun.html.tmpl testopia.dtd template/en/default/hook/bug/create/create.html.tmpl/form/tr.html.tmpl template/en/default/testopia/quicksearch.html.tmpl template/en/default/testopia/case/table.html.tmpl template/en/default/testopia/run/add.html.tmpl Bugzilla/WebService/Constants.pm template/en/default/testopia/environment/delete.html.tmpl tr_admin_environment.cgi template/en/default/testopia/category/form.html.tmpl testopia/img/pg.gif Bugzilla/WebService/User.pm testopia/img/PASSED_gray.gif testopia/img/triangle.gif testopia/doc/Testopia.dia tr_query.cgi template/en/default/testopia/search/environment.html.tmpl template/en/default/hook/bug/create/created.html.tmpl/message/tr.html.tmpl template/en/default/testopia/caserun/navigate.html.tmpl tr_csv2xml.pl testopia/js/tags.js Bugzilla/Testopia/Product.pm Bugzilla/WebService/Testopia/Build.pm tr_case_dependencies.cgi template/en/default/testopia/run/choose.html.tmpl testopia/img/triangle.png testopia/tools/readme template/en/default/testopia/environment/export.xml.tmpl testopia/img/PASSED_small.gif template/en/default/testopia/caserun/show.html.tmpl template/en/default/testopia/search/plan.html.tmpl template/en/default/testopia/reports/bug-count.html.tmpl testopia/doc/training.odp template/en/default/testopia/caserun/case-history.html.tmpl testopia/scripts/note_id.sh template/en/default/testopia/case/delete-list.html.tmpl template/en/default/testopia/admin/show.html.tmpl template/en/default/hook/bug/knob.html.tmpl/links/tr.html.tmpl tr_xmlrpc.cgi testopia/img/csv.png template/en/default/testopia/case/delete.html.tmpl testopia/js/caserun.js template/en/default/testopia/environment/form.html.tmpl testopia/img/lk.gif template/en/default/testopia/run/clone.html.tmpl testopia/img/red_bar.gif testopia/img/PAUSED.gif testopia/img/del.gif tr_quicksearch.cgi template/en/default/testopia/text.png.tmpl testopia/img/xml.png testopia/img/tr.gif template/en/default/testopia/caserun/delete.html.tmpl template/en/default/testopia/search/report-matrix.html.tmpl template/en/default/testopia/admin/access-list.html.tmpl Bugzilla/Testopia/Report.pm testopia/js/DocumentManager.js testopia/img/confirm.svg testopia/img/snew.gif testopia/img/del.xcf template/en/default/hook/bug/process/results.html.tmpl/links/tr.html.tmpl template/en/default/testopia/run/delete.html.tmpl testopia/img/PAUSED_gray.gif template/en/default/testopia/environment/import.xml.tmpl template/en/default/testopia/plan/delete.html.tmpl testopia/js/util.js template/en/default/testopia/caserun/filter.html.tmpl template/en/default/testopia/run/form.html.tmpl Bugzilla/Testopia/Util.pm template/en/default/testopia/search/run.html.tmpl Bugzilla/WebService/Testopia/Product.pm template/en/default/testopia/reports/incident.html.tmpl tr_export_environment.cgi Bugzilla/WebService/Testopia/Environment.pm template/en/default/testopia/plan/clone.html.tmpl testopia/dojo/DOJO_INSTALL_HELP Bugzilla/WebService/Component.pm testopia/img/RUNNING.gif testopia/img/env_lookup.svg template/en/default/testopia/environment/list.html.tmpl testopia/img/PAUSED_small.gif template/en/default/testopia/admin/plantypes/add.html.tmpl tr_run_reports.cgi template/en/default/testopia/caserun/form.html.tmpl testopia/img/saw.gif template/en/default/testopia/plan/form.html.tmpl template/en/default/testopia/reports/build-coverage.html.tmpl template/en/default/testopia/run/history.html.tmpl Bugzilla/WebService/Testopia/TestCase.pm template/en/default/testopia/search/variables.none.tmpl tr_new_environment.cgi template/en/default/testopia/case/unlink.html.tmpl Bugzilla/WebService/Testopia/TestPlan.pm template/en/default/testopia/plan/add.html.tmpl template/en/default/testopia/admin/plantypes/delete.html.tmpl testopia/scripts/pass_id.sh template/en/default/testopia/case/history.html.tmpl Cherrypick from trunk 2007-03-28 22:17:17 UTC Gregary Hendricks 'Cloning a plan gets too many test cases.': Bugzilla/Testopia/Build.pm testopia/patch-2.22.1 tr_plan_access.cgi tr_tags.cgi tr_show_case.cgi Bugzilla/Testopia/TestTag.pm tr_install.pl tr_new_plan.cgi Bugzilla/Testopia/Environment/Property.pm testopia/patch-2.22.2 testopia/testopia.insert.sql tr_plan_reports.cgi tr_new_case.cgi Bugzilla/Testopia/Environment.pm tr_list_cases.cgi Bugzilla/Testopia/Category.pm Bugzilla/Testopia/TestPlan.pm tr_show_run.cgi Bugzilla/Testopia/TestRun.pm Bugzilla/Testopia/Attachment.pm tr_new_run.cgi Bugzilla/Testopia/Search.pm Bugzilla/Testopia/Environment/Category.pm tr_list_caseruns.cgi Bugzilla/Testopia/TestCaseRun.pm tr_draw.cgi testopia/patch-2.22 tr_list_runs.cgi tr_show_caserun.cgi Bugzilla/Testopia/Environment/Element.pm Bugzilla/Testopia/TestCase.pm --- .project | 17 + Bugzilla/Config/Testopia.pm | 147 ++ Bugzilla/Testopia/Attachment.pm | 595 ++++++ Bugzilla/Testopia/Build.pm | 292 +++ Bugzilla/Testopia/Category.pm | 275 +++ Bugzilla/Testopia/Classification.pm | 85 + Bugzilla/Testopia/Constants.pm | 153 ++ Bugzilla/Testopia/Environment.pm | 793 +++++++ Bugzilla/Testopia/Environment/Category.pm | 559 +++++ Bugzilla/Testopia/Environment/Element.pm | 520 +++++ Bugzilla/Testopia/Environment/Property.pm | 398 ++++ Bugzilla/Testopia/Environment/Xml.pm | 585 ++++++ Bugzilla/Testopia/Product.pm | 218 ++ Bugzilla/Testopia/Report.pm | 368 ++++ Bugzilla/Testopia/Search.pm | 1366 ++++++++++++ Bugzilla/Testopia/Table.pm | 484 +++++ Bugzilla/Testopia/TestCase.pm | 1825 +++++++++++++++++ Bugzilla/Testopia/TestCaseRun.pm | 1085 ++++++++++ Bugzilla/Testopia/TestPlan.pm | 1341 ++++++++++++ Bugzilla/Testopia/TestRun.pm | 1286 ++++++++++++ Bugzilla/Testopia/TestTag.pm | 340 +++ Bugzilla/Testopia/Util.pm | 183 ++ Bugzilla/Testopia/Xml.pm | 676 ++++++ Bugzilla/Testopia/XmlReferences.pm | 101 + Bugzilla/Testopia/XmlTestCase.pm | 409 ++++ Bugzilla/WebService.pm | 98 + Bugzilla/WebService/Component.pm | 41 + Bugzilla/WebService/Constants.pm | 36 + Bugzilla/WebService/Testopia/Build.pm | 154 ++ Bugzilla/WebService/Testopia/Environment.pm | 171 ++ Bugzilla/WebService/Testopia/Product.pm | 83 + Bugzilla/WebService/Testopia/TestCase.pm | 617 ++++++ Bugzilla/WebService/Testopia/TestCaseRun.pm | 226 ++ Bugzilla/WebService/Testopia/TestPlan.pm | 432 ++++ Bugzilla/WebService/Testopia/TestRun.pm | 372 ++++ Bugzilla/WebService/User.pm | 58 + .../default/admin/params/testopia.html.tmpl | 81 + .../create/create.html.tmpl/end/tr.html.tmpl | 5 + .../create/create.html.tmpl/form/tr.html.tmpl | 5 + .../created.html.tmpl/message/tr.html.tmpl | 5 + .../bug/knob.html.tmpl/links/tr.html.tmpl | 6 + .../results.html.tmpl/links/tr.html.tmpl | 6 + .../version/testopia.html.tmpl | 2 + .../useful-links.html.tmpl/end/tr.html.tmpl | 74 + .../errors/tr-user-error.html.tmpl | 137 ++ .../hook/index.html.tmpl/links/tr.html.tmpl | 31 + .../list/list.html.tmpl/links/tr.html.tmpl | 3 + .../testopia/admin/access-list.html.tmpl | 130 ++ .../testopia/admin/plantypes/add.html.tmpl | 41 + .../testopia/admin/plantypes/delete.html.tmpl | 23 + .../testopia/admin/plantypes/edit.html.tmpl | 42 + .../testopia/admin/plantypes/show.html.tmpl | 41 + .../en/default/testopia/admin/show.html.tmpl | 44 + .../testopia/attachment/choose.html.tmpl | 38 + .../testopia/attachment/delete.html.tmpl | 63 + .../testopia/attachment/show.html.tmpl | 114 + .../testopia/attachment/table.html.tmpl | 63 + template/en/default/testopia/blocks.html.tmpl | 148 ++ .../default/testopia/build/delete.html.tmpl | 0 .../en/default/testopia/build/form.html.tmpl | 63 + .../en/default/testopia/build/list.html.tmpl | 56 + .../en/default/testopia/case/add.html.tmpl | 107 + .../case/buglist-to-case-add.html.tmpl | 56 + .../case/buglist-to-case-entry.html.tmpl | 66 + .../en/default/testopia/case/bugs.html.tmpl | 48 + .../en/default/testopia/case/choose.html.tmpl | 37 + .../en/default/testopia/case/clone.html.tmpl | 123 ++ .../testopia/case/delete-list.html.tmpl | 60 + .../en/default/testopia/case/delete.html.tmpl | 68 + .../en/default/testopia/case/filter.html.tmpl | 91 + .../en/default/testopia/case/form.html.tmpl | 233 +++ .../default/testopia/case/history.html.tmpl | 128 ++ .../en/default/testopia/case/list.csv.tmpl | 33 + .../en/default/testopia/case/list.html.tmpl | 227 ++ .../en/default/testopia/case/list.xml.tmpl | 29 + .../default/testopia/case/navigate.html.tmpl | 67 + .../en/default/testopia/case/show.csv.tmpl | 32 + .../en/default/testopia/case/show.html.tmpl | 343 ++++ .../en/default/testopia/case/show.print.tmpl | 97 + .../en/default/testopia/case/show.xml.tmpl | 26 + .../en/default/testopia/case/table.html.tmpl | 144 ++ .../en/default/testopia/case/unlink.html.tmpl | 48 + .../testopia/caserun/case-history.html.tmpl | 88 + .../default/testopia/caserun/delete.html.tmpl | 74 + .../default/testopia/caserun/filter.html.tmpl | 169 ++ .../default/testopia/caserun/form.html.tmpl | 185 ++ .../default/testopia/caserun/list.html.tmpl | 87 + .../testopia/caserun/navigate.html.tmpl | 67 + .../caserun/short-form-header.html.tmpl | 87 + .../testopia/caserun/short-form.html.tmpl | 143 ++ .../default/testopia/caserun/show.html.tmpl | 160 ++ .../default/testopia/caserun/table.html.tmpl | 80 + .../testopia/category/delete.html.tmpl | 43 + .../default/testopia/category/form.html.tmpl | 53 + .../default/testopia/category/list.html.tmpl | 52 + .../testopia/environment/add.html.tmpl | 86 + .../environment/admin/category.html.tmpl | 50 + .../environment/admin/element.html.tmpl | 122 ++ .../environment/admin/property.html.tmpl | 51 + .../testopia/environment/admin/show.html.tmpl | 74 + .../testopia/environment/admin/tree.html.tmpl | 464 +++++ .../environment/admin/valid_exp.html.tmpl | 69 + .../testopia/environment/choose.html.tmpl | 38 + .../testopia/environment/delete.html.tmpl | 60 + .../testopia/environment/export.xml.tmpl | 45 + .../testopia/environment/form.html.tmpl | 96 + .../testopia/environment/import.xml.tmpl | 57 + .../testopia/environment/list.html.tmpl | 49 + .../testopia/environment/show.html.tmpl | 243 +++ .../testopia/environment/table.html.tmpl | 57 + .../en/default/testopia/export/csv.case.tmpl | 87 + .../testopia/export/csv.caseheader.tmpl | 37 + .../en/default/testopia/export/xml.case.tmpl | 77 + .../default/testopia/export/xml.footer.tmpl | 23 + .../default/testopia/export/xml.header.tmpl | 28 + .../en/default/testopia/messages.html.tmpl | 50 + .../en/default/testopia/percent_bar.html.tmpl | 44 + .../en/default/testopia/plan/add.html.tmpl | 53 + .../en/default/testopia/plan/choose.html.tmpl | 51 + .../en/default/testopia/plan/clone.html.tmpl | 149 ++ .../en/default/testopia/plan/delete.html.tmpl | 63 + .../en/default/testopia/plan/form.html.tmpl | 88 + .../default/testopia/plan/history.html.tmpl | 115 ++ .../testopia/plan/list-product.html.tmpl | 76 + .../en/default/testopia/plan/list.html.tmpl | 123 ++ .../default/testopia/plan/navigate.html.tmpl | 67 + .../en/default/testopia/plan/show.csv.tmpl | 33 + .../en/default/testopia/plan/show.html.tmpl | 287 +++ .../en/default/testopia/plan/show.print.tmpl | 145 ++ .../en/default/testopia/plan/show.xml.tmpl | 31 + .../en/default/testopia/plan/table.html.tmpl | 80 + .../en/default/testopia/progress.html.tmpl | 45 + .../en/default/testopia/quicksearch.html.tmpl | 122 ++ .../testopia/reports/bug-count.html.tmpl | 47 + .../bug-severity-status-form.html.tmpl | 126 ++ .../testopia/reports/bug-stats-form.html.tmpl | 134 ++ .../testopia/reports/build-coverage.html.tmpl | 103 + .../default/testopia/reports/header.html.tmpl | 68 + .../testopia/reports/incident.html.tmpl | 124 ++ .../en/default/testopia/reports/log.html.tmpl | 121 ++ .../testopia/reports/report-bar.png.tmpl | 58 + .../testopia/reports/report-line.png.tmpl | 52 + .../testopia/reports/report-pie.png.tmpl | 34 + .../testopia/reports/report-table.html.tmpl | 161 ++ .../default/testopia/reports/report.csv.tmpl | 90 + .../default/testopia/reports/report.html.tmpl | 177 ++ .../reports/test-burnout-form.html.tmpl | 125 ++ .../en/default/testopia/run/add.html.tmpl | 69 + .../en/default/testopia/run/choose.html.tmpl | 37 + .../en/default/testopia/run/clone.html.tmpl | 124 ++ .../en/default/testopia/run/delete.html.tmpl | 60 + .../en/default/testopia/run/form.html.tmpl | 124 ++ .../en/default/testopia/run/history.html.tmpl | 67 + .../en/default/testopia/run/list.html.tmpl | 133 ++ .../default/testopia/run/navigate.html.tmpl | 67 + .../default/testopia/run/regression.html.tmpl | 151 ++ .../en/default/testopia/run/show.html.tmpl | 315 +++ .../en/default/testopia/run/table.html.tmpl | 86 + .../en/default/testopia/run/tabs.html.tmpl | 52 + .../default/testopia/saved-search.html.tmpl | 32 + .../testopia/search/advanced.html.tmpl | 121 ++ .../en/default/testopia/search/case.html.tmpl | 228 ++ .../default/testopia/search/caserun.html.tmpl | 238 +++ .../testopia/search/environment.html.tmpl | 411 ++++ .../en/default/testopia/search/plan.html.tmpl | 139 ++ .../testopia/search/report-matrix.html.tmpl | 64 + .../en/default/testopia/search/run.html.tmpl | 182 ++ .../testopia/search/variables.none.tmpl | 48 + template/en/default/testopia/style.none.tmpl | 45 + .../en/default/testopia/tag/list.html.tmpl | 66 + .../en/default/testopia/tag/show.html.tmpl | 115 ++ .../en/default/testopia/tag/table.html.tmpl | 63 + template/en/default/testopia/text.png.tmpl | 17 + testopia.dtd | 92 + testopia/ChangeLog | 330 +++ testopia/README | 96 + testopia/css/default.css | 181 ++ testopia/css/print.css | 33 + testopia/css/report.css | 97 + testopia/doc/Manual.odt | Bin 0 -> 144627 bytes testopia/doc/Manual.pdf | Bin 0 -> 384291 bytes testopia/doc/Manual.rtf | 1588 ++++++++++++++ testopia/doc/Manual.xhtml | 135 ++ testopia/doc/Testopia.dia | Bin 0 -> 2875 bytes testopia/doc/training.odp | Bin 0 -> 304596 bytes testopia/dojo/DOJO_INSTALL_HELP | 12 + testopia/environment.dtd | 15 + testopia/img/1x1.gif | Bin 0 -> 123 bytes testopia/img/BLOCKED.gif | Bin 0 -> 538 bytes testopia/img/BLOCKED_gray.gif | Bin 0 -> 353 bytes testopia/img/BLOCKED_small.gif | Bin 0 -> 350 bytes testopia/img/FAILED.gif | Bin 0 -> 794 bytes testopia/img/FAILED_gray.gif | Bin 0 -> 390 bytes testopia/img/FAILED_small.gif | Bin 0 -> 361 bytes testopia/img/IDLE.gif | Bin 0 -> 570 bytes testopia/img/IDLE_gray.gif | Bin 0 -> 409 bytes testopia/img/IDLE_small.gif | Bin 0 -> 371 bytes testopia/img/PASSED.gif | Bin 0 -> 591 bytes testopia/img/PASSED_gray.gif | Bin 0 -> 394 bytes testopia/img/PASSED_small.gif | Bin 0 -> 376 bytes testopia/img/PAUSED.gif | Bin 0 -> 750 bytes testopia/img/PAUSED_gray.gif | Bin 0 -> 400 bytes testopia/img/PAUSED_small.gif | Bin 0 -> 370 bytes testopia/img/RUNNING.gif | Bin 0 -> 804 bytes testopia/img/RUNNING_gray.gif | Bin 0 -> 541 bytes testopia/img/RUNNING_small.gif | Bin 0 -> 376 bytes testopia/img/Testopia_pocket.eps | 59 + testopia/img/aw.gif | Bin 0 -> 771 bytes testopia/img/awg.gif | Bin 0 -> 377 bytes testopia/img/circle.gif | Bin 0 -> 342 bytes testopia/img/circle.png | Bin 0 -> 29717 bytes testopia/img/city.eps | 64 + testopia/img/confirm.png | Bin 0 -> 353 bytes testopia/img/confirm.svg | 69 + testopia/img/csv.png | Bin 0 -> 1295 bytes testopia/img/del.gif | Bin 0 -> 295 bytes testopia/img/del.xcf | Bin 0 -> 1310 bytes testopia/img/env_lookup.png | Bin 0 -> 598 bytes testopia/img/env_lookup.svg | 86 + testopia/img/error.gif | Bin 0 -> 177 bytes testopia/img/folder.gif | Bin 0 -> 165 bytes testopia/img/folder_blue.gif | Bin 0 -> 163 bytes testopia/img/folder_red.gif | Bin 0 -> 163 bytes testopia/img/green_bar.gif | Bin 0 -> 118 bytes testopia/img/lk.gif | Bin 0 -> 580 bytes testopia/img/orange_bar.gif | Bin 0 -> 118 bytes testopia/img/pb.gif | Bin 0 -> 93 bytes testopia/img/pg.gif | Bin 0 -> 93 bytes testopia/img/red_bar.gif | Bin 0 -> 118 bytes testopia/img/saw.gif | Bin 0 -> 570 bytes testopia/img/selected_value.png | Bin 0 -> 1104 bytes testopia/img/snew.gif | Bin 0 -> 296 bytes testopia/img/square.gif | Bin 0 -> 301 bytes testopia/img/square.png | Bin 0 -> 27882 bytes testopia/img/td.gif | Bin 0 -> 58 bytes testopia/img/testopia_big_picture.png | Bin 0 -> 44411 bytes testopia/img/testopia_city_128.png | Bin 0 -> 10376 bytes testopia/img/testopia_city_256.png | Bin 0 -> 22869 bytes testopia/img/testopia_city_512.png | Bin 0 -> 48233 bytes testopia/img/testopia_logo_128.png | Bin 0 -> 4436 bytes testopia/img/testopia_logo_256.png | Bin 0 -> 9598 bytes testopia/img/tr.gif | Bin 0 -> 61 bytes testopia/img/triangle.gif | Bin 0 -> 315 bytes testopia/img/triangle.png | Bin 0 -> 29306 bytes testopia/img/xml.png | Bin 0 -> 1274 bytes testopia/js/DocumentManager.js | 88 + testopia/js/caserun.js | 251 +++ testopia/js/tags.js | 69 + testopia/js/util.js | 228 ++ testopia/patch-2.22 | 843 ++++++++ testopia/patch-2.22.1 | 853 ++++++++ testopia/patch-2.22.2 | 853 ++++++++ testopia/scripts/create_testscript.sh | 10 + testopia/scripts/cvs_update.sh | 55 + testopia/scripts/fail_id.sh | 7 + testopia/scripts/note_id.sh | 8 + testopia/scripts/pass_id.sh | 7 + testopia/scripts/readme.txt | 50 + testopia/scripts/regression_test.sh | 11 + testopia/scripts/trenv.sh | 10 + testopia/testopia.insert.sql | 41 + testopia/tools/readme | 3 + tr_admin.cgi | 103 + tr_admin_environment.cgi | 576 ++++++ tr_attachment.cgi | 185 ++ tr_builds.cgi | 151 ++ tr_case_dependencies.cgi | 0 tr_case_reports.cgi | 122 ++ tr_caserun_reports.cgi | 88 + tr_categories.cgi | 154 ++ tr_csv2xml.pl | 701 +++++++ tr_draw.cgi | 37 + tr_export_environment.cgi | 68 + tr_import_environment.cgi | 346 ++++ tr_importxml.pl | 144 ++ tr_install.pl | 862 ++++++++ tr_list_caseruns.cgi | 316 +++ tr_list_cases.cgi | 438 ++++ tr_list_environments.cgi | 58 + tr_list_plans.cgi | 166 ++ tr_list_runs.cgi | 192 ++ tr_new_case.cgi | 262 +++ tr_new_environment.cgi | 96 + tr_new_plan.cgi | 153 ++ tr_new_run.cgi | 237 +++ tr_plan_access.cgi | 134 ++ tr_plan_reports.cgi | 168 ++ tr_query.cgi | 340 +++ tr_quicksearch.cgi | 321 +++ tr_run_reports.cgi | 83 + tr_show_case.cgi | 461 +++++ tr_show_caserun.cgi | 395 ++++ tr_show_environment.cgi | 328 +++ tr_show_plan.cgi | 481 +++++ tr_show_run.cgi | 452 ++++ tr_tags.cgi | 229 +++ tr_xmlrpc.cgi | 55 + 297 files changed, 44016 insertions(+) create mode 100644 .project create mode 100644 Bugzilla/Config/Testopia.pm create mode 100644 Bugzilla/Testopia/Attachment.pm create mode 100644 Bugzilla/Testopia/Build.pm create mode 100644 Bugzilla/Testopia/Category.pm create mode 100644 Bugzilla/Testopia/Classification.pm create mode 100644 Bugzilla/Testopia/Constants.pm create mode 100644 Bugzilla/Testopia/Environment.pm create mode 100644 Bugzilla/Testopia/Environment/Category.pm create mode 100644 Bugzilla/Testopia/Environment/Element.pm create mode 100644 Bugzilla/Testopia/Environment/Property.pm create mode 100644 Bugzilla/Testopia/Environment/Xml.pm create mode 100644 Bugzilla/Testopia/Product.pm create mode 100644 Bugzilla/Testopia/Report.pm create mode 100644 Bugzilla/Testopia/Search.pm create mode 100644 Bugzilla/Testopia/Table.pm create mode 100644 Bugzilla/Testopia/TestCase.pm create mode 100644 Bugzilla/Testopia/TestCaseRun.pm create mode 100644 Bugzilla/Testopia/TestPlan.pm create mode 100644 Bugzilla/Testopia/TestRun.pm create mode 100644 Bugzilla/Testopia/TestTag.pm create mode 100644 Bugzilla/Testopia/Util.pm create mode 100644 Bugzilla/Testopia/Xml.pm create mode 100644 Bugzilla/Testopia/XmlReferences.pm create mode 100644 Bugzilla/Testopia/XmlTestCase.pm create mode 100644 Bugzilla/WebService.pm create mode 100644 Bugzilla/WebService/Component.pm create mode 100644 Bugzilla/WebService/Constants.pm create mode 100644 Bugzilla/WebService/Testopia/Build.pm create mode 100644 Bugzilla/WebService/Testopia/Environment.pm create mode 100644 Bugzilla/WebService/Testopia/Product.pm create mode 100644 Bugzilla/WebService/Testopia/TestCase.pm create mode 100644 Bugzilla/WebService/Testopia/TestCaseRun.pm create mode 100644 Bugzilla/WebService/Testopia/TestPlan.pm create mode 100644 Bugzilla/WebService/Testopia/TestRun.pm create mode 100644 Bugzilla/WebService/User.pm create mode 100644 template/en/default/admin/params/testopia.html.tmpl create mode 100644 template/en/default/hook/bug/create/create.html.tmpl/end/tr.html.tmpl create mode 100644 template/en/default/hook/bug/create/create.html.tmpl/form/tr.html.tmpl create mode 100644 template/en/default/hook/bug/create/created.html.tmpl/message/tr.html.tmpl create mode 100644 template/en/default/hook/bug/knob.html.tmpl/links/tr.html.tmpl create mode 100644 template/en/default/hook/bug/process/results.html.tmpl/links/tr.html.tmpl create mode 100644 template/en/default/hook/global/banner.html.tmpl/version/testopia.html.tmpl create mode 100644 template/en/default/hook/global/useful-links.html.tmpl/end/tr.html.tmpl create mode 100644 template/en/default/hook/global/user-error.html.tmpl/errors/tr-user-error.html.tmpl create mode 100644 template/en/default/hook/index.html.tmpl/links/tr.html.tmpl create mode 100644 template/en/default/hook/list/list.html.tmpl/links/tr.html.tmpl create mode 100644 template/en/default/testopia/admin/access-list.html.tmpl create mode 100644 template/en/default/testopia/admin/plantypes/add.html.tmpl create mode 100644 template/en/default/testopia/admin/plantypes/delete.html.tmpl create mode 100644 template/en/default/testopia/admin/plantypes/edit.html.tmpl create mode 100644 template/en/default/testopia/admin/plantypes/show.html.tmpl create mode 100644 template/en/default/testopia/admin/show.html.tmpl create mode 100644 template/en/default/testopia/attachment/choose.html.tmpl create mode 100644 template/en/default/testopia/attachment/delete.html.tmpl create mode 100644 template/en/default/testopia/attachment/show.html.tmpl create mode 100644 template/en/default/testopia/attachment/table.html.tmpl create mode 100644 template/en/default/testopia/blocks.html.tmpl create mode 100644 template/en/default/testopia/build/delete.html.tmpl create mode 100644 template/en/default/testopia/build/form.html.tmpl create mode 100644 template/en/default/testopia/build/list.html.tmpl create mode 100644 template/en/default/testopia/case/add.html.tmpl create mode 100644 template/en/default/testopia/case/buglist-to-case-add.html.tmpl create mode 100644 template/en/default/testopia/case/buglist-to-case-entry.html.tmpl create mode 100644 template/en/default/testopia/case/bugs.html.tmpl create mode 100644 template/en/default/testopia/case/choose.html.tmpl create mode 100644 template/en/default/testopia/case/clone.html.tmpl create mode 100644 template/en/default/testopia/case/delete-list.html.tmpl create mode 100644 template/en/default/testopia/case/delete.html.tmpl create mode 100644 template/en/default/testopia/case/filter.html.tmpl create mode 100644 template/en/default/testopia/case/form.html.tmpl create mode 100644 template/en/default/testopia/case/history.html.tmpl create mode 100644 template/en/default/testopia/case/list.csv.tmpl create mode 100644 template/en/default/testopia/case/list.html.tmpl create mode 100644 template/en/default/testopia/case/list.xml.tmpl create mode 100644 template/en/default/testopia/case/navigate.html.tmpl create mode 100644 template/en/default/testopia/case/show.csv.tmpl create mode 100644 template/en/default/testopia/case/show.html.tmpl create mode 100644 template/en/default/testopia/case/show.print.tmpl create mode 100644 template/en/default/testopia/case/show.xml.tmpl create mode 100644 template/en/default/testopia/case/table.html.tmpl create mode 100644 template/en/default/testopia/case/unlink.html.tmpl create mode 100644 template/en/default/testopia/caserun/case-history.html.tmpl create mode 100644 template/en/default/testopia/caserun/delete.html.tmpl create mode 100644 template/en/default/testopia/caserun/filter.html.tmpl create mode 100644 template/en/default/testopia/caserun/form.html.tmpl create mode 100644 template/en/default/testopia/caserun/list.html.tmpl create mode 100644 template/en/default/testopia/caserun/navigate.html.tmpl create mode 100644 template/en/default/testopia/caserun/short-form-header.html.tmpl create mode 100644 template/en/default/testopia/caserun/short-form.html.tmpl create mode 100644 template/en/default/testopia/caserun/show.html.tmpl create mode 100644 template/en/default/testopia/caserun/table.html.tmpl create mode 100644 template/en/default/testopia/category/delete.html.tmpl create mode 100644 template/en/default/testopia/category/form.html.tmpl create mode 100644 template/en/default/testopia/category/list.html.tmpl create mode 100644 template/en/default/testopia/environment/add.html.tmpl create mode 100644 template/en/default/testopia/environment/admin/category.html.tmpl create mode 100644 template/en/default/testopia/environment/admin/element.html.tmpl create mode 100644 template/en/default/testopia/environment/admin/property.html.tmpl create mode 100644 template/en/default/testopia/environment/admin/show.html.tmpl create mode 100644 template/en/default/testopia/environment/admin/tree.html.tmpl create mode 100644 template/en/default/testopia/environment/admin/valid_exp.html.tmpl create mode 100644 template/en/default/testopia/environment/choose.html.tmpl create mode 100644 template/en/default/testopia/environment/delete.html.tmpl create mode 100644 template/en/default/testopia/environment/export.xml.tmpl create mode 100644 template/en/default/testopia/environment/form.html.tmpl create mode 100644 template/en/default/testopia/environment/import.xml.tmpl create mode 100644 template/en/default/testopia/environment/list.html.tmpl create mode 100644 template/en/default/testopia/environment/show.html.tmpl create mode 100644 template/en/default/testopia/environment/table.html.tmpl create mode 100644 template/en/default/testopia/export/csv.case.tmpl create mode 100644 template/en/default/testopia/export/csv.caseheader.tmpl create mode 100644 template/en/default/testopia/export/xml.case.tmpl create mode 100644 template/en/default/testopia/export/xml.footer.tmpl create mode 100644 template/en/default/testopia/export/xml.header.tmpl create mode 100644 template/en/default/testopia/messages.html.tmpl create mode 100644 template/en/default/testopia/percent_bar.html.tmpl create mode 100644 template/en/default/testopia/plan/add.html.tmpl create mode 100644 template/en/default/testopia/plan/choose.html.tmpl create mode 100644 template/en/default/testopia/plan/clone.html.tmpl create mode 100644 template/en/default/testopia/plan/delete.html.tmpl create mode 100644 template/en/default/testopia/plan/form.html.tmpl create mode 100644 template/en/default/testopia/plan/history.html.tmpl create mode 100644 template/en/default/testopia/plan/list-product.html.tmpl create mode 100644 template/en/default/testopia/plan/list.html.tmpl create mode 100644 template/en/default/testopia/plan/navigate.html.tmpl create mode 100644 template/en/default/testopia/plan/show.csv.tmpl create mode 100644 template/en/default/testopia/plan/show.html.tmpl create mode 100644 template/en/default/testopia/plan/show.print.tmpl create mode 100644 template/en/default/testopia/plan/show.xml.tmpl create mode 100644 template/en/default/testopia/plan/table.html.tmpl create mode 100644 template/en/default/testopia/progress.html.tmpl create mode 100644 template/en/default/testopia/quicksearch.html.tmpl create mode 100644 template/en/default/testopia/reports/bug-count.html.tmpl create mode 100644 template/en/default/testopia/reports/bug-severity-status-form.html.tmpl create mode 100644 template/en/default/testopia/reports/bug-stats-form.html.tmpl create mode 100644 template/en/default/testopia/reports/build-coverage.html.tmpl create mode 100644 template/en/default/testopia/reports/header.html.tmpl create mode 100644 template/en/default/testopia/reports/incident.html.tmpl create mode 100644 template/en/default/testopia/reports/log.html.tmpl create mode 100644 template/en/default/testopia/reports/report-bar.png.tmpl create mode 100644 template/en/default/testopia/reports/report-line.png.tmpl create mode 100644 template/en/default/testopia/reports/report-pie.png.tmpl create mode 100644 template/en/default/testopia/reports/report-table.html.tmpl create mode 100644 template/en/default/testopia/reports/report.csv.tmpl create mode 100644 template/en/default/testopia/reports/report.html.tmpl create mode 100644 template/en/default/testopia/reports/test-burnout-form.html.tmpl create mode 100644 template/en/default/testopia/run/add.html.tmpl create mode 100644 template/en/default/testopia/run/choose.html.tmpl create mode 100644 template/en/default/testopia/run/clone.html.tmpl create mode 100644 template/en/default/testopia/run/delete.html.tmpl create mode 100644 template/en/default/testopia/run/form.html.tmpl create mode 100644 template/en/default/testopia/run/history.html.tmpl create mode 100644 template/en/default/testopia/run/list.html.tmpl create mode 100644 template/en/default/testopia/run/navigate.html.tmpl create mode 100644 template/en/default/testopia/run/regression.html.tmpl create mode 100644 template/en/default/testopia/run/show.html.tmpl create mode 100644 template/en/default/testopia/run/table.html.tmpl create mode 100644 template/en/default/testopia/run/tabs.html.tmpl create mode 100644 template/en/default/testopia/saved-search.html.tmpl create mode 100644 template/en/default/testopia/search/advanced.html.tmpl create mode 100644 template/en/default/testopia/search/case.html.tmpl create mode 100644 template/en/default/testopia/search/caserun.html.tmpl create mode 100644 template/en/default/testopia/search/environment.html.tmpl create mode 100644 template/en/default/testopia/search/plan.html.tmpl create mode 100644 template/en/default/testopia/search/report-matrix.html.tmpl create mode 100644 template/en/default/testopia/search/run.html.tmpl create mode 100644 template/en/default/testopia/search/variables.none.tmpl create mode 100644 template/en/default/testopia/style.none.tmpl create mode 100644 template/en/default/testopia/tag/list.html.tmpl create mode 100644 template/en/default/testopia/tag/show.html.tmpl create mode 100644 template/en/default/testopia/tag/table.html.tmpl create mode 100644 template/en/default/testopia/text.png.tmpl create mode 100644 testopia.dtd create mode 100644 testopia/ChangeLog create mode 100644 testopia/README create mode 100755 testopia/css/default.css create mode 100644 testopia/css/print.css create mode 100755 testopia/css/report.css create mode 100644 testopia/doc/Manual.odt create mode 100644 testopia/doc/Manual.pdf create mode 100644 testopia/doc/Manual.rtf create mode 100644 testopia/doc/Manual.xhtml create mode 100644 testopia/doc/Testopia.dia create mode 100644 testopia/doc/training.odp create mode 100644 testopia/dojo/DOJO_INSTALL_HELP create mode 100644 testopia/environment.dtd create mode 100644 testopia/img/1x1.gif create mode 100644 testopia/img/BLOCKED.gif create mode 100644 testopia/img/BLOCKED_gray.gif create mode 100644 testopia/img/BLOCKED_small.gif create mode 100755 testopia/img/FAILED.gif create mode 100755 testopia/img/FAILED_gray.gif create mode 100755 testopia/img/FAILED_small.gif create mode 100755 testopia/img/IDLE.gif create mode 100755 testopia/img/IDLE_gray.gif create mode 100755 testopia/img/IDLE_small.gif create mode 100755 testopia/img/PASSED.gif create mode 100755 testopia/img/PASSED_gray.gif create mode 100755 testopia/img/PASSED_small.gif create mode 100644 testopia/img/PAUSED.gif create mode 100644 testopia/img/PAUSED_gray.gif create mode 100644 testopia/img/PAUSED_small.gif create mode 100644 testopia/img/RUNNING.gif create mode 100644 testopia/img/RUNNING_gray.gif create mode 100644 testopia/img/RUNNING_small.gif create mode 100644 testopia/img/Testopia_pocket.eps create mode 100755 testopia/img/aw.gif create mode 100755 testopia/img/awg.gif create mode 100644 testopia/img/circle.gif create mode 100644 testopia/img/circle.png create mode 100644 testopia/img/city.eps create mode 100644 testopia/img/confirm.png create mode 100644 testopia/img/confirm.svg create mode 100644 testopia/img/csv.png create mode 100644 testopia/img/del.gif create mode 100644 testopia/img/del.xcf create mode 100644 testopia/img/env_lookup.png create mode 100644 testopia/img/env_lookup.svg create mode 100644 testopia/img/error.gif create mode 100644 testopia/img/folder.gif create mode 100644 testopia/img/folder_blue.gif create mode 100644 testopia/img/folder_red.gif create mode 100644 testopia/img/green_bar.gif create mode 100755 testopia/img/lk.gif create mode 100644 testopia/img/orange_bar.gif create mode 100755 testopia/img/pb.gif create mode 100755 testopia/img/pg.gif create mode 100644 testopia/img/red_bar.gif create mode 100755 testopia/img/saw.gif create mode 100644 testopia/img/selected_value.png create mode 100644 testopia/img/snew.gif create mode 100644 testopia/img/square.gif create mode 100644 testopia/img/square.png create mode 100755 testopia/img/td.gif create mode 100644 testopia/img/testopia_big_picture.png create mode 100644 testopia/img/testopia_city_128.png create mode 100644 testopia/img/testopia_city_256.png create mode 100644 testopia/img/testopia_city_512.png create mode 100644 testopia/img/testopia_logo_128.png create mode 100644 testopia/img/testopia_logo_256.png create mode 100755 testopia/img/tr.gif create mode 100644 testopia/img/triangle.gif create mode 100644 testopia/img/triangle.png create mode 100644 testopia/img/xml.png create mode 100644 testopia/js/DocumentManager.js create mode 100755 testopia/js/caserun.js create mode 100644 testopia/js/tags.js create mode 100755 testopia/js/util.js create mode 100644 testopia/patch-2.22 create mode 100644 testopia/patch-2.22.1 create mode 100644 testopia/patch-2.22.2 create mode 100755 testopia/scripts/create_testscript.sh create mode 100755 testopia/scripts/cvs_update.sh create mode 100755 testopia/scripts/fail_id.sh create mode 100755 testopia/scripts/note_id.sh create mode 100755 testopia/scripts/pass_id.sh create mode 100755 testopia/scripts/readme.txt create mode 100755 testopia/scripts/regression_test.sh create mode 100755 testopia/scripts/trenv.sh create mode 100644 testopia/testopia.insert.sql create mode 100644 testopia/tools/readme create mode 100755 tr_admin.cgi create mode 100755 tr_admin_environment.cgi create mode 100755 tr_attachment.cgi create mode 100755 tr_builds.cgi create mode 100755 tr_case_dependencies.cgi create mode 100755 tr_case_reports.cgi create mode 100644 tr_caserun_reports.cgi create mode 100755 tr_categories.cgi create mode 100644 tr_csv2xml.pl create mode 100644 tr_draw.cgi create mode 100755 tr_export_environment.cgi create mode 100755 tr_import_environment.cgi create mode 100644 tr_importxml.pl create mode 100644 tr_install.pl create mode 100755 tr_list_caseruns.cgi create mode 100755 tr_list_cases.cgi create mode 100755 tr_list_environments.cgi create mode 100755 tr_list_plans.cgi create mode 100755 tr_list_runs.cgi create mode 100755 tr_new_case.cgi create mode 100755 tr_new_environment.cgi create mode 100755 tr_new_plan.cgi create mode 100755 tr_new_run.cgi create mode 100644 tr_plan_access.cgi create mode 100755 tr_plan_reports.cgi create mode 100755 tr_query.cgi create mode 100755 tr_quicksearch.cgi create mode 100644 tr_run_reports.cgi create mode 100755 tr_show_case.cgi create mode 100755 tr_show_caserun.cgi create mode 100755 tr_show_environment.cgi create mode 100755 tr_show_plan.cgi create mode 100755 tr_show_run.cgi create mode 100755 tr_tags.cgi create mode 100755 tr_xmlrpc.cgi diff --git a/.project b/.project new file mode 100644 index 0000000..0b5ffe8 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + testopia-1.0-2.22 + + + + + + org.epic.perleditor.perlbuilder + + + + + + org.epic.perleditor.perlnature + + diff --git a/Bugzilla/Config/Testopia.pm b/Bugzilla/Config/Testopia.pm new file mode 100644 index 0000000..4a88e0a --- /dev/null +++ b/Bugzilla/Config/Testopia.pm @@ -0,0 +1,147 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Maciej Maczynski +# Ed Fuentetaja +# Greg Hendricks + +package Bugzilla::Config::Testopia; + +use strict; + +use Bugzilla::Config::Common; + +$Bugzilla::Config::Admin::sortkey = "20"; + +sub get_param_list { + my $class = shift; + my @param_list = ( +# { +# name => 'private-cases-log', +# type => 'b', +# default => 0, +# }, + + { + name => 'allow-test-deletion', + type => 'b', + default => 0, + }, + + { + name => 'testopia-allow-group-member-deletes', + type => 'b', + default => 0, + }, + + { + name => 'testopia-default-plan-testers-regexp', + type => 't', + }, + +# { +# name => 'print-tag-in-case-log', +# type => 'b', +# default => 0, +# }, + + { + name => 'new-case-action-template', + type => 'l', + default => qq{
    +
  1. +
}, + }, + + { + name => 'new-case-results-template', + type => 'l', + default => qq{
    +
  1. +
}, + }, + + { + name => 'bug-to-test-case-summary', + type => 'l', + default => 'Test for bug %id% - %summary%', + }, + + { + name => 'bug-to-test-case-action', + type => 'l', + default => 'Verify that bug %id% is fixed: %description%' + }, + + { + name => 'bug-to-test-case-results', + type => 'l', + default => '', + }, + + { + name => 'default-test-case-status', + type => 's', + choices => ['PROPOSED', 'CONFIRMED', 'DISABLED'], + default => 'PROPOSED' + }, + +# { +# name => 'new-testrun-email-notif', +# type => 'l', +# default => 'From: bugzilla-daemon'."\n". +# 'To: %to%'."\n". +# 'Subject: Test run started.'."\n". +# "\n". +# 'Test run \'%summary%\' for product \'%product%\' and test plan \'%plan%\' has '. +# 'just been started.' +# }, + +# { +# name => 'case-failed-email-notif', +# type => 'l', +# default => 'From: bugzilla-daemon'."\n". +# 'To: %manager%'."\n". +# 'Subject: Case log \'%id%\' marked as failed.'."\n". +# "\n". +# 'Test case log \'%id%\' in test run \'%test_run%\' was marked as \'failed\' by %tester%.' +# }, + +# { +# name => 'tester-completed-email-notif', +# type => 'l', +# default => 'From: bugzilla-daemon'."\n". +# 'To: %manager%'."\n". +# 'Subject: Test run completed for tester.'."\n". +# "\n". +# 'Tester %tester% has completed the test run \'%test_run%\'.' +# }, + +# { +# name => 'test-run-completed-email-notif', +# type => 'l', +# default => 'From: bugzilla-daemon'."\n". +# 'To: %manager%'."\n". +# 'Subject: Test run completed.'."\n". +# "\n". +# 'Test run \'%test_run%\' completed.' +# } +); +} +1; diff --git a/Bugzilla/Testopia/Attachment.pm b/Bugzilla/Testopia/Attachment.pm new file mode 100644 index 0000000..22595bd --- /dev/null +++ b/Bugzilla/Testopia/Attachment.pm @@ -0,0 +1,595 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Large portions lifted uncerimoniously from Bugzilla::Attachment.pm +# and bugzilla's attachment.cgi +# Which are copyrighted by their respective copyright holders: +# Terry Weissman +# Myk Melez +# Daniel Raichle +# Dave Miller +# Alexander J. Vincent +# Max Kanat-Alexander +# Greg Hendricks +# +# Contributor(s): Greg Hendricks + +=head1 NAME + +Bugzilla::Testopia::Attachment - Attachment object for Testopia + +=head1 DESCRIPTION + +This module provides support for attachments to Test Cases and Test +Plans in Testopia. + +=head1 SYNOPSIS + + $attachment = Bugzilla::Testopia::Attachment->new($attachment_id); + $attachment = Bugzilla::Testopia::Attachment->new(\%attachment_hash); + +=cut + +package Bugzilla::Testopia::Attachment; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Config; +use Bugzilla::Error; + +use base qw(Exporter); + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + attachment_id + submitter_id + description + filename + creation_ts + mime_type + +=cut + +use constant DB_COLUMNS => qw( + attachment_id + submitter_id + description + filename + creation_ts + mime_type +); + +our $columns = join(", ", DB_COLUMNS); + + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=head2 new + +Instantiates a new Attachment object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for attachment class + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns FROM test_attachments + WHERE attachment_id = ?}, undef, $id); + } elsif (ref $param eq 'HASH'){ + $obj = $param; + } else { + ThrowCodeError('bad_arg', + {argument => 'param', + function => 'Testopia::Attachment::_init'}); + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + return $self; +} + +=head2 store + +Serializes this attachment to the database + +=cut + +sub store { + my ($self) = @_; + if (!$self->{'case_id'} && !$self->{'plan_id'}){ + ThrowUserError("testopia-missing-attachment-key"); + } + $self->_validate_data; + $self->{'filename'} = $self->strip_path($self->{'filename'}); + my $dbh = Bugzilla->dbh; + my ($timestamp) = Bugzilla::Testopia::Util::get_time_stamp(); + + + $dbh->do("INSERT INTO test_attachments ($columns) + VALUES (?,?,?,?,?,?)", + undef, (undef, + $self->{'submitter_id'}, $self->{'description'}, + $self->{'filename'}, $timestamp, $self->{'mime_type'})); + + my $key = $dbh->bz_last_key( 'test_attachments', 'attachment_id' ); + $dbh->do("INSERT INTO test_attachment_data (attachment_id, contents) VALUES(?,?)", + undef, $key, $self->{'contents'}); + + if ($self->{'case_id'}){ + + $dbh->do("INSERT INTO test_case_attachments (attachment_id, case_id, case_run_id) + VALUES (?,?,?)", + undef, ($key, $self->{'case_id'}, $self->{'case_run_id'})); + } + elsif ($self->{'plan_id'}){ + $dbh->do("INSERT INTO test_plan_attachments (attachment_id, plan_id) + VALUES (?,?)", + undef, ($key, $self->{'plan_id'})); + } + + return $key; +} + +=head2 _validate_data + +Private method for validating attachment data. Checks that size +limit is not exceeded and converts uncompressed BMP to PNG + +=cut + +sub _validate_data { + my $self = shift; + my $maxsize = Param('maxattachmentsize'); + $maxsize *= 1024; # Convert from K + + # Windows screenshots are usually uncompressed BMP files which + # makes for a quick way to eat up disk space. Let's compress them. + # We do this before we check the size since the uncompressed version + # could easily be greater than maxattachmentsize. + if (Param('convert_uncompressed_images') + && $self->{'mime_type'} eq 'image/bmp'){ + require Image::Magick; + my $img = Image::Magick->new(magick=>'bmp'); + $img->BlobToImage($self->{'contents'}); + $img->set(magick=>'png'); + my $imgdata = $img->ImageToBlob(); + $self->{'contents'} = $imgdata; + $self->{'contenttype'} = 'image/png'; + } + + # Make sure the attachment does not exceed the maximum permitted size + my $len = $self->{'contents'} ? length($self->{'contents'}) : 0; + if ($maxsize && $len > $maxsize) { + my $vars = { filesize => sprintf("%.0f", $len/1024) }; + ThrowUserError("file_too_large", $vars); + } + trick_taint($self->{'contents'}); + +} + +=head2 strip_path + +Strips the path from a filename, everything up to the last / or \. +Note: this was copied directly from bugzilla. + +=cut + +sub strip_path { + my $self = shift; + my ($filename) = @_; + + # Remove path info (if any) from the file name. The browser should do this + # for us, but some are buggy. This may not work on Mac file names and could + # mess up file names with slashes in them, but them's the breaks. We only + # use this as a hint to users downloading attachments anyway, so it's not + # a big deal if it munges incorrectly occasionally. + $filename =~ s/^.*[\/\\]//; + + # Truncate the filename to 100 characters, counting from the end of the string + # to make sure we keep the filename extension. + $filename = substr($filename, -100, 100); + + trick_taint($filename); + return $filename; + +} + +=head2 isViewable + +Returns true if the content type (mime-type) is viewable in a browser +text/* and img for the most part are viewable, All others are not. + +=cut + +# Returns 1 if the parameter is a content-type viewable in this browser +# Note that we don't use $cgi->Accept()'s ability to check if a content-type +# matches, because this will return a value even if it's matched by the generic +# */* which most browsers add to the end of their Accept: headers. +sub isViewable +{ + my $self = shift; + my $cgi = shift; + my $contenttype = $self->mime_type; + + # We assume we can view all text and image types + if ($contenttype =~ /^(text|image)\//) { + return 1; + } + + # Mozilla can view XUL. Note the trailing slash on the Gecko detection to + # avoid sending XUL to Safari. + if (($contenttype =~ /^application\/vnd\.mozilla\./) && + ($cgi->user_agent() =~ /Gecko\//)) + { + return 1; + } + + # If it's not one of the above types, we check the Accept: header for any + # types mentioned explicitly. + my $accept = join(",", $cgi->Accept()); + + if ($accept =~ /^(.*,)?\Q$contenttype\E(,.*)?$/) { + return 1; + } + + return 0; +} + +=head2 update + +Updates an existing attachment object in the database. +Takes a reference to a hash, the keys of which must match +the fields of an attachment and the values representing the +new data. + +=cut + +sub update { + my $self = shift; + my ($newvalues) = @_; + my $dbh = Bugzilla->dbh; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + $dbh->bz_lock_tables('test_attachments WRITE'); + foreach my $field (keys %{$newvalues}){ + if ($self->{$field} ne $newvalues->{$field}){ + trick_taint($newvalues->{$field}); + $dbh->do("UPDATE test_attachments + SET $field = ? WHERE attachment_id = ?", + undef, $newvalues->{$field}, $self->{'attachment_id'}); + $self->{$field} = $newvalues->{$field}; + } + } + $dbh->bz_unlock_tables(); +} + +=head2 obliterate + +Completely removes an attachment from the database. This is the only +safe way to do this. + +=cut + +sub obliterate { + my $self = shift; + return 0 unless $self->candelete; + my $dbh = Bugzilla->dbh; + + $dbh->do("DELETE FROM test_attachment_data + WHERE attachment_id = ?", undef, $self->{'attachment_id'}); + $dbh->do("DELETE FROM test_case_attachments + WHERE attachment_id = ?", undef, $self->{'attachment_id'}); + $dbh->do("DELETE FROM test_plan_attachments + WHERE attachment_id = ?", undef, $self->{'attachment_id'}); + $dbh->do("DELETE FROM test_attachments + WHERE attachment_id = ?", undef, $self->{'attachment_id'}); + return 1; +} + +sub link_plan { + my $self = shift; + my ($plan_id) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->bz_lock_tables('test_plan_attachments WRITE'); + my ($is) = $dbh->selectrow_array( + "SELECT 1 + FROM test_plan_attachments + WHERE attachment_id = ? + AND plan_id = ?", + undef, ($self->id, $plan_id)); + if ($is) { + $dbh->bz_unlock_tables(); + return; + } + + $dbh->do("INSERT INTO test_plan_attachments (attachment_id, plan_id) + VALUES (?,?)", + undef, ($self->id, $plan_id)); + $dbh->bz_unlock_tables(); +} + +sub link_case { + my $self = shift; + my ($case_id) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->bz_lock_tables('test_case_attachments WRITE'); + my ($is) = $dbh->selectrow_array( + "SELECT 1 + FROM test_case_attachments + WHERE attachment_id = ? + AND case_id = ?", + undef, ($self->id, $case_id)); + if ($is) { + $dbh->bz_unlock_tables(); + return; + } + + $dbh->do("INSERT INTO test_case_attachments (attachment_id, case_id) + VALUES (?,?)", + undef, ($self->id, $case_id)); + $dbh->bz_unlock_tables(); +} + +sub unlink_plan { + my $self = shift; + my ($plan_id) = @_; + my $dbh = Bugzilla->dbh; + my ($refcount) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_plan_attachments + WHERE attachment_id = ?", undef, $self->id); + if ($refcount > 1){ + $dbh->do("DELETE FROM test_plan_attachments + WHERE plan_id = ? AND attachment_id = ?", + undef, ($plan_id, $self->id)); + } + else { + $self->obliterate; + } +} + +sub unlink_case { + my $self = shift; + my ($case_id) = @_; + my $dbh = Bugzilla->dbh; + + my ($refcount) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_case_attachments + WHERE attachment_id = ?", undef, $self->id); + if ($refcount > 1){ + $dbh->do("DELETE FROM test_case_attachments + WHERE case_id = ? AND attachment_id = ?", + undef, ($case_id, $self->id)); + } + else { + $self->obliterate; + } +} + +=head2 canview + +Returns true if the logged in user has rights to view this attachment + +=cut + +sub canview { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + foreach my $i (@{$self->cases}){ + return 0 unless $i->canview; + } + foreach my $i (@{$self->plans}){ + return 0 unless $i->canview; + } + return 1; +} + +=head2 canedit + +Returns true if the logged in user has rights to edit this attachment + +=cut + +sub canedit { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + foreach my $i (@{$self->cases}){ + return 0 unless $i->canedit; + } + foreach my $i (@{$self->plans}){ + return 0 unless $i->canedit; + } + return 1; +} + +=head2 candelete + +Returns true if the logged in user has rights to delete this attachment + +=cut + +sub candelete { + my $self = shift; + return 1 if Bugzilla->user->in_group("admin"); + return 0 unless $self->canedit && Param("allow-test-deletion"); + return 1 if Bugzilla->user->id == $self->submitter->id; + foreach my $i (@{$self->cases}){ + return 0 unless $i->canedit; + } + foreach my $i (@{$self->plans}){ + return 0 unless $i->canedit; + } + return 1; +} + +############################### +#### Accessors #### +############################### + +sub id { return $_[0]->{'attachment_id'}; } +sub submitter { return Bugzilla::User->new($_[0]->{'submitter_id'}); } +sub description { return $_[0]->{'description'}; } +sub filename { return $_[0]->{'filename'}; } +sub creation_ts { return $_[0]->{'creation_ts'}; } +sub mime_type { return $_[0]->{'mime_type'}; } + +=head2 contents + +Returns the attachment data + +=cut + +sub contents { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'contents'} if exists $self->{'contents'}; + my ($contents) = $dbh->selectrow_array("SELECT contents + FROM test_attachment_data + WHERE attachment_id = ?", + undef, $self->{'attachment_id'}); + + $self->{'contents'} = $contents; + return $self->{'contents'}; +} + +=head2 datasize + +Returns the size of the attachment data + +=cut + +sub datasize { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'datasize'} if exists $self->{'datasize'}; + my ($datasize) = $dbh->selectrow_array("SELECT LENGTH(contents) + FROM test_attachment_data + WHERE attachment_id = ?", + undef, $self->{'attachment_id'}); + $self->{'datasize'} = $datasize; + return $self->{'datasize'}; +} + +=head2 cases + +Returns a reference to a list of Testopia::TestCase objects linked +to this attachment + +=cut + +sub cases { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'cases'} if exists $self->{'cases'}; + my $caseids = $dbh->selectcol_arrayref( + "SELECT case_id FROM test_case_attachments + WHERE attachment_id = ?", + undef, $self->id); + my @cases; + foreach my $id (@{$caseids}){ + push @cases, Bugzilla::Testopia::TestCase->new($id); + } + + $self->{'cases'} = \@cases; + return $self->{'cases'}; +} + +=head2 plans + +Returns a reference to a list of Testopia::TestCase objects linked +to this plan + +=cut + +sub plans { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'plans'} if exists $self->{'plans'}; + my $planids = $dbh->selectcol_arrayref( + "SELECT plan_id FROM test_plan_attachments + WHERE attachment_id = ?", + undef, $self->id); + my @plans; + foreach my $id (@{$planids}){ + push @plans, Bugzilla::Testopia::TestPlan->new($id); + } + + $self->{'plans'} = \@plans; + return $self->{'plans'}; +} + +=head2 type + +Returns 'attachment' + +=cut + +sub type { + my $self = shift; + $self->{'type'} = 'attachment'; + return $self->{'type'}; +} + +=head1 SEE ALSO + +Bugzilla::Attachment + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/Build.pm b/Bugzilla/Testopia/Build.pm new file mode 100644 index 0000000..cdb2873 --- /dev/null +++ b/Bugzilla/Testopia/Build.pm @@ -0,0 +1,292 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Maciej Maczynski are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks + +=head1 NAME + +Bugzilla::Testopia::Build - An object representing a Testopia build number + +=head1 DESCRIPTION + +Builds are used to classify test runs. A build represents the results of +a period of work. + +=head1 SYNOPSIS + + $build = Bugzilla::Testopia::Build->new($build_id); + $build = Bugzilla::Testopia::Build->new(\%build_hash); + +=cut + +package Bugzilla::Testopia::Build; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestCase; + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + build_id + product_id + name + description + milestone + isactive + +=cut + +use constant DB_COLUMNS => qw( + build_id + product_id + name + description + milestone + isactive +); + +our $columns = join(", ", DB_COLUMNS); + + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=head2 new + +Instantiates a new Build object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for build class + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns FROM test_builds + WHERE build_id = ?}, undef, $id); + } elsif (ref $param eq 'HASH'){ + $obj = $param; + } + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + return $self; +} + +=head2 store + +Serializes this build to the database + +=cut + +sub store { + my $self = shift; + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_builds ($columns) + VALUES (?,?,?,?,?,?)", + undef, (undef, $self->{'product_id'}, $self->{'name'}, + $self->{'description'}, $self->{'milestone'}, $self->{'isactive'})); + my $key = $dbh->bz_last_key( 'test_builds', 'build_id' ); + return $key; +} + +=head2 check_name + +Returns true if a build of the specified name exists in the database +for a product. + +=cut + +sub check_name { + my $self = shift; + my ($name) = @_; + my $dbh = Bugzilla->dbh; + my $is = $dbh->selectrow_array( + "SELECT build_id FROM test_builds + WHERE name = ? AND product_id = ?", + undef, $name, $self->{'product_id'}); + + return $is; +} + +=head2 check_build_by_name + +Returns id of a build of the specified name + +=cut + +sub check_build_by_name { + my $self = shift; + my ($name) = @_; + my $dbh = Bugzilla->dbh; + my $id = $dbh->selectrow_array( + "SELECT build_id FROM test_builds + WHERE name = ?", undef, $name); + + return $id; +} + +=head2 update + +Updates an existing build object in the database. +Takes the new name, description, and milestone. + +=cut + +sub update { + my $self = shift; + my ($name, $desc, $milestone, $isactive) = @_; + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_builds + SET name = ?, description = ?, milestone = ?, isactive= ? + WHERE build_id = ?", undef, + ($name, $desc, $milestone, $isactive, $self->{'build_id'})); +} + +=head2 toggle_hidden + +Toggles the archive bit on the build. + +=cut + +sub toggle_hidden { + my $self = shift; + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_builds SET isactive = ? + WHERE build_id = ?", undef, $self->isactive ? 0 : 1, $self->id); + +} + +############################### +#### Accessors #### +############################### + +=head2 id + +Returns the ID of this object + +=head2 product_id + +Returns the product_id of this object + +=head2 name + +Returns the name of this object + +=head2 description + +Returns the description of this object + +=head2 milestone + +Returns the Bugzilla taget milestone associated with this build + +=cut + +sub id { return $_[0]->{'build_id'}; } +sub product_id { return $_[0]->{'product_id'}; } +sub name { return $_[0]->{'name'}; } +sub description { return $_[0]->{'description'};} +sub milestone { return $_[0]->{'milestone'};} +sub isactive { return $_[0]->{'isactive'};} + +=head2 run_count + +Returns the number of test runs using this build + +=cut + +sub run_count { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'run_count'} if exists $self->{'run_count'}; + + $self->{'run_count'} = $dbh->selectrow_array( + "SELECT COUNT(run_id) FROM test_runs + WHERE build_id = ?", undef, $self->{'build_id'}); + + return $self->{'run_count'}; +} + +=head2 case_run_count + +Returns the number of test case runs against this build + +=cut + +sub case_run_count { + my ($self,$status_id) = @_; + my $dbh = Bugzilla->dbh; + + my $query = "SELECT COUNT(case_run_id) FROM test_case_runs + WHERE build_id = ?"; + $query .= " AND case_run_status_id = ?" if $status_id; + + my $count; + if ($status_id){ + $count = $dbh->selectrow_array($query, undef, ($self->{'build_id'},$status_id)); + } + else { + $count = $dbh->selectrow_array($query, undef, $self->{'build_id'}); + } + + return $count; +} + +=head1 SEE ALSO + +TestPlan TestRun TestCaseRun + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/Category.pm b/Bugzilla/Testopia/Category.pm new file mode 100644 index 0000000..528d0fc --- /dev/null +++ b/Bugzilla/Testopia/Category.pm @@ -0,0 +1,275 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Maciej Maczynski are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks + +=head1 NAME + +Bugzilla::Testopia::Category - An object representing a test case category + +=head1 DESCRIPTION + +Categories are used to classify test cases. Each test case must +belong to one category. + +=head1 SYNOPSIS + + $category = Bugzilla::Testopia::Category->new($category_id); + $category = Bugzilla::Testopia::Category->new(\%category_hash); + +=cut + +package Bugzilla::Testopia::Category; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestCase; + +############################### +#### Initialization #### +############################### + +=head1 FILEDS + + category_id + product_id + name + description + +=cut + +use constant DB_COLUMNS => qw( + category_id + product_id + name + description +); + +our $columns = join(", ", DB_COLUMNS); + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=head2 new + +Instantiates a new Category object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for category class + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns FROM test_case_categories + WHERE category_id = ?}, undef, $id); + } elsif (ref $param eq 'HASH'){ + $obj = $param; + + } else { + ThrowCodeError('bad_arg', + {argument => 'param', + function => 'Testopia::Category::_init'}); + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + return $self; +} + +=head2 store + +Serializes this category to the database + +=cut + +sub store { + my $self = shift; + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_case_categories ($columns) + VALUES (?,?,?,?)", + undef, (undef, $self->{'product_id'}, $self->{'name'}, + $self->{'description'})); + my $key = $dbh->bz_last_key( 'test_case_categories', 'category_id' ); + return $key; +} + +=head2 remove + +Removes this category from the specified product + +=cut + +sub remove { + my $self = shift; + my $dbh = Bugzilla->dbh; + $dbh->do("DELETE FROM test_case_categories + WHERE category_id = ?", undef, + $self->{'category_id'}); +} + +=head2 check_name + +Returns the category id if the specified name exists in the +database for the product. + +=cut + +sub check_name { + my $self = shift; + my ($name) = @_; + my $dbh = Bugzilla->dbh; + my $is = $dbh->selectrow_array( + "SELECT category_id FROM test_case_categories + WHERE name = ? AND product_id = ?", + undef, $name, $self->{'product_id'}); + + return $is; +} + +=head2 update + +Updates an existing category object in the database. +Takes the new name, and description. + +=cut + +sub update { + my $self = shift; + my ($name, $desc) = @_; + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_case_categories + SET name = ?, description = ? + WHERE category_id = ?", undef, + ($name, $desc, $self->{'category_id'})); +} + +sub candelete { + my $self = shift; + return 0 unless Bugzilla->user->in_group('Testers'); + return 0 if ($self->case_count); + return 1; +} + +############################### +#### Accessors #### +############################### + +=head2 id + +Returns the ID of this object + +=head2 product_id + +Returns the product_id of this object + +=head2 name + +Returns the name of this object + +=head2 description + +Returns the description of this object + +=cut + +sub id { return $_[0]->{'category_id'}; } +sub product_id { return $_[0]->{'product_id'}; } +sub name { return $_[0]->{'name'}; } +sub description { return $_[0]->{'description'}; } + +=head2 case_count + +Returns the number of test cases in this category + +=cut + +sub case_count { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'case_count'} if exists $self->{'case_count'}; + + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(case_id) + FROM test_cases + WHERE category_id = ?", + undef, $self->{'category_id'}); + $self->{'case_count'} = $count; + return $self->{'case_count'}; +} + +=head2 plan_case_ids + +Returns a reference to a list of case_ids in this category for a given plan. + +=cut + +sub plan_case_ids { + my ($self, $plan_id) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'case_ids'} if exists $self->{'case_ids'}; + + $self->{'case_ids'} = $dbh->selectcol_arrayref( + "SELECT DISTINCT test_cases.case_id + FROM test_cases + INNER JOIN test_case_plans ON test_case_plans.case_id = test_cases.case_id + WHERE category_id = ? AND test_case_plans.plan_id = ?", + undef, ($self->{'category_id'}, $plan_id)); + + return $self->{'case_ids'}; +} + +=head1 SEE ALSO + +TestCase + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/Classification.pm b/Bugzilla/Testopia/Classification.pm new file mode 100644 index 0000000..2053f96 --- /dev/null +++ b/Bugzilla/Testopia/Classification.pm @@ -0,0 +1,85 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks + +package Bugzilla::Testopia::Classification; + +use strict; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Config; + +# Extends Bugzilla::Classification; +use base "Bugzilla::Classification"; + +use Bugzilla; + +sub user_visible_products { + my $self = shift; + my $dbh = Bugzilla->dbh; + + if (!$self->{'products'}) { + my $query = "SELECT id FROM products " . + "LEFT JOIN group_control_map " . + "ON group_control_map.product_id = products.id "; + if (Param('useentrygroupdefault')) { + $query .= "AND group_control_map.entry != 0 "; + } else { + $query .= "AND group_control_map.membercontrol = " . + CONTROLMAPMANDATORY . " "; + } + if (%{Bugzilla->user->groups}) { + $query .= "AND group_id NOT IN(" . + join(',', values(%{Bugzilla->user->groups})) . ") "; + } + $query .= "WHERE group_id IS NULL AND products.classification_id= ? ORDER BY products.name"; + + my $product_ids = $dbh->selectcol_arrayref($query, undef, $self->id); + + my @products; + foreach my $product_id (@$product_ids) { + push (@products, new Bugzilla::Testopia::Product($product_id)); + } + $self->{'user_visible_products'} = \@products; + } + return $self->{'user_visible_products'}; +} + +sub products_to_json { + my $self = shift; + my ($disable_move) = @_; + + $disable_move ||= ''; + $disable_move = ',"addChild","move"' if $disable_move; + my $products = $self->user_visible_products; + my $json = "["; + foreach my $obj (@{$products}){ + $json .= '{title:"' . $obj->name . '",'; + $json .= 'isFolder:' . (scalar @{$obj->environment_categories} > 0 ? "true" : "false") . ','; + $json .= 'objectId:"' . $obj->id . '",'; + $json .= 'widgetId:"product' . $obj->id . '",'; + $json .= 'actionsDisabled:["addElement","addProperty","addValue"'. $disable_move .'],'; + $json .= 'childIconSrc:"testopia/img/folder_red.gif"},'; + } + chop $json; + $json .= "]"; + return $json; +} +1; \ No newline at end of file diff --git a/Bugzilla/Testopia/Constants.pm b/Bugzilla/Testopia/Constants.pm new file mode 100644 index 0000000..b1cb58c --- /dev/null +++ b/Bugzilla/Testopia/Constants.pm @@ -0,0 +1,153 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks + +package Bugzilla::Testopia::Constants; +use strict; +use base qw(Exporter); + +@Bugzilla::Testopia::Constants::EXPORT = qw( +PROPOSED +CONFIRMED +DISABLED + +IDLE +PASSED +FAILED +RUNNING +PAUSED +BLOCKED + +TR_READ +TR_WRITE +TR_DELETE +TR_ADMIN + +REL_AUTHOR +REL_EDITOR +REL_TESTER +REL_TEST_CC + +TR_RELATIONSHIPS + +); + +# +# Fields to include when exporting a Test Case. +# +# All _id fields but case_id are converted to a string representation. +# +@Bugzilla::Testopia::Constants::TESTCASE_EXPORT = qw( +case_id +summary +set_up +break_down +action +expected_results +alias +arguments +author_id +blocks +case_status_id +category_id +components +creation_date +default_tester_id +depends_on +isautomated +plans +priority_id +requirement +script +tags +version +); + +@Bugzilla::Constants::EXPORT_OK = qw(contenttypes); + +# Test Case Status +use constant PROPOSED => 1; +use constant CONFIRMED => 2; +use constant DISABLED => 3; + +# Test case Run Status +use constant IDLE => 1; +use constant PASSED => 2; +use constant FAILED => 3; +use constant RUNNING => 4; +use constant PAUSED => 5; +use constant BLOCKED => 6; + +# Test Plan Permissions (bit flags) +use constant TR_READ => 1; +use constant TR_WRITE => 2; +use constant TR_DELETE => 4; +use constant TR_ADMIN => 8; + +use constant REL_AUTHOR => 0; +use constant REL_EDITOR => 1; +use constant REL_TESTER => 2; +use constant REL_TEST_CC => 3; + +use constant RELATIONSHIPS => REL_AUTHOR, REL_EDITOR, REL_TESTER, REL_TEST_CC; + +# Used for global events like EVT_FLAG_REQUESTED +use constant REL_ANY => 100; + +# There are two sorts of event - positive and negative. Positive events are +# those for which the user says "I want mail if this happens." Negative events +# are those for which the user says "I don't want mail if this happens." +# +# Exactly when each event fires is defined in wants_bug_mail() in User.pm; I'm +# not commenting them here in case the comments and the code get out of sync. +use constant EVT_OTHER => 0; +use constant EVT_ADDED_REMOVED => 1; +use constant EVT_COMMENT => 2; +use constant EVT_ATTACHMENT => 3; +use constant EVT_ATTACHMENT_DATA => 4; +use constant EVT_PROJ_MANAGEMENT => 5; +use constant EVT_OPENED_CLOSED => 6; +use constant EVT_KEYWORD => 7; +use constant EVT_CC => 8; + +use constant POS_EVENTS => EVT_OTHER, EVT_ADDED_REMOVED, EVT_COMMENT, + EVT_ATTACHMENT, EVT_ATTACHMENT_DATA, + EVT_PROJ_MANAGEMENT, EVT_OPENED_CLOSED, EVT_KEYWORD, + EVT_CC; + +use constant EVT_UNCONFIRMED => 50; +use constant EVT_CHANGED_BY_ME => 51; + +use constant NEG_EVENTS => EVT_UNCONFIRMED, EVT_CHANGED_BY_ME; + +# These are the "global" flags, which aren't tied to a particular relationship. +# and so use REL_ANY. +use constant EVT_FLAG_REQUESTED => 100; # Flag has been requested of me +use constant EVT_REQUESTED_FLAG => 101; # I have requested a flag + +use constant GLOBAL_EVENTS => EVT_FLAG_REQUESTED, EVT_REQUESTED_FLAG; + +# Number of bugs to return in a buglist when performing +# a fulltext search. +use constant FULLTEXT_BUGLIST_LIMIT => 200; + +# Path to sendmail.exe (Windows only) +use constant SENDMAIL_EXE => '/usr/lib/sendmail.exe'; + +1; diff --git a/Bugzilla/Testopia/Environment.pm b/Bugzilla/Testopia/Environment.pm new file mode 100644 index 0000000..8931b73 --- /dev/null +++ b/Bugzilla/Testopia/Environment.pm @@ -0,0 +1,793 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks +# Michael Hight +# Garrett Braden + +=head1 NAME + +Bugzilla::Testopia::Environment - A test environment + +=head1 DESCRIPTION + +Environments are a set of parameters dictating what conditions +a test was conducted in. Each test run must have an environment. +Environments can be very simple or very complex. + +Environments are comprised of Elemements, Properties, and Values. +Elements can be nested within other elements. Each element can have +zero or more properties. Each property can only have one value selected +of the possible values. + +=head1 SYNOPSIS + + $env = Bugzilla::Testopia::Environment->new($env_id); + $env = Bugzilla::Testopia::Environment->new(\%env_hash); + +=cut + +package Bugzilla::Testopia::Environment; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::User; +use Bugzilla::Config; + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + environment_id + product_id + name + isactive + +=cut + +use constant DB_COLUMNS => qw( + environment_id + product_id + name + isactive +); + +our $columns = join(", ", DB_COLUMNS); + +our constant $max_depth = 7; + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=head2 new + +Instantiates a new Environment object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for the environment class + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH' || ref $param eq 'Bugzilla::Testopia::Environment::Xml'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns + FROM test_environments + WHERE environment_id = ?}, undef, ($id)); + + } elsif (ref $param eq 'HASH' || ref $param eq 'Bugzilla::Testopia::Environment::Xml'){ + $obj = $param; + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + + if(! ref $obj eq 'Bugzilla::Testopia::Environment::Xml'){ + + $self->get_environment_elements(); + my @elements = $self->{'elements'}; + + foreach my $elem (@elements) + { + foreach my $element (@$elem) + { + + my $elem_id = $element->{'element_id'}; + my @properties = $element->{'properties'}; + + foreach my $prop (@properties) + { + foreach my $property (@$prop) + { + my $prop_id = $property->{'property_id'}; + $property->{'value_selected'} = $self->get_value_selected($self->{'environment_id'},$elem_id,$prop_id); + } + } + } + } + } + + return $self; +} + + +=head2 get element list for environment + +Returns an array of element objects for an environment + +=cut + +sub get_environment_elements{ + my $dbh = Bugzilla->dbh; + my $self = shift; + + return $self->{'elements'} if exists $self->{'elements'}; + + my $id = $self->{'environment_id'}; + + my $ref = $dbh->selectcol_arrayref(qq{ + SELECT DISTINCT tee.element_id + FROM test_environment_map as tem + JOIN test_environment_element as tee + ON tem.element_id = tee.element_id + WHERE tem.environment_id = ?},undef,$id); + + my @elements; + + foreach my $val (@$ref){ + push @elements, Bugzilla::Testopia::Environment::Element->new($val); + } + $self->{'elements'} = \@elements; + + return \@elements; +} + +sub element_count { + my $self = shift; + + return scalar(@{$self->get_environment_elements}); +} + +sub elements_to_json { + my $self = shift; + + my $elements = $self->get_environment_elements; + my $json = '['; + + foreach my $element (@$elements) + { + $json .= '{title:"'. $element->{'name'} .'",'; + $json .= 'objectId:"'. $element->{'element_id'}. '",'; + $json .= 'widgetId:"element'. $element->{'element_id'} .'",'; + $json .= 'actionsDisabled:["addCategory","addValue","addChild"'; + $json .= ',"remove"' unless $self->canedit; + $json .= '],'; + $json .= 'isFolder:true,' if($element->check_for_children || $element->check_for_properties); + $json .= 'childIconSrc:"testopia/img/circle.gif"},'; + } + chop $json; + $json .= ']'; + + return $json; +} + + +=head2 get_value_selected + +Returns a selected value for the specified environment element property instance. + +=cut + +sub get_value_selected{ + my $dbh = Bugzilla->dbh; + my $self = shift; + + my ($environment,$element,$property) = (@_); + + my ($var) = $dbh->selectrow_array( + "SELECT value_selected + FROM test_environment_map + WHERE environment_id = ? + AND element_id = ? + AND property_id = ?", + undef,($environment,$element,$property)); + + return $var; +} + +=head2 get environment names + +Returns the list of environment names and ids + +=cut + +sub get_environments{ + my $dbh = Bugzilla->dbh; + my $self = shift; + + my $ref = $dbh->selectall_arrayref( + "SELECT environment_id, name + FROM test_environments"); + + return $ref; +} + +sub get_all_env_categories { + my $self = shift; + my ($byid) = @_; + my $dbh = Bugzilla->dbh; + my $idstr = $byid ? 'env_category_id' : 'DISTINCT name'; + my $ref = $dbh->selectall_arrayref( + "SELECT $idstr AS id, name + FROM test_environment_category", + {'Slice' => {}}); + + return $ref; +} + +sub get_all_visible_elements { + my $self = shift; + my ($byid) = @_; + my $dbh = Bugzilla->dbh; + my $idstr = $byid ? 'element_id' : 'DISTINCT name'; + my $ref = $dbh->selectall_arrayref( + "SELECT $idstr AS id, name + FROM test_environment_element", + {'Slice' => {}}); + + return $ref; +} + +sub get_all_element_properties { + my $self = shift; + my ($byid) = @_; + my $dbh = Bugzilla->dbh; + my $idstr = $byid ? 'property_id' : 'DISTINCT name'; + my $ref = $dbh->selectall_arrayref( + "SELECT $idstr AS id, name, validexp + FROM test_environment_property", + {'Slice' => {}}); + + return $ref; +} + +sub get_distinct_property_values { + my $self = shift; + my @exps; + foreach my $prop (@{$self->get_all_element_properties}){ + push @exps, split(/\|/, $prop->{'validexp'}) + } + my %seen; + foreach my $v (@exps){ + $seen{$v} = $v; + } + my @values; + foreach my $v (keys %seen){ + my %p; + $p{'id'} = $v; + $p{'name'} = $v; + push @values, \%p; + } + return \@values; +} + +=head2 get all elements + +Returns the list of element names, ids and category names + +=cut + +sub get_all_elements{ + + my $dbh = Bugzilla->dbh; + my $self = shift; + + my $ref = $dbh->selectcol_arrayref( + "SELECT tee.element_id + FROM test_environment_map as tem + JOIN test_environment_element as tee + ON tem.element_id = tee.element_id", + undef); + + my @elements; + + foreach my $val (@$ref){ + push @elements, Bugzilla::Testopia::Environment::Element->new($val); + } + + return \@elements; +} + +=head2 check environment name + +Returns environment id if environment exists + +=cut + +sub check_environment{ + my $self = shift; + my ($name, $product_id) = (@_); + + my $dbh = Bugzilla->dbh; + + my ($used) = $dbh->selectrow_array( + "SELECT environment_id + FROM test_environments + WHERE name = ? AND product_id = ?", + undef, ($name, $product_id)); + + return $used; +} + + +=head2 Check Environment Element Property Value Selected + +Returns environment id if Environment Element Property Value Selected exists + +=cut + +sub check_value_selected { + my $self = shift; + my ($prop_id, $elem_id) = @_; + my $dbh = Bugzilla->dbh; + + my ($used) = $dbh->selectrow_array( + "SELECT environment_id + FROM test_environment_map + WHERE environment_id = ? + AND property_id = ? + AND element_id = ?", + undef, ($self->{'environment_id'}, $prop_id, $elem_id)); + + return $used; +} + +=head2 store + +Serializes this environment to the database + +=cut + +sub store { + my $self = shift; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + #Verify Environment isn't already in use. + return undef if $self->check_environment($self->{'name'}, $self->{'product_id'}); + + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_environments ($columns) + VALUES (?,?,?,?)", + undef, (undef, $self->{'product_id'}, $self->{'name'}, $self->{'isactive'})); + my $key = $dbh->bz_last_key( 'test_environments', 'environment_id' ); + + my $elements = $self->{'elements'}; + + foreach my $element (@$elements) + { + $self->persist_environment_element_and_children(1, $element, "store"); + } + + return $key; +} + + +=head2 store property values + +Serializes the property values to the database + +=cut + +sub store_property_value { + my $self = shift; + + my ($prop_id,$elem_id,$value_selected) = @_; + + return 0 if ($self->check_value_selected($prop_id, $elem_id, $value_selected)); + + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_environment_map (environment_id,property_id,element_id,value_selected) + VALUES (?,?,?,?)",undef, ($self->{'environment_id'}, $prop_id, $elem_id,$value_selected)); + return 1; +} + +=head2 store environment name + +Serializes the environment name to the database + +=cut + +sub store_environment_name { + my $self = shift; + my ($name, $product_id) = (@_); + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + return undef if $self->check_environment($name, $product_id); + + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_environments ($columns) + VALUES (?,?,?,?)", undef, + (undef,$product_id,$name,1)); + return $dbh->bz_last_key( 'test_environments', 'environment_id' ); +} + +=head2 update + +Updates this environment object in the database. +Takes a reference to a hash whose keys match the fields of +an environment. + +=cut + +sub update { + my $self = shift; + my ($newvalues) = @_; + my $dbh = Bugzilla->dbh; + my $product_id; + + $dbh->bz_lock_tables('test_environments WRITE'); + foreach my $field (keys %{$newvalues}){ + if ($self->{$field} ne $newvalues->{$field}){ + # If the new name is already in use, return. + $product_id = $newvalues->{'product_id'} || $self->{'product_id'}; + unless ($product_id) { + $dbh->bz_unlock_tables; + return 0; + } + if ($field eq 'name' && $self->check_environment($newvalues->{'name'}, $product_id)) { + $dbh->bz_unlock_tables; + return 0; + } + trick_taint($newvalues->{$field}); + $dbh->do("UPDATE test_environments + SET $field = ? WHERE environment_id = ?", + undef, $newvalues->{$field}, $self->{'environment_id'}); + $self->{$field} = $newvalues->{$field}; + } + } + $dbh->bz_unlock_tables; + + my $elements = $self->{'elements'}; + + foreach my $element (@$elements) + { + $self->persist_environment_element_and_children(1, $element, "update"); + } + + return 1; +} + + +=head2 persist_environment_element_and_children + +Persists Environment Element and Children Recursively. + +=cut + +sub persist_environment_element_and_children { + my $self = shift; + my ($depth, $element, $method) = @_; + if ($depth > $max_depth) { + return; + } + $depth++; + my $elem_id = $element->{'element_id'}; + my $properties = $element->{'properties'}; + foreach my $property (@$properties) + { + my $prop_id = $property->{'property_id'}; + my $value_selected = $property->{'value_selected'}; + my ($value_stored) = $self->get_value_selected($self->{'environment_id'},$prop_id,$elem_id); + if ($method eq "store" || $value_stored eq undef) { + $self->store_property_value($prop_id,$elem_id,$value_selected); + } + else { + $self->update_property_value($prop_id,$elem_id,$value_selected); + } + } + my $children = $element->{'children'}; + foreach my $child_element (@$children) { + $self->persist_environment_element_and_children($depth, $child_element, $method); + } +} + + +=head2 update property value + +Updates the property of the element in the database + +=cut + +sub update_property_value { + + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + my $self = shift; + my ($propID, $elemID, $valueSelected) = (@_); + + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_environment_map + SET value_selected = ? WHERE environment_id = ? AND property_id = ? AND element_id = ?" + ,undef, ($valueSelected,$self->{'environment_id'},$propID,$elemID)); + return 1; +} + +=head2 toggle_hidden + +Toggles the archive bit on the build. + +=cut + +sub toggle_archive { + my $self = shift; + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_environments SET isactive = ? + WHERE environment_id = ?", undef, $self->isactive ? 0 : 1, $self->id); + +} + +sub delete_element { + my $self = shift; + my ($element_id) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->do("DELETE FROM test_environment_map + WHERE environment_id = ? AND element_id = ?", + undef,($self->id, $element_id)); + +} + +=head2 obliterate + +Completely removes this environment from the database. + +=cut + +sub obliterate { + my $self = shift; + return 0 unless $self->candelete; + my $dbh = Bugzilla->dbh; + + foreach my $obj (@{$self->runs}){ + $obj->obliterate; + } + foreach my $obj (@{$self->caseruns}){ + $obj->obliterate; + } + + $dbh->do("DELETE FROM test_environment_map WHERE environment_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_environments WHERE environment_id = ?", undef, $self->id); + return 1; +} + +=head2 get_run_list + +Returns a list of run ids associated with this environment. + +=cut + +sub get_run_list { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectcol_arrayref("SELECT run_id FROM test_runs + WHERE environment_id = ?", + undef, $self->{'environment_id'}); + return join(",", @{$ref}); +} + +=head2 get_run_count + +Returns a count of the runs associated with this environment + +=cut + +sub get_run_count { + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($count) = $dbh->selectrow_array("SELECT COUNT(run_id) FROM test_runs + WHERE environment_id = ?", + undef, $self->{'environment_id'}); + return $count; +} + +=head2 canedit + +Returns true if the logged in user has rights to edit this environment. + +=cut + +sub canedit { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers') && Bugzilla->user->can_see_product($self->product->name); + return 0; +} + +=head2 canview + +Returns true if the logged in user has rights to view this environment. + +=cut + +sub canview { + my $self = shift; + return 1 if Bugzilla->user->can_see_product($self->product->name); + return 0; +} + +=head2 candelete + +Returns true if the logged in user has rights to delete this environment. + +=cut + +sub candelete { + my $self = shift; + return 1 if Bugzilla->user->in_group("admin"); + return 0 unless Param("allow-test-deletion"); + return 0 unless Bugzilla->user->can_see_product($self->product->name); + return 1 if Bugzilla->user->in_group("Testers") && Param('testopia-allow-group-member-deletes'); + return 0; +} + +############################### +#### Accessors #### +############################### +=head2 id + +Returns the ID of this object + +=head2 name + +Returns the name of this object + +=cut + +sub id { return $_[0]->{'environment_id'}; } +sub product_id { return $_[0]->{'product_id'}; } +sub isactive { return $_[0]->{'isactive'}; } +sub name { return $_[0]->{'name'}; } + +=head2 product + +Returns the bugzilla product + +=cut + +sub product { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'product'} if exists $self->{'product'}; + + $self->{'product'} = Bugzilla::Product->new($self->{'product_id'}); + return $self->{'product'}; + +} + +=head2 runs + +Returns a reference to a list of test runs useing this environment + +=cut + +sub runs { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'runs'} if exists $self->{'runs'}; + + my $runids = $dbh->selectcol_arrayref("SELECT run_id FROM test_runs + WHERE environment_id = ?", + undef, $self->id); + my @runs; + foreach my $id (@{$runids}){ + push @runs, Bugzilla::Testopia::TestRun->new($id); + } + + $self->{'runs'} = \@runs; + return $self->{'runs'}; +} + +=head2 caseruns + +Returns a reference to a list of test caseruns useing this environment + +=cut + +sub caseruns { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'caseruns'} if exists $self->{'caseruns'}; + + my $ids = $dbh->selectcol_arrayref("SELECT case_run_id FROM test_case_runs + WHERE environment_id = ?", + undef, $self->id); + my @caseruns; + foreach my $id (@{$ids}){ + push @caseruns, Bugzilla::Testopia::TestCaseRun->new($id); + } + + $self->{'caseruns'} = \@caseruns; + return $self->{'caseruns'}; +} + +sub case_run_count { + my ($self,$status_id) = @_; + my $dbh = Bugzilla->dbh; + + my $query = "SELECT COUNT(case_run_id) FROM test_case_runs + WHERE environment_id = ?"; + $query .= " AND case_run_status_id = ?" if $status_id; + + my $count; + if ($status_id){ + $count = $dbh->selectrow_array($query, undef, ($self->id,$status_id)); + } + else { + $count = $dbh->selectrow_array($query, undef, $self->id); + } + + return $count; +} + +sub type { + my $self = shift; + $self->{'type'} = 'environment'; + return $self->{'type'}; +} + +=head1 TODO + + +=head1 SEE ALSO + +TestRun + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/Environment/Category.pm b/Bugzilla/Testopia/Environment/Category.pm new file mode 100644 index 0000000..5b29d59 --- /dev/null +++ b/Bugzilla/Testopia/Environment/Category.pm @@ -0,0 +1,559 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks +# Michael Hight +# Garrett Braden + +=head1 NAME + +Bugzilla::Testopia::Environment::Category - A test element category + +=head1 DESCRIPTION + +Categories are used to organize environment elements. + +=head1 SYNOPSIS + + $prop = Bugzilla::Testopia::Environment::Category->new($env_category_id); + $prop = Bugzilla::Testopia::Environment::Category->new(\%cat_hash); + +=cut + +package Bugzilla::Testopia::Environment::Category; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::Config; +use Bugzilla::User; +use Bugzilla::Constants; +use Bugzilla::Testopia::Environment::Element; +use Bugzilla::Testopia::Product; + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + env_category_id + product_id + name + +=cut + +use constant DB_COLUMNS => qw( + env_category_id + product_id + name + ); + +our $columns = join(", ", DB_COLUMNS); + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=head2 new + +Instantiates a new Category object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for the category class + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns + FROM test_environment_category + WHERE env_category_id = ?}, undef, $id); + } elsif (ref $param eq 'HASH'){ + $obj = $param; + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + return $self; +} + + +=head2 get element list by category + +Returns an array of element objects for a category + +=cut + +sub get_elements_by_category{ + my $self = shift; + + my $dbh = Bugzilla->dbh; + + my $ref = $dbh->selectcol_arrayref(qq{ + SELECT element_id + FROM test_environment_element + WHERE env_category_id = ?}, undef, $self->{'env_category_id'}); + + my @elements; + + foreach my $val (@$ref){ + push @elements, Bugzilla::Testopia::Environment::Element->new($val); + }; + + return \@elements; +} + +=head2 get_parent_elements + +Returns an array of parent elements by category + +=cut + +sub get_parent_elements{ + my $self = shift; + + my $dbh = Bugzilla->dbh; + +################## original +# Matches null for parent id +# +# my $ref = $dbh->selectcol_arrayref(qq{ +# SELECT element_id +# FROM test_environment_element +# WHERE env_category_id = ? AND parent_id is null }, undef, $self->{'env_category_id'}); +# +############### end original delete when ready + + +################## edited original +# Matches 0 for parent id +# +# my $ref = $dbh->selectcol_arrayref(qq{ +# SELECT element_id +# FROM test_environment_element +# WHERE env_category_id = ? AND parent_id = 0 }, undef, $self->{'env_category_id'}); +# +############### end edited original keep this one when ready + + +########### temp fix to address issues with 0 or null in test_envrionment_element parent_id column +##### matching null OR 0 + my $ref = $dbh->selectcol_arrayref(qq{ + SELECT element_id + FROM test_environment_element + WHERE env_category_id = ? AND (parent_id is null or parent_id = 0) }, undef, $self->{'env_category_id'}); +########### end temp fix.... delete when ready + + my @elements; + + foreach my $val (@$ref){ + push @elements, Bugzilla::Testopia::Environment::Element->new($val); + }; + + return \@elements; +} + +=head2 check_for_elements + +Returns 1 if a category has any elements + +=cut + +sub check_for_elements{ + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $ref = $dbh->selectrow_array(qq{ + SELECT 1 + FROM test_environment_element + WHERE env_category_id = ?}, undef, $self->{'env_category_id'}); + + return $ref; +} + +=head2 get_product_list + +Returns the product_id, product name, and count of categories + +=cut + +sub get_env_product_list{ + my $self = shift; + my ($class_id) = @_; + + my $dbh = Bugzilla->dbh; + my $query = "SELECT p.id, p.name, COUNT(tec.env_category_id) AS cat_count + FROM products p + LEFT JOIN group_control_map + ON group_control_map.product_id = p.id "; + + if (Param('useentrygroupdefault')) { + $query .= "AND group_control_map.entry != 0 "; + } else { + $query .= "AND group_control_map.membercontrol = " . + CONTROLMAPMANDATORY . " "; + } + if (%{Bugzilla->user->groups}) { + $query .= "AND group_id NOT IN(" . + join(',', values(%{Bugzilla->user->groups})) . ") "; + } + + $query .= "LEFT OUTER JOIN test_environment_category AS tec + ON p.id = tec.product_id "; + $query .= "WHERE group_id IS NULL "; + $query .= "AND classification_id = ? " if $class_id; + $query .= "GROUP BY p.id + ORDER BY p.name"; + + + my $ref; + if($class_id){ + $ref = $dbh->selectall_arrayref($query, {'Slice' => {}}, $class_id); + } + else{ + $ref = $dbh->selectall_arrayref($query, {'Slice' => {}}); + } + unshift @$ref, {'id' => 0, 'name' => '--ANY PRODUCT--', 'cat_count' => $self->get_all_child_count }; + return $ref; + +} + +sub get_all_child_count { + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($all_count) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_environment_category + WHERE product_id = 0"); + + return $all_count; +} + +sub product_categories_to_json { + my $self = shift; + my ($product_id, $disable_move) = @_; + detaint_natural($product_id); + $disable_move = ',"addChild","move"' if $disable_move; + my $json = "["; + foreach my $cat (@{$self->get_element_categories_by_product($product_id)}){ + $json .= '{title:"' . $cat->name . '",'; + $json .= 'isFolder:' . ($cat->check_for_elements() ? "true" : "false") . ','; + $json .= 'objectId:"' . $cat->id . '",'; + $json .= 'widgetId:"category' . $cat->id . '",'; + $json .= 'actionsDisabled:["addCategory","addProperty","addValue"'; + $json .= $disable_move if $disable_move; + $json .= ',"remove"' unless $cat->candelete; + $json .= '],'; + $json .= 'childIconSrc:"testopia/img/square.gif"},'; + } + chop $json; + $json .= "]"; + return $json; +} + +=head2 get_element_categories_by_product + +Returns the list of element category names and ids by product id + +=cut + +sub get_element_categories_by_product{ + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($product_id) = (@_); + + my $ref = $dbh->selectcol_arrayref( + "SELECT env_category_id + FROM test_environment_category + WHERE product_id = ?", + undef, $product_id); + my @objs; + foreach my $id (@{$ref}){ + push @objs, Bugzilla::Testopia::Environment::Category->new($id); + } + return \@objs; +} + + +=head2 new_category_count + +Returns 1 if element has children + +=cut + +sub new_category_count{ + my $self = shift; + my ($prod_id) = @_; + $prod_id ||= $self->{'product_id'}; + my $dbh = Bugzilla->dbh; + + my ($used) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_environment_category + WHERE name like 'New category%' + AND product_id = ?", + undef, $prod_id); + + return $used + 1; +} + +sub elements_to_json { + my $self = shift; + my ($disable_add) = @_; + $disable_add = ',"addChild"' if $disable_add; + + my $elements = $self->get_parent_elements; + my $json = '['; + + foreach my $element (@$elements) + { + $json .= '{title:"'. $element->{'name'} .'",'; + $json .= 'objectId:"'. $element->{'element_id'}. '",'; + $json .= 'widgetId:"element'. $element->{'element_id'} .'",'; + $json .= 'actionsDisabled:["addCategory","addValue"'; + $json .= $disable_add if $disable_add; + $json .= ',"remove"' unless $element->candelete; + $json .= '],'; + $json .= 'isFolder:true,' if($element->check_for_children || $element->check_for_properties); + $json .= 'childIconSrc:"testopia/img/circle.gif"},'; + } + chop $json; + $json .= ']'; + + return $json; +} + +=head2 check_category + +Returns category id if a category exists + +=cut + +sub check_category{ + my $dbh = Bugzilla->dbh; + my $self = shift; + my ($name, $prodID) = (@_); + + $prodID ||= $self->product_id; + + my ($used) = $dbh->selectrow_array( + "SELECT env_category_id + FROM test_environment_category + WHERE name = ? AND product_id = ?", + undef,($name,$prodID)); + + return $used; +} + +=head2 check_category_by_id + +Returns category name if a category id exists + +=cut + +sub check_category_by_id{ + my $dbh = Bugzilla->dbh; + my $self = shift; + my ($id) = (@_); + + my ($used) = $dbh->selectrow_arrayref(qq{ + SELECT name + FROM test_environment_category + WHERE env_category_id = ?},undef,$id); + + return $used; +} + + +=head2 store + +Serializes this category to the database and returns the key or 0 + +=cut + +sub store { + my $self = shift; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + return 0 if $self->check_category($self->{'name'},$self->{'product_id'}); + + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_environment_category ($columns) + VALUES (?,?,?)",undef, (undef, $self->{'product_id'},$self->{'name'})); + my $key = $dbh->bz_last_key( 'test_environment_category', 'env_category_id' ); + + return $key; +} + +=head2 set_name + +Updates the category name in the database + +=cut + +sub set_name { + my $self = shift; + my ($name) = (@_); + my $dbh = Bugzilla->dbh; + + return undef if $self->check_category($name); + + $dbh->do("UPDATE test_environment_category SET name = ? + WHERE env_category_id = ? AND product_id = ?", + undef, ($name, $self->{'env_category_id'},$self->{'product_id'})); + return 1; +} + +=head2 set_product + +Updates the category in the database + +=cut + +sub set_product { + my $self = shift; + my ($product_id) = (@_); + + return if ($product_id == $self->{'product_id'}); + + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_environment_category SET product_id = ? + WHERE env_category_id = ? AND product_id = ?", + undef, ($product_id, $self->{'env_category_id'},$self->{'product_id'})); + return 1; +} + +=head2 obliterate + +Completely removes the element category entry from the database. + +=cut + +sub obliterate { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $children = $dbh->selectcol_arrayref( + "SELECT element_id FROM test_environment_element + WHERE env_category_id = ?", undef, $self->id); + + foreach my $id (@$children){ + my $element = Bugzilla::Testopia::Environment::Element->new($id); + $element->obliterate; + } + $dbh->do("DELETE FROM test_environment_category WHERE env_category_id = ?", undef, $self->id); + return 1; + +} + +sub canview { + my $self = shift; + return 1 if ($self->product_id == 0); + return 1 if Bugzilla->user->can_see_product($self->product->name); + return 0; +} + +sub canedit { + my $self = shift; + if ($self->product_id == 0){ + return 1 if Bugzilla->user->in_group('Testers'); + return 0; + } + return 1 if $self->product->canedit; + return 0; +} + +sub candelete { + my $self = shift; + return 0 unless $self->canedit; + my $dbh = Bugzilla->dbh; + my $used = $dbh->selectrow_array( + "SELECT 1 FROM test_environment_map AS tem + JOIN test_environment_element AS tee ON tee.element_id = tem.element_id + WHERE tee.env_category_id = ?", + undef, $self->id); + return !$used; + +} + +############################### +#### Accessors #### +############################### +=head2 id + +Returns the ID of this category + +=head2 name + +Returns the name of this category + +=head2 product_id + +Returns the product_id of this category + +=cut + +sub id { return $_[0]->{'env_category_id'}; } +sub name { return $_[0]->{'name'}; } +sub product_id { return $_[0]->{'product_id'}; } + +sub product { + my $self = shift; + + $self->{'product'} = Bugzilla::Testopia::Product->new($self->product_id); + return $self->{'product'}; +} + +=head2 type + +Returns 'env_category' + +=cut + +sub type { + my $self = shift; + $self->{'type'} = 'env_category'; + return $self->{'type'}; +} +1; diff --git a/Bugzilla/Testopia/Environment/Element.pm b/Bugzilla/Testopia/Environment/Element.pm new file mode 100644 index 0000000..8a7db50 --- /dev/null +++ b/Bugzilla/Testopia/Environment/Element.pm @@ -0,0 +1,520 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks +# Michael Hight +# Garrett Braden + +=head1 NAME + +Bugzilla::Testopia::Environment::Element - A test environment element + +=head1 DESCRIPTION + +Environment elements are a set of environment entities that dictate +the conditions a test was conducted in. Each environment must have an +element. Elements can be very simple or very complex by adding properties. +Elements can have child elements. + +=head1 SYNOPSIS + + $elem = Bugzilla::Testopia::Environment::Element->new($elem_id); + $elem = Bugzilla::Testopia::Environment::Element->new(\%elem_hash); + +=cut + +package Bugzilla::Testopia::Environment::Element; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::User; +use Bugzilla::Testopia::Product; +use JSON; + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + element_id + env_category_id + name + parent_id + isprivate + +=cut + +use constant DB_COLUMNS => qw( + element_id + env_category_id + name + parent_id + isprivate +); + +our $columns = join(", ", DB_COLUMNS); + +our constant $max_depth = 5; + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=head2 new + +Instantiates a new Element object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for the element class + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref( + "SELECT $columns + FROM test_environment_element + WHERE element_id = ?", undef, $id); + } elsif (ref $param eq 'HASH'){ + $obj = $param; + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + + $self->get_properties(); + + return $self; +} + +=head2 get_children + +Returns an array of the children objects for an element and recursively +gets all of their children until exhausted. + +=cut + +sub get_children{ + my $dbh = Bugzilla->dbh; + my $self = shift; + + return $self->{'children'} if exists $self->{'children'}; + + my %newvalues = (@_); + my $depth = $max_depth; + + if(%newvalues) + { + $depth = $newvalues{'depth'}; + } + + $depth--; + + if($depth == 0) + {return;} + + my $id = $self->{'element_id'}; + + my $ref = $dbh->selectcol_arrayref(qq{ + SELECT tee.element_id + FROM test_environment_element as tee + WHERE tee.parent_id = ?},undef,$id); + + my @children; + + foreach my $val (@$ref){ + my $child = Bugzilla::Testopia::Environment::Element->new($val); + $child->get_children('depth'=>$depth); + push(@children,$child); + } + + $self->{'children'} = \@children; + +} + +=head2 get_properties + +Returns an array of the property objects for an element. + +=cut + +sub get_properties{ + my $dbh = Bugzilla->dbh; + my $self = shift; + + my $ref = $dbh->selectcol_arrayref(qq{ + SELECT tep.property_id + FROM test_environment_property as tep + WHERE tep.element_id = ?},undef,($self->{'element_id'})); + + my @properties; + + foreach my $val (@$ref){ + my $property = Bugzilla::Testopia::Environment::Property->new($val); + push(@properties,$property); + } + + $self->{'properties'} = \@properties; + return $self->{'properties'}; + +} + +=head2 check_element + +Returns element id if element exists + +=cut + +sub check_element{ + my $dbh = Bugzilla->dbh; + my $self = shift; + my ($name, $cat_id) = @_; + + # Since categories are uniquely identified by product_id we don't have to check by join on the product_id. + my ($used) = $dbh->selectrow_array( + "SELECT element_id + FROM test_environment_element + WHERE name = ? + AND env_category_id = ?", + undef,($name,$cat_id)); + + return $used; +} + +=head2 check_for_children + +Returns 1 if element has children + +=cut + +sub check_for_children{ + my $dbh = Bugzilla->dbh; + my $self = shift; + + my ($has_element) = $dbh->selectrow_array( + "SELECT 1 + FROM test_environment_element + WHERE parent_id = ?", + undef, $self->{'element_id'}); + + my ($has_property) = $dbh->selectrow_array( + "SELECT 1 + FROM test_environment_property + WHERE element_id = ?", + undef, $self->{'element_id'}); + + return $has_element || $has_property; +} + +sub children_to_json{ + my $self = shift; + my ($disable_move) = @_; + + $disable_move = ',"addChild","move","remove"' if $disable_move; + my $disable_add = ',"addChild"' if $disable_move; + my $elements = $self->get_children; + my $properties = $self->get_properties; + my $json = '['; + + foreach my $elem (@$elements) + { + $json .= '{title:"' . $elem->{'name'} . '",'; + $json .= 'objectId:"' . $elem->{'element_id'} . '",'; + $json .= 'widgetId:"element' . $elem->{'element_id'} . '",'; + $json .= 'actionsDisabled:["addCategory","addValue"'; + $json .= $disable_add if $disable_add; + $json .=',"remove"' unless $elem->candelete; + $json .= '],'; + $json .= 'isFolder:true,' if $elem->check_for_children(); + $json .= 'childIconSrc:"testopia/img/circle.gif"},'; + } + foreach my $prop (@$properties) + { + $json .= '{title: "' . $prop->{'name'} .'",'; + $json .= 'objectId:"' . $prop->{'property_id'} . '",'; + $json .= 'widgetId:"property' . $prop->{'property_id'} . '",'; + $json .= 'actionsDisabled:["addCategory","addElement","addProperty"'; + $json .= $disable_move if $disable_move; + $json .= ',"remove"' unless $prop->candelete; + $json .= '],'; + $json .= 'isFolder:true,' if($prop->check_for_validexp($prop)); + $json .= 'childIconSrc:"testopia/img/triangle.gif"},'; + } + chop $json if ($json ne '['); + $json .= ']'; + + return $json; +} + +=head2 new_element_count + +Returns 1 if element has children + +=cut + +sub new_element_count{ + my $self = shift; + my ($cat_id) = @_; + $cat_id ||= $self->{'env_category_id'}; + my $dbh = Bugzilla->dbh; + + my ($used) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_environment_element + WHERE name like 'New element%' + AND env_category_id = ?", + undef, $cat_id); + + return $used + 1; +} + +=head2 check_for_properties + +Returns 1 if element has properties + +=cut + +sub check_for_properties{ + my $dbh = Bugzilla->dbh; + my $self = shift; + + my ($used) = $dbh->selectrow_array(qq{ + SELECT 1 + FROM test_environment_property + WHERE element_id = ? },undef,$self->{'element_id'}); + + return $used; +} + + +=head2 store + +Serializes the new element to the database and returns the primary key or 0 + +=cut + +sub store { + my $self = shift; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + # Verify name is available + return undef if $self->check_element($self->{'name'},$self->{'env_category_id'}); + + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_environment_element ($columns) + VALUES (?,?,?,?,?)", + undef, (undef, $self->{'env_category_id'}, $self->{'name'}, + $self->{'parent_id'},$self->{'isprivate'})); + my $key = $dbh->bz_last_key('test_environment_element', 'element_id'); + return $key; +} + + + +=head2 update_element_name + +Updates the element in the database + +=cut + +sub update_element_name { + my $self = shift; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + my ($name) = (@_); + + return 0 if check_element($name, $self->{'env_category_id'}); + + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_environment_element + SET name = ? WHERE element_id = ?",undef, ($name,$self->{'element_id'} )); + return 1; +} + +=head2 update_element_category + +Updates the category of the element in the database + +=cut + +sub update_element_category { + my $self = shift; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + my ($catid) = (@_); + + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_environment_element + SET env_category_id = ? WHERE element_id = ?",undef, ($catid,$self->{'element_id'} )); + return 1; +} + + +=head2 update_element_parent + +Updates the parent_id of the element in the database + +=cut + +sub update_element_parent { + my $self = shift; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + my ($parent_id) = (@_); + + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_environment_element + SET parent_id = ? WHERE element_id = ?",undef, ($parent_id,$self->{'element_id'} )); + return 1; +} + +=head2 obliterate + +Completely removes the element entry from the database. + +=cut + +sub obliterate { + my $self = shift; + my $dbh = Bugzilla->dbh; + + foreach my $p (@{$self->get_properties}){ + $p->obliterate; + } + + $dbh->do("DELETE FROM test_environment_map + WHERE element_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_environment_element + WHERE element_id = ?", undef, $self->{'element_id'}); + + return 1; +} + +sub canview { + my $self = shift; + return 1 if $self->get_parent->canview; + return 0; +} + +sub canedit { + my $self = shift; + return 1 if $self->get_parent->canedit; + return 0; +} + +sub candelete { + my $self = shift; + return 0 unless $self->canedit; + my $dbh = Bugzilla->dbh; + my $used = $dbh->selectrow_array("SELECT 1 FROM test_environment_map + WHERE element_id = ?", + undef, $self->id); + return !$used; + +} + +############################### +#### Accessors #### +############################### +=head2 id + +Returns the ID of this object + +=head2 name + +Returns the name of this object + +=head2 product_id + +Returns the product_id of this object + +=head2 env_category_id + +Returns the category_id associated with this element + +=head2 parent_id + +Returns the element's parent_id associated with this element + + +=cut + +sub id { return $_[0]->{'element_id'}; } +sub name { return $_[0]->{'name'}; } +sub product_id { return $_[0]->{'product_id'}; } +sub env_category_id { return $_[0]->{'env_category_id'}; } +sub parent_id { return $_[0]->{'parent_id'}; } +sub isprivate { return $_[0]->{'isprivate'}; } + +sub get_parent { + my $self = shift; + if ($self->{'parent_id'}){ + return $self->new($self->{'parent_id'}); + } + else { + return Bugzilla::Testopia::Environment::Category->new($self->{'env_category_id'}); + } +} + +sub product { + my $self = shift; + return $self->{'product'} if exists $self->{'product'}; + $self->{'product'} = Bugzilla::Testopia::Product->new($self->product_id); + return $self->{'product'}; +} + + +=head2 type + +Returns 'element' + +=cut + +sub type { + my $self = shift; + $self->{'type'} = 'element'; + return $self->{'type'}; +} +1; diff --git a/Bugzilla/Testopia/Environment/Property.pm b/Bugzilla/Testopia/Environment/Property.pm new file mode 100644 index 0000000..f4cc404 --- /dev/null +++ b/Bugzilla/Testopia/Environment/Property.pm @@ -0,0 +1,398 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks +# Michael Hight +# Garrett Braden + +=head1 NAME + +Bugzilla::Testopia::Environment::Property - A test environment element property + +=head1 DESCRIPTION + +Element properties describe the elements in more detail. An +element can have an unlimited number of properties to describe it. +The valid expression limits the possible descriptions to valid choices +for each property. + +=head1 SYNOPSIS + + $prop = Bugzilla::Testopia::Environment::Property->new($prop_id); + $prop = Bugzilla::Testopia::Environment::Property->new(\%prop_hash); + +=cut + +package Bugzilla::Testopia::Environment::Property; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::User; +use Bugzilla::Testopia::Environment::Element; + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + property_id + element_id + name + validexp + +=cut + +use constant DB_COLUMNS => qw( + property_id + element_id + name + validexp + ); + +our $columns = join(", ", DB_COLUMNS); + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=head2 new + +Instantiates a new Property object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for the property class + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns + FROM test_environment_property + WHERE property_id = ?}, undef, $id); + } elsif (ref $param eq 'HASH'){ + $obj = $param; + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + return $self; +} + + +=head2 check_property + +Returns id if a property exists + +=cut + +sub check_property{ + my $self = shift; + my ($name, $element_id) = @_; + my $dbh = Bugzilla->dbh; + + unless ($name && $element_id) { + return "check_product must be passed a valid name and product_id"; + } + + my ($used) = $dbh->selectrow_array(qq{ + SELECT property_id + FROM test_environment_property + WHERE name = ? AND element_id = ?},undef,$name,$element_id); + + return $used; +} + +=head2 check_for_validexp + +Returns 1 if a validexp exist for the property + +=cut + +sub check_for_validexp{ + my $self = shift; + my $name = (@_); + my $dbh = Bugzilla->dbh; + + my ($used) = $dbh->selectrow_array(qq{ + SELECT 1 + FROM test_environment_property + WHERE property_id = ? AND (validexp IS NOT NULL AND validexp <> '')},undef,$self->{'property_id'}); + + return $used; +} + +=head2 new_property_count + +Returns the count + 1 of new properties + +=cut + +sub new_property_count{ + my $self = shift; + my ($element_id) = @_; + $element_id ||= $self->{'element_id'}; + my $dbh = Bugzilla->dbh; + + my ($used) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_environment_property + WHERE name like 'New property%' + AND element_id = ?", + undef, $element_id); + + return $used + 1; +} + +=head2 get_validexp + +Returns the validexp for the property + +=cut + +sub get_validexp{ + my $self = shift; + my $name = (@_); + my $dbh = Bugzilla->dbh; + + my $validexp = $dbh->selectrow_arrayref(qq{ + SELECT validexp + FROM test_environment_property + WHERE property_id = ? },undef,$self->{'property_id'}); + + return $validexp; +} + + +=head2 store + +Serializes the new property to the database + +=cut + +sub store { + my $self = shift; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + # Verify name is available + return undef if $self->check_property($self->{'name'}, $self->{'element_id'}); + + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_environment_property ($columns) + VALUES (?,?,?,?)",undef, (undef, $self->{'element_id'}, $self->{'name'}, $self->{'validexp'})); + my $key = $dbh->bz_last_key( 'test_plans', 'plan_id' ); + return $key; +} + +=head2 set_name + +Updates the property name in the database + +=cut + +sub set_name { + my $self = shift; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + my ($name) = (@_); + + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_environment_property + SET name = ? WHERE property_id = ?",undef, ($name,$self->{'property_id'} )); + return 1; +} + + +=head2 set_element + +Updates the elmnt_id in the database + +=cut + +sub set_element { + my $self = shift; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + my ($id) = (@_); + + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_environment_property + SET element_id = ? WHERE property_id = ?",undef, ($id,$self->{'property_id'} )); + return 1; +} + +=head2 update_property_validexp + +Updates the property valid expression in the database + +=cut + +sub update_property_validexp { + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + my $self = shift; + my ($validexp) = (@_); + + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_environment_property + SET validexp = ? WHERE property_id = ?",undef, ($validexp,$self->{'property_id'} )); + return 1; +} + +sub valid_exp_to_json { + my $self = shift; + my ($disable_move, $env_id) = @_; + my $env = Bugzilla::Testopia::Environment->new($env_id) if $env_id; + + $disable_move = $disable_move ? ',"addChild","move","remove"' : ''; + my $validexp = $self->get_validexp; + + my @validexpressions = split(/\|/, @$validexp[0]); + + my $json = '['; + + foreach (@validexpressions) + { + $json .= '{title: "' . $_ . '",'; + $json .= 'widgetId:"validexp' . $self->id . '~'. $_ .'",'; + $json .= 'actionsDisabled:["addCategory","addElement","addProperty","addValue"'. $disable_move .'],'; + $json .= 'objectId:"' . $self->id . '~' . $_ . '",'; + if ($env && $env->get_value_selected($env->id, $self->element_id, $self->id) eq $_){ + $json .= 'childIconSrc:"testopia/img/selected_value.png"},'; + } + else{ + $json .= 'childIconSrc:""},'; + } + } + chop $json; + $json .= ']'; + + return $json; +} + +=head2 obliterate + +Completely removes the element property entry from the database. + +=cut + +sub obliterate { + my $self = shift; + my $dbh = Bugzilla->dbh; + + $dbh->do("DELETE FROM test_environment_map + WHERE property_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_environment_property + WHERE property_id = ?", undef, $self->id); + + return 1; + +} + +sub canview { + my $self = shift; + my $element = Bugzilla::Testopia::Environment::Element->new($self->element_id); + return 1 if $element->canview; + return 0; +} + +sub canedit { + my $self = shift; + my $element = Bugzilla::Testopia::Environment::Element->new($self->element_id); + return 1 if $element->canedit; + return 0; +} + +sub candelete { + my $self = shift; + return 0 unless $self->canedit; + my $dbh = Bugzilla->dbh; + my $used = $dbh->selectrow_array("SELECT 1 FROM test_environment_map + WHERE property_id = ?", + undef, $self->id); + return !$used; + +} + +############################### +#### Accessors #### +############################### +=head2 id + +Returns the ID of this object + +=head2 name + +Returns the name of this object + +=head2 validexp + +Returns the valid expression associated with this property + +=head2 element_id + +Returns the element's id associated with this property + + +=cut + +sub id { return $_[0]->{'property_id'}; } +sub name { return $_[0]->{'name'}; } +sub validexp { return $_[0]->{'validexp'}; } +sub element_id { return $_[0]->{'element_id'}; } + + +=head2 type + +Returns 'property' + +=cut + +sub type { + my $self = shift; + $self->{'type'} = 'property'; + return $self->{'type'}; +} + +1; \ No newline at end of file diff --git a/Bugzilla/Testopia/Environment/Xml.pm b/Bugzilla/Testopia/Environment/Xml.pm new file mode 100644 index 0000000..157dc6b --- /dev/null +++ b/Bugzilla/Testopia/Environment/Xml.pm @@ -0,0 +1,585 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Garrett Braden + + +=head1 NAME + +Bugzilla::Testopia::Environment::Xml - An XML representation of the Environment Object. + +=head1 DESCRIPTION + +This module is used to import and export environments via XML. It can parse an XML representation +of a Testopia Environment and persist it to the database. An Environment.pm XML object can be +initialized using new and passing it an XML scalar. It can also take two other parameters: + + $admin - a boolean that automatically will store the imported environment to the database. + $max_depth - the max depth of child elements to import. + +Example: + my $env_xml = Bugzilla::Testopia::Environment::Xml->new($xml, 1, 5); + +Other subroutines can be called on the object. For example: + parse - takes the same three parameters as new + store - stores the imported xml Environment object to the database + +Misc. Other: + the module also contains two other valueable fields on it's hash: + $self->{'message'} - running list of valueable information upon parsing and storing + $self->{'error'} - running list of error messages upon parsing and storing + One other method exists(check_new_items) to check if there are new Elements, Properties, Categories, + and Selected Values and returns a scalar value report of the new items not present in the database. + +Import XML Environment Implementation Example: see tr_import_environment.cgi + +To export an environment by env_id to XML use export + +Example: + my $xml = Bugzilla::Testopia::Environment::Xml->export($env_id); + +Export Environment XML Implementation Example: see tr_export_environment.cgi + +=head1 SYNOPSIS + +use Bugzilla::Testopia::Environment::Xml; + +=cut + +package Bugzilla::Testopia::Environment::Xml; + +#************************************************** Uses ****************************************************# +use strict; +use warnings; +use CGI; +use lib "."; +use XML::Twig; +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Product; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Product; +use Bugzilla::Testopia::Environment::Category; +use Bugzilla::Testopia::Environment::Element; +use Bugzilla::Testopia::Environment::Property; + +our constant $max_depth = 7; + + +=head2 new + +Instantiates a new Bugzilla::Testopia::Environment::Xml object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + + +=head2 _init + +Private constructor for the Bugzilla::Testopia::Environment::XML class + +=cut + +sub _init { + my ($self, $xml, $admin, $depth) = @_; + if (ref $xml eq 'HASH') { + $self = $xml; + } + elsif($xml) { + parse($self, $xml, $admin, $depth); + } + return undef unless (defined $xml); + return $self; +} + + +=head2 Parse Environment + +=head2 DESCRIPTION + +Parses the Environment XML + +=cut + +sub parse() { + my ($self, $xml, $admin, $depth) = @_; + + if($depth eq undef) { + $self->{'max_depth'} = $max_depth; + } + else { + $self->{'max_depth'} = $depth + } + if ($admin) { + $self->{'message'} = "Importing XML Environment...
"; + } + else { + $self->{'message'} = "Parsing and Validating XML Environment...
"; + } + $self->{'error'} = undef; + if ($xml) { + trick_taint($xml); + } + my $twig = XML::Twig->new(); + $twig->parse($xml); + my $root = $twig->root; + # Checking if Product and Environment already exist. + my $product_name = $root->{'att'}->{'product'}; + my $product_id; + if (lc($product_name) eq "--all--") { + $self->{'message'} .= "..Using the --ANY PRODUCT-- PRODUCT.
"; + $product_id = 0; + } + else { + $self->{'message'} .= "..Checking if $product_name PRODUCT already exists..."; + ($product_id) = Bugzilla::Testopia::Product->check_product_by_name($product_name); + if ($product_id) { + $self->{'message'} .= "EXISTS.
"; + } + else { + $self->{'message'} .= "DOESN'T EXIST.
Importing XML Environment Failed!
"; + $self->{'error'} .= "$product_name PRODUCT doesn't exist. Please be sure to use an existing product.
"; + return 0; + } + } + ($self->{'product_id'}) = $product_id; + $self->{'product_name'} = $product_name; + my $environment_name = $root->{'att'}->{'name'}; + $self->{'name'} = $environment_name; + $self->{'message'} .= "..Checking if $environment_name ENVIRONMENT NAME already exists for the $product_name PRODUCT..."; + my $environment = Bugzilla::Testopia::Environment->new({}); + my ($env_id) = $environment->check_environment($environment_name, $product_id); + my $environment_id; + if ($env_id < 1) { + $self->{'message'} .= "DOESN'T EXIST
"; + # Storing New Environment if Admin + if ($admin) { + $self->{'message'} .= "....Storing new $environment_name ENVIRONMENT NAME in the $self->{'product_name'} PRODUCT..."; + $environment->{'name'} = $environment_name; + ($environment_id) = Bugzilla::Testopia::Environment->store_environment_name($self->{'name'}, $product_id); + $self->{'message'} .= "DONE.
"; + } + } + else { + ($environment_id) = $env_id; + $self->{'message'} .= "EXISTS
Importing XML Environment Failed!
"; + $self->{'error'} .= "$environment_name ENVIRONMENT NAME already exists for the $product_name PRODUCT. Please use another name."; + return 0; + } + ($self->{'environment_id'}) = $environment_id; + ($environment->{'product_id'}) = $self->{'product_id'}; + # Parse recursively through the nested child elements. + foreach my $twig_category ($root->children("category")) { + my $category_name = $twig_category->{'att'}->{'name'}; + # Makes sure to get the category_id by name and product_id + my $category = Bugzilla::Testopia::Environment::Category->new({}); + my ($cat_id) = $category->check_category($category_name, $product_id); + my $category_id; + # Checking if Categories already exist. + $self->{'message'} .= "..Checking if $category_name CATEGORY already exists..."; + if ($cat_id < 1) { + $self->{'message'} .= "DOESN'T EXIST.
"; + my $new_category_names = $self->{'new_category_names'}; + push (@$new_category_names, $category_name); + $self->{'new_category_names'} = $new_category_names; + # Storing New Categories if Admin + if ($admin) { + $self->{'message'} .= "....Storing new $category_name CATEGORY in the $self->{'product_name'} PRODUCT..."; + ($category->{'product_id'}) = $product_id; + $category->{'name'} = $category_name; + ($category_id) = $category->store(); + $self->{'message'} .= "DONE.
"; + } + } + else { + ($category_id) = $cat_id; + $self->{'message'} .= "EXISTS.
"; + } + foreach my $twig_element ($twig_category->children("element")) { + my $element = $self->parse_child_elements(1, $category_id, $category_name, $twig_element, $admin); + my $elements = $self->{'elements'}; + push (@$elements, $element); + $self->{'elements'} = $elements; + } + } + if ($admin) { + $self->{'message'} .= "Finished Importing XML Environment!
"; + } + else { + $self->{'message'} .= "Finished Parsing and Validating XML Environment!
"; + } +} + + +=head2 Parse Children Elements + +=head2 DESCRIPTION + +Parses through elements and their children elements recursively + +=cut + +sub parse_child_elements() { + my ($self, $depth, $env_category_id, $category_name, $twig_element, $admin, $parent_element) = @_; + if ($depth > $self->{'max_depth'}) { + return; + } + $depth++; + my $element_name = $twig_element->{'att'}->{'name'}; + # Checking if Elements already exist. + for (my $i = 1; $i < $depth; $i++) { + $self->{'message'} .= "...."; + } + $self->{'message'} .= "Checking if $element_name ELEMENT already exists in the $category_name CATEGORY..."; + my ($product_id) = $self->{'product_id'}; + my $element = Bugzilla::Testopia::Environment::Element->new({}); + my ($elem_id) = $element->check_element($element_name, $env_category_id); + my $element_id; + if ($elem_id < 1) { + $self->{'message'} .= "DOESN'T EXIST.
"; + my $new_category_elements = $self->{'new_category_elements'}; + my $new_category_element = {'env_category_id' => $env_category_id, 'category_name' => $category_name, 'element_name' => $element_name}; + push (@$new_category_elements, $new_category_element); + $self->{'new_category_elements'} = $new_category_elements; + # Storing New Elements if Admin + if ($admin) { + for (my $i = 1; $i < $depth; $i++) { + $self->{'message'} .= "...."; + } + $self->{'message'} .= "..Storing new $element_name ELEMENT in the $category_name CATEGORY..."; + ($element->{'env_category_id'}) = $env_category_id; + $element->{'name'} = $element_name; + ($element->{'product_id'}) = $self->{'product_id'}; + $element->{'isprivate'} = 0; + if ($parent_element) { + $element->{'parent_id'} = $parent_element->{'element_id'}; + } + ($element_id) = $element->store(); + $self->{'message'} .= "DONE.
"; + } + } + else { + ($element_id) = $elem_id; + $self->{'message'} .= "EXISTS.
"; + } + ($element->{'element_id'}) = $element_id; + ($element->{'env_category_id'}) = $env_category_id; + $element->{'name'} = $element_name; + ($element->{'parent_id'}) = $parent_element->{'parent_id'}; + my @properties; + foreach my $twig_property ($twig_element->children("property")) { + my $property_name = $twig_property->{'att'}->{'name'}; + # Checking if Properties already exist. + for (my $i = 1; $i < $depth; $i++) { + $self->{'message'} .= "...."; + } + $self->{'message'} .= "....Checking if $property_name PROPERTY already exists..."; + my $property = Bugzilla::Testopia::Environment::Property->new({}); + my ($prop_id) = $property->check_property($property_name, $element_id); + my $property_id; + if ($prop_id < 1) { + $self->{'message'} .= "DOESN'T EXIST.
"; + my $new_property_names = $self->{'new_property_names'}; + push (@$new_property_names, $property_name); + $self->{'new_property_names'} = $new_property_names; + # Storing New Property if Admin + if ($admin) { + for (my $i = 1; $i < $depth; $i++) { + $self->{'message'} .= "...."; + } + $self->{'message'} .= "......Storing new $property_name PROPERTY..."; + $property->{'name'} = $property_name; + ($property->{'element_id'}) = $element_id; + ($property_id) = $property->store(); + $self->{'message'} .= "DONE.
"; + } + } + else { + ($property_id) = $prop_id; + $self->{'message'} .= "EXISTS.
"; + } + $property = Bugzilla::Testopia::Environment::Property->new($property_id); + # Checking if new Selected Value and Valid Expression exist. + my $validexp; + if ($property) { + $validexp = $property->validexp(); + } + my $value = $twig_property->field('value'); + for (my $i = 1; $i < $depth; $i++) { + $self->{'message'} .= "...."; + } + $self->{'message'} .= "........Checking if $value VALUE exists in the list of selectable values..."; + if ( $validexp !~ m/$value/) { + $self->{'message'} .= "DOESN'T EXIST.
"; + if ($admin) { + if (!defined($validexp)) { + for (my $i = 1; $i < $depth; $i++) { + $self->{'message'} .= "...."; + } + $self->{'message'} .= "..........Setting $value VALID EXPRESSION equal to the VALUE for the first time..."; + $validexp = $value; + } + else { + for (my $i = 1; $i < $depth; $i++) { + $self->{'message'} .= "...."; + } + $self->{'message'} .= "..........Adding $value VALUE to the VALID EXPRESSION..."; + $validexp = "$validexp | $value"; + } + $property->update_property_validexp($validexp); + $self->{'message'} .= "DONE.
"; + } + else { + my $new_validexp_values = $self->{'new_validexp_values'}; + my $new_validexp_value = {'property_id' => $property_id, 'property_name' => $property_name, 'value' => $value}; + push (@$new_validexp_values, $new_validexp_value); + $self->{'new_validexp_values'} = $new_validexp_values; + } + } + elsif (!defined($validexp)) { + $self->{'message'} .= "VALID EXPRESSION DOESN'T EXIST YET.
"; + } + else { + $self->{'message'} .= "EXISTS.
"; + } + if ($property_id && $admin) { + for (my $i = 1; $i < $depth; $i++) { + $self->{'message'} .= "...."; + } + $self->{'message'} .= "............Storing new VALUE SELECTED $value..."; + my $environment = Bugzilla::Testopia::Environment->new($self->{'environment_id'}); + $environment->store_property_value($property_id, $element_id, $value); + $self->{'message'} .= "DONE.
"; + } + $property->{'value_selected'} = $value; + push (@properties, $property); + } + my $elm_properties = $element->{'properties'}; + push (@$elm_properties, @properties); + if ($parent_element) { + my $children = $parent_element->{'children'}; + push (@$children, $element); + $parent_element->{'children'} = $children; + } + foreach my $twig_element_child ($twig_element->children("element")) { + $self->parse_child_elements($depth, $env_category_id, $category_name, $twig_element_child, $admin, $element); + } + return $element; +} + + +=head2 Checking Exists + +=head2 DESCRIPTION + +Checking if the Environment, Elements, Categories, and Properties already exist or not. + +=cut + +sub check_new_items() { + my $self = shift; + my $report; + my $new_category_names = $self->{'new_category_names'}; + foreach my $new_category_name (@$new_category_names) { + $report .= "New $new_category_name CATEGORY.
"; + } + my $new_category_elements = $self->{'new_category_elements'}; + foreach my $new_category_element (@$new_category_elements) { + $report .= "New $new_category_element->{'element_name'} ELEMENT in the "; + if (!$new_category_element->{'env_category_id'}){ + $report .= "new "; + } + $report .= "$new_category_element->{'category_name'} CATEGORY.
"; + } + my $new_property_names = $self->{'new_property_names'}; + foreach my $new_property_name (@$new_property_names) { + $report .= "New $new_property_name PROPERTY.
"; + } + my $new_validexp_values = $self->{'new_validexp_values'}; + foreach my $new_validexp_value (@$new_validexp_values) { + $report .= "New $new_validexp_value->{'value'} VALUE for the "; + if (!$new_validexp_value->{'property_id'}){ + $report .= "new "; + } + $report .= "$new_validexp_value->{'property_name'} PROPERTY's selectable value list.
"; + } + return $report; +} + + +=head2 Store the Environment + +=head2 Description + +Store the Environment Name, Element-Category relationship, Element-Property relationship, +Element-ChildElement relationship, Environment-Element-Property-Value. + +=cut + +sub store() { + my $self = shift; + $self->{'message'} .= "Storing new XML Environment..."; + if (!$self->{'environment_id'}) { + $self->{'environment_id'} = Bugzilla::Testopia::Environment->store_environment_name($self->{'name'}, $self->{'product_id'}); + } + my $environment = Bugzilla::Testopia::Environment->new($self); + my $success = $environment->update(); + if (!$success) { + $self->{'message'} .= "ABORTED!
"; + $self->{'error'} .= "Failed to store the Environment!
"; + return 0; + } + $self->{'message'} .= "DONE!
"; + return 1; +} + + +=head2 export + +=head2 Description + +Exports and Environment by env_id to a scalar XML value + +=cut + +sub export() { + my $self = shift; + my ($env_id) = @_; + + my $xml; + + my $environment = Bugzilla::Testopia::Environment->new($env_id); + + $xml = + "" . + "" . + "get_environment_elements(); + + my $categories = {}; + my $category_names = []; + my $categorized_elements = []; + my $elements = $environment->{'elements'}; + my $used_elements = {}; + foreach my $element (@$elements) { + my $root_element = $self->get_root_parent($element); + my $category_name = $root_element->cat_name(); + $categorized_elements = $categories->{ $category_name }; + for my $used_element (@$categorized_elements) { + $used_elements->{ $used_element->{'element_id'} } = 1; + } + if (!$used_elements->{$root_element->{'element_id'}}) { + push (@$categorized_elements, $root_element); + $categories->{ $category_name } = $categorized_elements; + } + } + + foreach my $category_name (keys %$categories) { + $xml .= ""; + + $elements = $categories->{$category_name}; + + + foreach my $element (@$elements) { + $element->get_children(); + $xml .= $self->export_element_and_children(1, $element, $environment->{'environment_id'}); + } + + $xml .= ""; + } + + return "$xml"; +} + + +=head2 get_root_parent + +=head2 Description + +Helper sub that returns the root parent element in the environment of the passed in element + +=cut + +sub get_root_parent { + my $self = shift; + my ($element) = @_; + my $parent = $element->get_parent(); + if ($parent->type eq 'env_category') { + return $element; + } + else { + $self->get_root_parent($parent); + } +} + + +=head2 export_element_and_children + +=head2 Description + +Exports Elements and their child elements to XML Recursively. + +=cut + +sub export_element_and_children() { + my $self = shift; + my ($depth, $element, $env_id) = @_; + if ($depth > $max_depth) { + return; + } + $depth++; + + my $xml = ""; + + my $properties = $element->{'properties'}; + foreach my $property (@$properties) { + my $value_selected = Bugzilla::Testopia::Environment->get_value_selected( + $env_id, $element->{'element_id'}, $property->{'property_id'}); + if (defined($value_selected)) { + $xml .= + "" . + "$value_selected"; + } + } + + my $children = $element->{'children'}; + foreach my $child_element (@$children) { + $child_element->get_children(); + $xml .= $self->export_element_and_children($depth, $child_element, $env_id); + } + $xml .= ""; + return $xml; +} + +1; diff --git a/Bugzilla/Testopia/Product.pm b/Bugzilla/Testopia/Product.pm new file mode 100644 index 0000000..5ca2341 --- /dev/null +++ b/Bugzilla/Testopia/Product.pm @@ -0,0 +1,218 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks + +package Bugzilla::Testopia::Product; + +use strict; + +# Extends Bugzilla::Product; +use base "Bugzilla::Product"; + +use Bugzilla; +use Bugzilla::Testopia::Environment; + +sub environments { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $ref = $dbh->selectcol_arrayref("SELECT environment_id + FROM test_environments + WHERE product_id = ?", + undef, $self->{'id'}); + my @objs; + foreach my $id (@{$ref}){ + push @objs, Bugzilla::Testopia::Environment->new($id); + } + $self->{'environments'} = \@objs; + return $self->{'environments'}; +} + +sub builds { + my $self = shift; + my($active) = @_; + my $dbh = Bugzilla->dbh; + + my $query = "SELECT build_id FROM test_builds WHERE product_id = ?"; + $query .= " AND isactive = 1" if $active; + $query .= " ORDER BY name"; + + my $ref = $dbh->selectcol_arrayref($query, undef, $self->{'id'}); + my @objs; + foreach my $id (@{$ref}){ + push @objs, Bugzilla::Testopia::Build->new($id); + } + $self->{'builds'} = \@objs; + return $self->{'builds'}; +} + +sub categories { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $ref = $dbh->selectcol_arrayref( + "SELECT category_id + FROM test_case_categories + WHERE product_id = ? + ORDER BY name", + undef, $self->{'id'}); + my @objs; + foreach my $id (@{$ref}){ + push @objs, Bugzilla::Testopia::Category->new($id); + } + $self->{'categories'} = \@objs; + return $self->{'categories'}; +} + +sub plans { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $ref = $dbh->selectcol_arrayref( + "SELECT plan_id + FROM test_plans + WHERE product_id = ? + ORDER BY name", + undef, $self->{'id'}); + my @objs; + foreach my $id (@{$ref}){ + push @objs, Bugzilla::Testopia::TestPlan->new($id); + } + $self->{'plans'} = \@objs; + return $self->{'plans'}; +} + +sub environment_categories { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $ref = $dbh->selectcol_arrayref( + "SELECT env_category_id + FROM test_environment_category + WHERE product_id = ?", + undef, $self->id); + my @objs; + foreach my $id (@{$ref}){ + push @objs, Bugzilla::Testopia::Environment::Category->new($id); + } + $self->{'environment_categories'} = \@objs; + return $self->{'environment_categories'}; +} + +sub check_product_by_name { + my $self = shift; + my ($name) = @_; + my $dbh = Bugzilla->dbh; + my ($used) = $dbh->selectrow_array(qq{ + SELECT id + FROM products + WHERE name = ?},undef,$name); + return $used; +} + +sub versions { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $values = $dbh->selectall_arrayref( + "SELECT value AS id, value AS name + FROM versions + WHERE product_id = ? + ORDER BY value", {'Slice' =>{}}, $self->id); + + $self->{'versions'} = $values; + return $self->{'versions'}; +} + +sub milestones { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $values = $dbh->selectall_arrayref( + "SELECT value AS id, value AS name + FROM milestones + WHERE product_id = ? + ORDER BY value", {'Slice' =>{}}, $self->id); + + $self->{'milestones'} = $values; + return $self->{'milestones'}; +} + +sub tags { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectcol_arrayref( + "(SELECT test_tags.tag_id, test_tags.tag_name AS name + FROM test_tags + INNER JOIN test_case_tags ON test_tags.tag_id = test_case_tags.tag_id + INNER JOIN test_cases on test_cases.case_id = test_case_tags.case_id + INNER JOIN test_case_plans on test_case_plans.case_id = test_cases.case_id + INNER JOIN test_plans ON test_plans.plan_id = test_case_plans.plan_id + WHERE test_plans.product_id = ?) + UNION + (SELECT test_tags.tag_id, test_tags.tag_name AS name + FROM test_tags + INNER JOIN test_plan_tags ON test_plan_tags.tag_id = test_tags.tag_id + INNER JOIN test_plans ON test_plan_tags.plan_id = test_plans.plan_id + WHERE test_plans.product_id = ?) + UNION + (SELECT test_tags.tag_id, test_tags.tag_name AS name + FROM test_tags + INNER JOIN test_run_tags ON test_run_tags.tag_id = test_tags.tag_id + INNER JOIN test_runs ON test_runs.run_id = test_run_tags.run_id + INNER JOIN test_plans ON test_plans.plan_id = test_runs.plan_id + WHERE test_plans.product_id = ?) + ORDER BY name", undef, ($self->id,$self->id,$self->id)); + + my @product_tags; + foreach my $id (@$ref){ + push @product_tags, Bugzilla::Testopia::TestTag->new($id); + } + + $self->{'tags'} = \@product_tags; + return $self->{'tags'}; +} + +=head2 type + +Returns 'product' + +=cut + +sub type { + my $self = shift; + $self->{'type'} = 'product'; + return $self->{'type'}; +} + +=head2 type + +Returns true if logged in user has rights to edit Testopia objects +associated with this product. + +=cut + +sub canedit { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers') && Bugzilla->user->can_see_product($self->name); + return 0; +} + + +1; diff --git a/Bugzilla/Testopia/Report.pm b/Bugzilla/Testopia/Report.pm new file mode 100644 index 0000000..4e275c3 --- /dev/null +++ b/Bugzilla/Testopia/Report.pm @@ -0,0 +1,368 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Greg Hendricks. All Rights Reserved. +# +# Large portions lifted from bugzilla's report.cgi written by +# Gervase Markham +# +# Contributor(s): Greg Hendricks + +=head1 NAME + +Bugzilla::Testopia::Report - Generates report data. + +=head1 DESCRIPTION + +Reports + +=over + +=back + +=head1 SYNOPSIS + + +=cut + +package Bugzilla::Testopia::Report; + +use strict; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Search; + + +############################### +#### Initialization #### +############################### + +=head1 METHODS + +=head2 new + +Instantiates a new report object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + + my $self = {}; + bless($self, $class); + + $self->init(@_); + + return $self; +} + +=head2 init + +Private constructor for this class + +=cut + +sub init { + my $self = shift; + my ($type, $url, $cgi) = @_; + $self->{'type'} = $type || ThrowCodeError('bad_arg', + {argument => 'type', + function => 'Testopia::Table::_init'}); + $self->{'url_loc'} = $url; + $self->{'cgi'} = $cgi; + my $debug = $cgi->param('debug') if $cgi; + + my $col_field = $cgi->param('x_axis_field') || ''; + my $row_field = $cgi->param('y_axis_field') || ''; + my $tbl_field = $cgi->param('z_axis_field') || ''; + + if (!($col_field || $row_field || $tbl_field)) { + ThrowUserError("no_axes_defined"); + } + + my $width = $cgi->param('width'); + my $height = $cgi->param('height'); + + if (defined($width)) { + (detaint_natural($width) && $width > 0) + || ThrowCodeError("invalid_dimensions"); + $width <= 2000 || ThrowUserError("chart_too_large"); + } + + if (defined($height)) { + (detaint_natural($height) && $height > 0) + || ThrowCodeError("invalid_dimensions"); + $height <= 2000 || ThrowUserError("chart_too_large"); + } + + # These shenanigans are necessary to make sure that both vertical and + # horizontal 1D tables convert to the correct dimension when you ask to + # display them as some sort of chart. + if (defined $cgi->param('format') && $cgi->param('format') eq "table") { + if ($col_field && !$row_field) { + # 1D *tables* should be displayed vertically (with a row_field only) + $row_field = $col_field; + $col_field = ''; + } + } + else { + if ($row_field && !$col_field) { + # 1D *charts* should be displayed horizontally (with an col_field only) + $col_field = $row_field; + $row_field = ''; + } + } + + my %columns; + if ($type eq 'case'){ + $columns{'case_status'} = "map_case_status.name"; + $columns{'priority'} = "map_priority.value"; + $columns{'product'} = "map_case_product.name"; + $columns{'component'} = "map_case_components.name"; + $columns{'category'} = "map_categories.name"; + $columns{'isautomated'} = "test_cases.isautomated"; + $columns{'tags'} = "map_case_tags.tag_name"; + $columns{'requirement'} = "test_cases.requirement"; + $columns{'author'} = "map_case_author.login_name"; + $columns{'default_tester'} = "map_default_tester.login_name"; + } + elsif ($type eq 'run'){ + $columns{'run_status'} = "test_runs.stop_date"; + $columns{'product'} = "map_run_product.name"; + $columns{'build'} = "map_run_build.name"; + $columns{'milestone'} = "map_run_milestone.milestone"; + $columns{'environment'} = "map_run_environment.name"; + $columns{'tags'} = "map_run_tags.tag_name"; + $columns{'manager'} = "map_run_manager.login_name"; + $columns{'default_product_version'} = "test_runs.product_version"; + } + elsif ($type eq 'plan'){ + $columns{'plan_type'} = "map_plan_type.name"; + $columns{'product'} = "map_plan_product.name"; + $columns{'archived'} = "test_plans.isactive"; + $columns{'tags'} = "map_plan_tags.tag_name"; + $columns{'author'} = "map_plan_author.login_name"; + $columns{'default_product_version'} = "test_plans.default_product_version"; + } + elsif ($type eq 'caserun'){ + $columns{'build'} = "map_caserun_build.name"; + $columns{'case'} = "map_caserun_case.summary"; + $columns{'run'} = "map_caserun_run.summary"; + $columns{'environment'} = "map_caserun_environment.name"; + $columns{'assignee'} = "map_caserun_assignee.login_name"; + $columns{'testedby'} = "map_caserun_testedby.login_name"; + $columns{'status'} = "map_caserun_status.name"; + $columns{'milestone'} = "map_caserun_milestone.milestone"; + $columns{'case_tags'} = "map_caserun_case_tags.tag_name"; + $columns{'run_tags'} = "map_caserun_run_tags.tag_name"; + $columns{'requirement'} = "map_caserun_cases.requirement"; + $columns{'priority'} = "map_caserun_priority.value"; + $columns{'default_tester'} = "map_caserun_default_tester.login_name"; + $columns{'category'} = "map_caserun_category.name"; + $columns{'component'} = "map_caserun_components.name"; + } + # One which means "nothing". Any number would do, really. It just gets SELECTed + # so that we always select 3 items in the query. + $columns{''} = "42217354"; + + # Validate the values in the axis fields or throw an error. + !$row_field + || ($columns{$row_field} && trick_taint($row_field)) + || ThrowCodeError("report_axis_invalid", {fld => "x", val => $row_field}); + !$col_field + || ($columns{$col_field} && trick_taint($col_field)) + || ThrowCodeError("report_axis_invalid", {fld => "y", val => $col_field}); + !$tbl_field + || ($columns{$tbl_field} && trick_taint($tbl_field)) + || ThrowCodeError("report_axis_invalid", {fld => "z", val => $tbl_field}); + + my @axis_fields = ($row_field, $col_field, $tbl_field); + my @selectnames = map($columns{$_}, @axis_fields); + $self->{'axis_fields'} = \@axis_fields; + $self->{'selectnames'} = \@selectnames; + $cgi->param('viewall', 1); + + my $dbh = Bugzilla->switch_to_shadow_db; + my $search = Bugzilla::Testopia::Search->new($cgi, \@selectnames); + my $results = $dbh->selectall_arrayref($search->query); + $dbh = Bugzilla->switch_to_main_db; + + # We have a hash of hashes for the data itself, and a hash to hold the + # row/col/table names. + my %data; + my %names; + + # Read the bug data and count the bugs for each possible value of row, column + # and table. + # + # We detect a numerical field, and sort appropriately, if all the values are + # numeric. + my $col_isnumeric = 1; + my $row_isnumeric = 1; + my $tbl_isnumeric = 1; + + foreach my $result (@$results) { + my ($row, $col, $tbl) = @$result; + + # handle empty dimension member names + $row = ' ' if ($row eq ''); + $col = ' ' if ($col eq ''); + $tbl = ' ' if ($tbl eq ''); + + $row = "" if ($row eq $columns{''}); + $col = "" if ($col eq $columns{''}); + $tbl = "" if ($tbl eq $columns{''}); + + # account for the fact that names may start with '_' or '.'. Change this + # so the template doesn't hide hash elements with those keys + $row =~ s/^([._])/ $1/; + $col =~ s/^([._])/ $1/; + $tbl =~ s/^([._])/ $1/; + + $data{$tbl}{$col}{$row}++; + $names{"col"}{$col}++; + $names{"row"}{$row}++; + $names{"tbl"}{$tbl}++; + + $col_isnumeric &&= ($col =~ /^-?\d+(\.\d+)?$/o); + $row_isnumeric &&= ($row =~ /^-?\d+(\.\d+)?$/o); + $tbl_isnumeric &&= ($tbl =~ /^-?\d+(\.\d+)?$/o); + } + + my @col_names = @{get_names($names{"col"}, $col_isnumeric, $col_field)}; + my @row_names = @{get_names($names{"row"}, $row_isnumeric, $row_field)}; + my @tbl_names = @{get_names($names{"tbl"}, $tbl_isnumeric, $tbl_field)}; + + # The GD::Graph package requires a particular format of data, so once we've + # gathered everything into the hashes and made sure we know the size of the + # data, we reformat it into an array of arrays of arrays of data. + push(@tbl_names, "-total-") if (scalar(@tbl_names) > 1); + + my @image_data; + foreach my $tbl (@tbl_names) { + my @tbl_data; + push(@tbl_data, \@col_names); + foreach my $row (@row_names) { + my @col_data; + foreach my $col (@col_names) { + $data{$tbl}{$col}{$row} = $data{$tbl}{$col}{$row} || 0; + push(@col_data, $data{$tbl}{$col}{$row}); + if ($tbl ne "-total-") { + # This is a bit sneaky. We spend every loop except the last + # building up the -total- data, and then last time round, + # we process it as another tbl, and push() the total values + # into the image_data array. + $data{"-total-"}{$col}{$row} += $data{$tbl}{$col}{$row}; + } + } + + push(@tbl_data, \@col_data); + } + + unshift(@image_data, \@tbl_data); + } + $self->{'col_field'} = $col_field; + $self->{'row_field'} = $row_field; + $self->{'tbl_field'} = $tbl_field; + + my @time = localtime(time()); + my $date = sprintf "%04d-%02d-%02d", 1900+$time[5],$time[4]+1,$time[3]; + $self->{'date'} = $date; + $self->{'format'} = $cgi->param('format'); + + $self->{'col_names'} = \@col_names; + $self->{'row_names'} = \@row_names; + $self->{'tbl_names'} = \@tbl_names; + + # Below a certain width, we don't see any bars, so there needs to be a minimum. + if ($width && $cgi->param('format') eq "bar") { + my $min_width = (scalar(@col_names) || 1) * 20; + + if (!$cgi->param('cumulate')) { + $min_width *= (scalar(@row_names) || 1); + } + + $self->{'min_width'} = $min_width; + } + + $self->{'width'} = $width if $width; + $self->{'height'} = $height if $height; + + $self->{'query'} = $search->query; + $self->{'debug'} = $cgi->param('debug'); + + $self->{'data'} = \%data; + $self->{'image_data'} = \@image_data; + $self->{'report_loc'} = "tr_" . $type . "_reports.cgi"; + if ($cgi->param('debug')) { + print $cgi->header; + require Data::Dumper; + print "
data hash:\n";
+        print Data::Dumper::Dumper(%data) . "\n\n";
+        print "data array:\n";
+        print Data::Dumper::Dumper(@image_data) . "\n\n
"; + } + + return $self; +} + +sub get_names { + my ($names, $isnumeric, $field) = @_; + + my @sorted; + + if ($isnumeric) { + # It's not a field we are preserving the order of, so sort it + # numerically... + sub numerically { $a <=> $b } + @sorted = sort numerically keys(%{$names}); + } else { + # ...or alphabetically, as appropriate. + @sorted = sort(keys(%{$names})); + } + + return \@sorted; +} +sub listbase{ + my $self = shift; + my $cgi = $self->{'cgi'}; + $self->{'listbase'} = $cgi->canonicalise_query( + "x_axis_field", "y_axis_field", "z_axis_field", + "ctype", "format", "query_format", "report_action", @{$self->{'axis_fields'}}); + return $self->{'listbase'}; +} + +sub imagebase { + my $self = shift; + my $cgi = $self->{'cgi'}; + $self->{'imagebase'} = $cgi->canonicalise_query( + $self->{'tbl_field'}, "report_action", "ctype", "format", "width", "height"); + return $self->{'imagebase'}; +} + +sub switchbase { + my $self = shift; + my $cgi = $self->{'cgi'}; + $self->{'switchbase'} = $cgi->canonicalise_query( + "query_format", "report_action", "ctype", "format", "width", "height"); + return $self->{'switchbase'}; +} + +1; diff --git a/Bugzilla/Testopia/Search.pm b/Bugzilla/Testopia/Search.pm new file mode 100644 index 0000000..50d1f70 --- /dev/null +++ b/Bugzilla/Testopia/Search.pm @@ -0,0 +1,1366 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. + +# Large portions lifted uncerimoniously from Bugzilla::Search.pm +# Which is copyrighted by its respective copyright holders +# Many thanks to the geniouses that contributed to that work of art: +# Gervase Markham +# Terry Weissman +# Dan Mosedale +# Stephan Niemz +# Andreas Franke +# Myk Melez +# Michael Schindler +# Max Kanat-Alexander +# +# Contributor(s): Greg Hendricks + +=head1 NAME + +Bugzilla::Testopia::Search - A module to support searches in Testopis + +=head1 DESCRIPTION + +Testopia::Search is based heavilly on Bugzilla::Search. It takes a +CGI instance and parses its parameters to generate an SQL query that +can be used to get a result set from the database. The query is +usually passed to Table.pm to execute and display the results. +Search.pm supports searching for all major objects in the Testopia +database, Cases, Plans, Runs and Case-runs. It supports sorting +on one column at a time in ascending order. + +=head1 SYNOPSIS + + $search = Bugzilla::Testopia::Search($cgi); + +=cut + +package Bugzilla::Testopia::Search; + +use strict; + +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Config; +use Bugzilla::Error; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestCase; + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + + my $self = {}; + bless($self, $class); + + $self->init(@_); + + return $self; +} + +sub init { + my $self = shift; + my $cgi = shift; + my $fields = shift; + my $user = $self->{'user'} || Bugzilla->user; + $self->{'cgi'} = $cgi; + $self->{'fields'} = $fields if $fields; + my $debug = $cgi->param('debug') || 0; + my $dbh = Bugzilla->dbh; + print $cgi->header if $debug; + if ($debug && !$cgi->{'final_separator'}){ + use Data::Dumper; + print Dumper($cgi); + } + my $page = $cgi->param('page') || 0; + detaint_natural($page) if $page; + $page = undef if ($cgi->param('viewall')); + my $pagesize = $cgi->param('pagesize') if $cgi->param('pagesize'); + detaint_natural($pagesize) if defined $pagesize; + $pagesize ||= 25; + + my @specialchart; + my @supptables; + my @wherepart; + my @having; + my @groupby; + my @andlist; + my @orderby; + my @inputorder; + my @fields; + my %specialorderjoin; + my %chartfields; + #my ($testergroup) = $dbh->selectrow_array("SELECT id FROM groups WHERE name = ?",undef, 'Testers'); + +# $chartid is the number of the current chart whose SQL we're constructing +# $row is the current row of the current chart + +# names for table aliases are constructed using $chartid and $row +# SELECT blah FROM $table "$table_$chartid_$row" WHERE .... + +# $f = field of table in bug db (e.g. bug_id, reporter, etc) +# $ff = qualified field name (field name prefixed by table) +# e.g. bugs_activity.bug_id +# $t = type of query. e.g. "equal to", "changed after", case sensitive substr" +# $v = value - value the user typed in to the form +# $q = sanitized version of user input (SqlQuote($v)) +# @supptables = Tables and/or table aliases used in query +# %suppseen = A hash used to store all the tables in supptables to weed +# out duplicates. +# @supplist = A list used to accumulate all the JOIN clauses for each +# chart to merge the ON sections of each. +# $suppstring = String which is pasted into query containing all table names + my $chartid; + my $sequence = 0; + my $f; + my $ff; + my $t; + my $q; + my $v; + my $term; + my %funcsbykey; + my $type; + + my $obj = trim($cgi->param('current_tab')) || ThrowUserError('testopia-missing-parameter', {'param' => 'current_tab'}); + ThrowUserError('unknown-tab') if $obj !~ '^(case|plan|run|case_run|environment)$'; + trick_taint($obj); + + # If what we intend to do is generate a report, we need some tables + # to map names to ids + if ($fields){ + ## Cases ## + if (grep(/map_categories/, @$fields)) { + push @supptables, "INNER JOIN test_case_categories AS map_categories " . + "ON test_cases.category_id = map_categories.category_id"; + } + if (grep(/map_priority/, @$fields)) { + push @supptables, "INNER JOIN priority AS map_priority " . + "ON test_cases.priority_id = map_priority.id"; + } + if (grep(/map_case_status/, @$fields)) { + push @supptables, "INNER JOIN test_case_status AS map_case_status " . + "ON test_cases.case_status_id = map_case_status.case_status_id"; + } + if (grep(/map_case_components/, @$fields)) { + push @supptables, "INNER JOIN test_case_components AS tccomps " . + "ON test_cases.case_id = tccomps.case_id"; + push @supptables, "INNER JOIN components AS map_case_components " . + "ON tccomps.component_id = map_case_components.id"; + } + if (grep(/map_case_product/, @$fields)) { + push(@supptables, "INNER JOIN test_case_plans AS map_case_plans " . + "ON test_cases.case_id = map_case_plans.case_id"); + push(@supptables, "INNER JOIN test_plans AS map_product_plans " . + "ON map_case_plans.plan_id = map_product_plans.plan_id"); + push(@supptables, "INNER JOIN products AS map_case_product " . + "ON map_product_plans.product_id = map_case_product.id"); + } + if (grep(/map_case_tags/, @$fields)) { + push @supptables, "INNER JOIN test_case_tags AS tctags " . + "ON test_cases.case_id = tctags.case_id"; + push @supptables, "INNER JOIN test_tags AS map_case_tags " . + "ON tctags.tag_id = map_case_tags.tag_id"; + } + if (grep(/map_case_author/, @$fields)) { + push @supptables, "INNER JOIN profiles AS map_case_author " . + "ON test_cases.author_id = map_case_author.userid"; + } + if (grep(/map_default_tester/, @$fields)) { + push @supptables, "INNER JOIN profiles AS map_default_tester " . + "ON test_cases.default_tester_id = map_default_tester.userid"; + } + ## Runs ## + + if (grep(/map_run_product/, @$fields)) { + push @supptables, "INNER JOIN test_plans " . + "ON test_runs.plan_id = test_plans.plan_id"; + push @supptables, "INNER JOIN products AS map_run_product " . + "ON test_plans.product_id = map_run_product.id"; + } + if (grep(/map_run_build/, @$fields)) { + push @supptables, "INNER JOIN test_builds AS map_run_build " . + "ON test_runs.build_id = map_run_build.build_id"; + } + if (grep(/map_run_milestone/, @$fields)) { + push @supptables, "INNER JOIN test_builds AS map_run_milestone " . + "ON test_runs.build_id = map_run_milestone.build_id"; + } + if (grep(/map_run_environment/, @$fields)) { + push @supptables, "INNER JOIN test_environments AS map_run_environment " . + "ON test_runs.environment_id = map_run_environment.environment_id"; + } + if (grep(/map_run_tags/, @$fields)) { + push @supptables, "INNER JOIN test_run_tags " . + "ON test_runs.run_id = test_run_tags.run_id"; + push @supptables, "INNER JOIN test_tags AS map_run_tags " . + "ON test_run_tags.tag_id = map_run_tags.tag_id"; + } + if (grep(/map_run_manager/, @$fields)) { + push @supptables, "INNER JOIN profiles AS map_run_manager " . + "ON test_runs.manager_id = map_run_manager.userid"; + } + + ## Plans ## + if (grep(/map_plan_type/, @$fields)) { + push @supptables, "INNER JOIN test_plan_types AS map_plan_type " . + "ON test_plans.type_id = map_plan_type.type_id"; + } + if (grep(/map_plan_product/, @$fields)) { + push @supptables, "INNER JOIN products AS map_plan_product " . + "ON test_plans.product_id = map_plan_product.id"; + } + if (grep(/map_plan_tags/, @$fields)) { + push @supptables, "INNER JOIN test_plan_tags " . + "ON test_plans.plan_id = test_plan_tags.plan_id"; + push @supptables, "INNER JOIN test_tags AS map_plan_tags " . + "ON test_plan_tags.tag_id = map_plan_tags.tag_id"; + } + if (grep(/map_plan_author/, @$fields)) { + push @supptables, "INNER JOIN profiles AS map_plan_author " . + "ON test_plans.author_id = map_plan_author.userid"; + } + ## Case-runs ## + if (grep(/map_caserun_assignee/, @$fields)) { + push @supptables, "INNER JOIN profiles AS map_caserun_assignee " . + "ON test_case_runs.assignee = map_caserun_assignee.userid"; + } + if (grep(/map_caserun_testedby/, @$fields)) { + push @supptables, "INNER JOIN profiles AS map_caserun_testedby " . + "ON test_case_runs.testedby = map_caserun_testedby.userid"; + } + if (grep(/map_caserun_build/, @$fields)) { + push @supptables, "INNER JOIN test_builds AS map_caserun_build " . + "ON test_case_runs.build_id = map_caserun_build.build_id"; + } + if (grep(/map_caserun_environment/, @$fields)) { + push @supptables, "INNER JOIN test_environments AS map_caserun_environment " . + "ON test_case_runs.environment_id = map_caserun_environment.environment_id"; + } + if (grep(/map_caserun_status/, @$fields)) { + push @supptables, "INNER JOIN test_case_run_status AS map_caserun_status " . + "ON test_case_runs.case_run_status_id = map_caserun_status.case_run_status_id"; + } + if (grep(/map_caserun_milestone/, @$fields)) { + push @supptables, "INNER JOIN test_builds AS map_caserun_milestone " . + "ON test_case_runs.build_id = map_caserun_milestone.build_id"; + } + if (grep(/map_caserun_case_tags/, @$fields)) { + push @supptables, "INNER JOIN test_case_tags AS tctags " . + "ON test_case_runs.case_id = tctags.case_id"; + push @supptables, "INNER JOIN test_tags AS map_caserun_case_tags " . + "ON tctags.tag_id = map_caserun_case_tags.tag_id"; + } + if (grep(/map_caserun_run_tags/, @$fields)) { + push @supptables, "INNER JOIN test_run_tags " . + "ON test_case_runs.run_id = test_run_tags.run_id"; + push @supptables, "INNER JOIN test_tags AS map_caserun_run_tags " . + "ON test_run_tags.tag_id = map_caserun_run_tags.tag_id"; + } + if (grep(/map_caserun_cases/, @$fields)) { + push @supptables, "INNER JOIN test_cases AS map_caserun_cases " . + "ON test_case_runs.case_id = map_caserun_cases.case_id"; + } + if (grep(/map_caserun_priority/, @$fields)) { + push @supptables, "INNER JOIN test_cases AS map_caserun_cases " . + "ON test_case_runs.case_id = map_caserun_cases.case_id"; + push @supptables, "INNER JOIN priority AS map_caserun_priority " . + "ON map_caserun_cases.priority_id = map_caserun_priority.id"; + } + if (grep(/map_caserun_default_tester/, @$fields)) { + push @supptables, "INNER JOIN test_cases AS map_caserun_cases " . + "ON test_case_runs.case_id = map_caserun_cases.case_id"; + push @supptables, "INNER JOIN profiles AS map_caserun_default_tester " . + "ON map_caserun_cases.default_tester_id = map_caserun_default_tester.userid"; + } + if (grep(/map_caserun_category/, @$fields)) { + push @supptables, "INNER JOIN test_cases AS map_caserun_cases " . + "ON test_case_runs.case_id = map_caserun_cases.case_id"; + push @supptables, "INNER JOIN test_case_categories AS map_caserun_category " . + "ON map_caserun_cases.category_id = map_caserun_category.category_id"; + } + if (grep(/map_caserun_components/, @$fields)) { + push @supptables, "INNER JOIN test_cases AS map_caserun_cases " . + "ON test_case_runs.case_id = map_caserun_cases.case_id"; + push @supptables, "INNER JOIN test_case_components AS case_components " . + "ON map_caserun_cases.case_id = case_components.case_id"; + push @supptables, "INNER JOIN components AS map_caserun_components " . + "ON case_components.component_id = map_caserun_components.id"; + } + + } + # Set up tables for access control + unless (Bugzilla->user->in_group('Testers')){ + if ($obj eq 'case'){ + push(@supptables, "INNER JOIN test_case_plans AS case_plans " . + "ON test_cases.case_id = case_plans.case_id"); + push(@supptables, "INNER JOIN test_plans " . + "ON case_plans.plan_id = test_plans.plan_id"); } + elsif ($obj eq 'case_run'){ + push(@supptables, "INNER JOIN test_runs " . + "ON test_case_runs.run_id = test_runs.run_id"); + push(@supptables, "INNER JOIN test_plans " . + "ON test_runs.plan_id = test_plans.plan_id"); + } + elsif ($obj eq 'run'){ + push(@supptables, "INNER JOIN test_plans " . + "ON test_runs.plan_id = test_plans.plan_id"); + } + unless ($obj eq 'environment'){ + push @supptables, "INNER JOIN test_plan_permissions ON test_plans.plan_id = test_plan_permissions.plan_id"; + push @wherepart, "test_plan_permissions.permissions > 0 AND test_plan_permissions.userid = ". Bugzilla->user->id; + } + } + # Only display environments attached to products I can see. + # TODO: is there a better way to do this? + if ($obj eq 'environment'){ + my @prod_ids; + foreach my $p (@{Bugzilla->user->get_selectable_products}){ + push @prod_ids, $p->id; + } + my $prod_ids = join(',',@prod_ids); + push @wherepart, "test_environments.product_id IN ($prod_ids)" if $prod_ids; + } + # Set up tables for field sort order + my $order = $cgi->param('order') || ''; + if ($order eq 'author') { + push @supptables, "INNER JOIN profiles as map_author ON map_author.userid = test_". $obj ."s.author_id"; + push @orderby, 'map_author.login_name'; + } + elsif ($order eq 'manager') { + push @supptables, "INNER JOIN profiles as map_manager ON map_manager.userid = test_". $obj ."s.manager_id"; + push @orderby, 'map_manager.login_name'; + } + elsif ($order eq 'assignee') { + push @supptables, "LEFT JOIN profiles as map_assignee ON map_assignee.userid = test_". $obj ."s.assignee"; + push @orderby, 'map_assignee.login_name'; + } + elsif ($order eq 'testedby') { + push @supptables, "LEFT JOIN profiles as map_testedby ON map_testedby.userid = test_". $obj ."s.testedby"; + push @orderby, 'map_testedby.login_name'; + } + elsif ($order eq 'tester') { + push @supptables, "LEFT JOIN profiles as map_tester ON map_tester.userid = test_". $obj ."s.default_tester_id"; + push @orderby, 'map_tester.login_name'; + } + elsif ($order eq 'product') { + push @supptables, "LEFT JOIN products ON products.id = test_". $obj ."s.product_id"; + push @orderby, 'products.name'; + } + elsif ($order eq 'build') { + push @supptables, "INNER JOIN test_builds AS build ON build.build_id = test_". $obj ."s.build_id"; + push @orderby, 'build.name'; + } + elsif ($order eq 'environment') { + push @supptables, "INNER JOIN test_environments AS env ON env.environment_id = test_". $obj ."s.environment_id"; + push @orderby, 'env.name'; + } + elsif ($order eq 'plan_type') { + push @supptables, "INNER JOIN test_plan_types AS ptype ON ptype.type_id = test_plans.type_id"; + push @orderby, 'ptype.name'; + } + elsif ($order eq 'plan_prodver') { + push @supptables, "INNER JOIN versions ON versions.value = test_plans.default_product_version"; + push @orderby, 'versions.value'; + } + elsif ($order eq 'priority') { + if ($obj eq 'case_run'){ + push @supptables, "INNER JOIN test_cases ON test_cases.case_id = test_case_runs.case_id"; + } + push @supptables, "INNER JOIN priority ON priority.id = test_cases.priority_id"; + push @orderby, 'test_cases.priority_id'; + } + elsif ($order eq 'build') { + push @supptables, "INNER JOIN test_builds ON test_builds.build_id = test_case_runs.build_id"; + push @orderby, 'test_builds.name'; + } + elsif ($order eq 'case_run_status') { + push @supptables, "INNER JOIN test_case_run_status as case_run_status ON case_run_status.case_run_status_id = test_case_runs.case_run_status_id"; + push @orderby, 'case_run_status.sortkey'; + } + elsif ($order eq 'category') { + if ($obj eq 'case_run'){ + push @supptables, "INNER JOIN test_cases ON test_cases.case_id = test_case_runs.case_id"; + } + push @supptables, "INNER JOIN test_case_categories AS categories ON test_cases.category_id = categories.category_id"; + push @orderby, 'categories.name'; + } + elsif ($order eq 'component') { + if ($obj eq 'case_run'){ + push @supptables, "INNER JOIN test_cases ON test_cases.case_id = test_case_runs.case_id"; + } + push @supptables, "INNER JOIN test_case_components ON test_cases.case_id = test_case_components.case_id"; + push @supptables, "INNER JOIN components ON components.id = test_case_components.component_id"; + push @orderby, 'components.name'; + } + elsif ($order eq 'case_status') { + push @supptables, "INNER JOIN test_case_status AS case_status ON test_cases.case_status_id = case_status.case_status_id"; + push @orderby, 'case_status.name'; + } + elsif ($order eq 'summary') { + if ($obj eq 'case_run'){ + push @supptables, "INNER JOIN test_cases AS cases ON cases.case_id = test_case_runs.case_id"; + push @orderby, 'cases.summary'; + } + else{ + push @orderby, 'test_'. $obj .'s.summary'; + } + } + elsif ($order eq 'created') { + push @orderby, 'test_'. $obj .'s.creation_date'; + } + elsif ($order eq 'name') { + push @orderby, 'test_'. $obj .'s.name'; + } + else{ + if ($order){ + trick_taint($order) if ($order); + push @orderby, 'test_'. $obj .'s.' . $order; + } + } + + my @funcdefs = + ( + "^category," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_cases " . + "ON test_case_runs.case_id = test_cases.case_id"); + } + push(@supptables, + "INNER JOIN test_case_categories AS categories " . + "ON test_cases.category_id = categories.category_id"); + $f = "categories.name"; + }, + "^category_id," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_cases " . + "ON test_case_runs.case_id = test_cases.case_id"); + } + + $f = "test_cases.category_id"; + }, + "^build," => sub { + my $str = ''; + $str = 'case_' if ($obj eq 'case_run'); + push(@supptables, + "INNER JOIN test_builds AS builds " . + "ON test_". $str ."runs.build_id = builds.build_id"); + $f = "builds.name"; + }, + "^(tcaction|tceffect)," => sub { + push(@supptables, + "LEFT JOIN test_case_texts AS case_texts " . + "ON test_cases.case_id = case_texts.case_id"); + my $fid = ($1 eq 'tcaction' ? 'action' : 'effect'); + $f = "case_texts.$fid"; + }, + "^plan_text," => sub { + push(@supptables, + "LEFT JOIN test_plan_texts AS plan_texts " . + "ON test_plans.plan_id = plan_texts.plan_id"); + $f = "plan_texts.plan_text"; + }, + "^prod_name," => sub { + push(@supptables, + "INNER JOIN products ". + "ON test_". $obj ."s.product_id = products.id"); + $f = 'products.name'; + }, + "^case_status," => sub { + push(@supptables, + "INNER JOIN test_case_status AS case_status " . + "ON test_cases.case_status_id = case_status.case_status_id"); + $f = 'case_status.name'; + }, + "^priority," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_cases + ON test_cases.case_id = test_case_runs.case_id"); + } + push(@supptables, + "INNER JOIN priority ". + "ON test_cases.priority_id = priority.id"); + $f = 'priority.value'; + }, + "^environment," => sub { + push(@supptables, + "INNER JOIN test_environments ". + "ON test_". $obj ."s.environment_id = test_environments.environment_id"); + $f = 'test_environments.name'; + }, + "^plan_type," => sub { + push(@supptables, + "INNER JOIN test_plan_types ". + "ON test_plans.type_id = test_plan_types.type_id"); + $f = 'test_plan_types.name'; + }, + "^case_run_status," => sub { + push(@supptables, + "INNER JOIN test_case_run_status AS tcrs ". + "ON test_case_runs.case_run_status_id = tcrs.case_run_status_id"); + $f = 'tcrs.name'; + }, + "^env_products," => sub { + push(@supptables, + "INNER JOIN products as env_products + ON test_environments.product_id = env_products.id"); + $f = 'env_products.id' + }, + "^env_categories," => sub { + push(@supptables, + "INNER JOIN test_environment_map + ON test_environments.environment_id = test_environment_map.environment_id"); + push(@supptables, + "INNER JOIN test_environment_element + ON test_environment_map.element_id = test_environment_element.element_id"); + push(@supptables, + "INNER JOIN test_environment_category + ON test_environment_element.env_category_id = test_environment_category.env_category_id"); + $f = 'test_environment_category.env_category_id' + }, + "^env_elements," => sub { + push(@supptables, + "INNER JOIN test_environment_map as env_map_elements + ON test_environments.environment_id = env_map_elements.environment_id"); + push(@supptables, + "INNER JOIN test_environment_element as env_element + ON env_map_elements.element_id = env_element.element_id"); + $f = 'env_element.element_id' + }, + "^env_properties," => sub { + push(@supptables, + "INNER JOIN test_environment_map as env_map_properties + ON test_environments.environment_id = env_map_properties.environment_id"); + push(@supptables, + "INNER JOIN test_environment_property as env_property + ON env_map_properties.property_id = env_property.property_id"); + $f = 'env_property.property_id' + }, + "^env_expressions," => sub { + push(@supptables, + "INNER JOIN test_environment_map as env_map_value + ON test_environments.environment_id = env_map_value.environment_id"); + $f = 'env_map_value.value_selected' + }, + "^env_value_selected," => sub { + push(@supptables, + "INNER JOIN test_environment_map as env_map_value_selected + ON test_environments.environment_id = env_map_value_selected.environment_id"); + $f = 'env_map_value_selected.value_selected' + }, + "^component," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_cases + ON test_cases.case_id = test_case_runs.case_id"); + } + push(@supptables, + "INNER JOIN test_case_components AS tc_components " . + "ON test_cases.case_id = tc_components.case_id"); + push(@supptables, + "INNER JOIN components ". + "ON components.id = tc_components.component_id"); + $f = "components.name"; + }, + "^priority_id," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_cases + ON test_cases.case_id = test_case_runs.case_id"); + } + $f = "test_cases.priority_id"; + }, + "^isautomated," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_cases + ON test_cases.case_id = test_case_runs.case_id"); + } + $f = "test_cases.isautomated"; + }, + "^milestone," => sub { + push(@supptables, + "INNER JOIN test_builds AS builds " . + "ON test_runs.build_id = builds.build_id"); + push(@supptables, + "INNER JOIN milestones ". + "ON milestones.value = builds.milestone"); + $f = "milestones.value"; + }, + "^bug," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_case_bugs AS case_bugs " . + "ON test_case_runs.case_run_id = case_bugs.case_run_id"); + push(@supptables, + "INNER JOIN bugs ". + "ON case_bugs.bug_id = bugs.bug_id"); + } + elsif($obj eq 'case'){ + push(@supptables, + "INNER JOIN test_case_bugs AS case_bugs " . + "ON test_cases.case_id = case_bugs.case_id"); + push(@supptables, + "INNER JOIN bugs ". + "ON case_bugs.bug_id = bugs.bug_id"); + } + $f = "bugs.bug_id"; + }, + "^case_summary," => sub { + push(@supptables, + "INNER JOIN test_cases AS cases " . + "ON cases.case_id = test_case_runs.case_id"); + $f = "cases.summary"; + }, + + "^tags," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_cases " . + "ON test_case_runs.case_id = test_cases.case_id"); + push(@supptables, + "INNER JOIN test_case_tags AS case_tags " . + "ON test_cases.case_id = case_tags.case_id"); + push(@supptables, + "INNER JOIN test_tags " . + "ON case_tags.tag_id = test_tags.tag_id"); + } + else{ + push(@supptables, + "INNER JOIN test_". $obj ."_tags AS ". $obj ."_tags " . + "ON test_". $obj ."s.". $obj ."_id = ". $obj ."_tags.". $obj ."_id"); + push(@supptables, + "INNER JOIN test_tags " . + "ON ". $obj ."_tags.tag_id = test_tags.tag_id"); + } + $f = "test_tags.tag_name"; + }, + "^requirement," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_cases " . + "ON test_case_runs.case_id = test_cases.case_id"); + } + $f = "test_cases.requirement"; + }, + "^case_plan_id," => sub { + push(@supptables, + "INNER JOIN test_case_plans AS case_plans " . + "ON test_cases.case_id = case_plans.case_id"); + push(@supptables, + "INNER JOIN test_plans " . + "ON case_plans.plan_id = test_plans.plan_id"); + $f = "test_plans.plan_id"; + }, + "^plan_case_id," => sub { + push(@supptables, + "INNER JOIN test_case_plans AS case_plans " . + "ON test_plans.plan_id = case_plans.plan_id"); + push(@supptables, + "INNER JOIN test_cases " . + "ON case_plans.case_id = test_cases.case_id"); + $f = "test_cases.case_id"; + }, + "^cases_in_runs," => sub { + push(@supptables, + "INNER JOIN test_case_runs AS case_runs " . + "ON test_cases.case_id = case_runs.case_id"); + push(@supptables, + "INNER JOIN test_runs " . + "ON case_runs.run_id = test_runs.run_id"); + $f = "test_runs.run_id"; + }, + "^run_plan_id," => sub { + $f = "test_runs.plan_id"; + }, + "^run_case_id," => sub { + push(@supptables, + "INNER JOIN test_case_runs AS case_runs " . + "ON test_runs.run_id = case_runs.run_id"); + push(@supptables, + "INNER JOIN test_cases " . + "ON case_runs.case_id = test_cases.case_id"); + $f = "test_cases.case_id"; + }, + "^caserun_plan_id," => sub { + push(@supptables, + "INNER JOIN test_runs " . + "ON test_case_runs.run_id = test_runs.run_id"); + push(@supptables, + "INNER JOIN test_plans " . + "ON test_runs.plan_id = test_plans.plan_id"); + $f = "test_plans.plan_id"; + }, + "^case_prod," => sub { + push(@supptables, + "INNER JOIN test_case_plans AS case_plans " . + "ON test_cases.case_id = case_plans.case_id"); + push(@supptables, + "INNER JOIN test_plans " . + "ON case_plans.plan_id = test_plans.plan_id"); + push(@supptables, + "INNER JOIN products " . + "ON test_plans.product_id = products.id"); + if ($cgi->param('product_id')){ + $f = "test_plans.product_id"; + } + else { + $f = "products.name"; + } + + }, + "^caserun_prod," => sub { + push(@supptables, + "INNER JOIN test_runs " . + "ON test_case_runs.run_id = test_runs.run_id"); + push(@supptables, + "INNER JOIN test_plans " . + "ON test_runs.plan_id = test_plans.plan_id"); + push(@supptables, + "INNER JOIN products " . + "ON test_plans.product_id = products.id"); + if ($cgi->param('product_id')){ + $f = "test_plans.product_id"; + } + else { + $f = "products.name"; + } + + }, + "^run_prod," => sub { + push(@supptables, + "INNER JOIN test_plans " . + "ON test_runs.plan_id = test_plans.plan_id"); + push(@supptables, + "INNER JOIN products " . + "ON test_plans.product_id = products.id"); + if ($cgi->param('product_id')){ + $f = "test_plans.product_id"; + } + else { + $f = "products.name"; + } + }, + "^stop_date," => sub { + if ($obj eq 'case_run'){ + push(@supptables, + "INNER JOIN test_runs " . + "ON test_case_runs.run_id = test_runs.run_id"); + $f = "test_runs.stop_date"; + } + }, + "^run_product_version," => sub { + push(@supptables, + "INNER JOIN test_runs " . + "ON test_case_runs.run_id = test_runs.run_id"); + $f = "test_runs.product_version"; + }, + "^(author|manager|default_tester)," => sub { + push(@supptables, + "INNER JOIN profiles AS map_$1 " . + "ON test_". $obj ."s.". $1 ."_id = map_$1.userid"); + $f = "map_$1.login_name"; + }, + "^(assignee|testedby)," => sub { + if ($obj eq 'run'){ + push(@supptables, + "LEFT JOIN test_case_runs AS case_run " . + "ON case_run.run_id = test_runs.run_id"); + push(@supptables, + "INNER JOIN profiles AS map_$1 " . + "ON case_run.". $1 ." = map_$1.userid"); + } + else { + push(@supptables, + "LEFT JOIN profiles AS map_$1 " . + "ON test_". $obj ."s.". $1 ." = map_$1.userid"); + } + $f = "map_$1.login_name"; + + }, + ",isnotnull" => sub { + $term = "$ff is not null"; + }, + ",isnull" => sub { + $term = "$ff is null"; + }, + ",equals" => sub { + $term = "$ff = $q"; + }, + ",notequals" => sub { + $term = "$ff != $q"; + }, + ",casesubstring" => sub { + $term = $dbh->sql_position($q, $ff) . " > 0"; + }, + ",substring" => sub { + $term = $dbh->sql_position(lc($q), "LOWER($ff)") . " > 0"; + }, + ",substr" => sub { + $funcsbykey{",substring"}->(); + }, + ",notsubstring" => sub { + $term = $dbh->sql_position(lc($q), "LOWER($ff)") . " = 0"; + }, + ",regexp" => sub { + $term = "$ff " . $dbh->sql_regexp() . " $q"; + }, + ",notregexp" => sub { + $term = "$ff " . $dbh->sql_not_regexp() . " $q"; + }, + ",lessthan" => sub { + $term = "$ff < $q"; + }, + ",greaterthan" => sub { + $term = "$ff > $q"; + }, + ",anyexact" => sub { + my @list; + foreach my $w (split(/,/, $v)) { + push(@list, $dbh->quote($w)); + } + if (@list) { + $term = "$ff IN (" . join (',', @list) . ")"; + } + }, + ",anywordssubstr" => sub { + $term = join(" OR ", @{GetByWordListSubstr($ff, $v)}); + }, + ",allwordssubstr" => sub { + $term = join(" AND ", @{GetByWordListSubstr($ff, $v)}); + }, + ",nowordssubstr" => sub { + my @list = @{GetByWordListSubstr($ff, $v)}; + if (@list) { + $term = "NOT (" . join(" OR ", @list) . ")"; + } + }, + ",anywords" => sub { + $term = join(" OR ", @{GetByWordList($ff, $v)}); + }, + ",allwords" => sub { + $term = join(" AND ", @{GetByWordList($ff, $v)}); + }, + ",nowords" => sub { + my @list = @{GetByWordList($ff, $v)}; + if (@list) { + $term = "NOT (" . join(" OR ", @list) . ")"; + } + }, + ); + + if ($cgi->param('case_id')) { + my $type = "anyexact"; + if ($cgi->param('caseidtype')) + { + if ($cgi->param('caseidtype') eq 'exclude') + { + $type = "nowords"; + } + else + { + $type = $cgi->param('caseidtype') + } + } + if ($obj eq 'run'){ + push(@specialchart, ["run_case_id", $type, join(',', $cgi->param('case_id'))]); + } + elsif ($obj eq 'plan'){ + push(@specialchart, ["plan_case_id", $type, join(',', $cgi->param('case_id'))]); + } + else{ + push(@specialchart, ["case_id", $type, join(',', $cgi->param('case_id'))]); + } + } + if ($cgi->param('run_id')) { + my $type = "anyexact"; + if ($cgi->param('runidtype')) + { + if ($cgi->param('runidtype') eq 'exclude') + { + $type = "nowords"; + } + else + { + $type = $cgi->param('runidtype') + } + } + if ($obj eq 'case'){ + push(@specialchart, ["cases_in_runs", $type, join(',', $cgi->param('run_id'))]); + } + else { + push(@specialchart, ["run_id", $type, join(',', $cgi->param('run_id'))]); + } + } + if ($cgi->param('plan_id')) { + my $type = "anyexact"; + if ($cgi->param('planidtype')) + { + if ($cgi->param('planidtype') eq 'exclude') + { + $type = "nowords"; + } + else + { + $type = $cgi->param('planidtype') + } + } + if ($obj eq 'case'){ + push(@specialchart, ["case_plan_id", $type, join(',', $cgi->param('plan_id'))]); + if ($cgi->param('exclude')){ + my @exclusions = split(/,/, $cgi->param('exclude')); + foreach (@exclusions){ + detaint_natural($_); + } + push @wherepart, 'test_cases.case_id NOT IN ('. join(',', @exclusions) .')'; + } + } + elsif ($obj eq 'run'){ + push(@specialchart, ["run_plan_id", $type, join(',', $cgi->param('plan_id'))]); + } + elsif ($obj eq 'case_run'){ + push(@specialchart, ["caserun_plan_id", $type, join(',', $cgi->param('plan_id'))]); + } + else{ + push(@specialchart, ["plan_id", $type, join(',', $cgi->param('plan_id'))]); + } + } + if ($cgi->param('bug_id')) { + my $type = "anyexact"; + if ($cgi->param('bugidtype') && $cgi->param('bugidtype') eq 'exclude') { + $type = "nowords"; + } + push(@specialchart, ["bug", $type, join(',', $cgi->param('bug_id'))]); + } + if ($cgi->param("product_id") || $cgi->param("product")){ + my $attribute = $cgi->param("product_id") ? "product_id" : "product"; + my $type = "anyexact"; + if ($cgi->param('prodidtype') && $cgi->param('prodidtype') eq 'exclude') { + $type = "nowords"; + } + if ($obj eq 'run'){ + push(@specialchart, ["run_prod", $type, join(',', $cgi->param($attribute))]); + } + elsif ($obj eq 'case'){ + push(@specialchart, ["case_prod", $type, join(',', $cgi->param($attribute))]); + } + elsif ($obj eq 'case_run'){ + push(@specialchart, ["caserun_prod", $type, join(',', $cgi->param($attribute))]); + } + else{ + if ($cgi->param("product")){ + push(@specialchart, ["prod_name", $type, join(',', $cgi->param($attribute))]); + } + else{ + push(@specialchart, ["product_id", $type, join(',', $cgi->param($attribute))]); + } + } + } + # Check the Multi select fields and add them to the chart + my @legal_fields = ("case_status_id", "category", "category_id", "priority_id", + "component", "isautomated", "case_run_status_id", + "default_product_version", "run_product_version", "type_id", + "build", "build_id", "environment_id", "milestone", "env_products", + "env_categories", "env_elements", "env_properties", + "env_expressions", "case_status", "priority", "environment", + "plan_type", "case_run_status"); + + foreach my $field ($cgi->param()) { + if (lsearch(\@legal_fields, $field) != -1) { + push(@specialchart, [$field, "anyexact", + join(',', $cgi->param($field))]); + } + } + # 19.01.2007 - Changed multiselct version fields to 'version'. + # Changing them above in @legal_fields could break API funtionality + # So we redifine them here. + if (defined $cgi->param('version')){ + my $field; + if ($obj eq 'case_run'){ + $field = 'run_product_version'; + } + elsif ($obj eq 'run'){ + $field = 'product_version'; + } + elsif ($obj eq 'plan'){ + $field = 'default_product_version'; + } + push(@specialchart, [$field, "anyexact", join(',', $cgi->param('version'))]); + } + if (defined $cgi->param('run_status')){ + my @sta = $cgi->param('run_status'); + unless (scalar @sta > 1){ + if ($cgi->param('run_status') == 1){ + push(@specialchart, ['stop_date', 'isnotnull', 'null']); + } + else { + push(@specialchart, ['stop_date', 'isnull', 'null']); + } + } + } + if (defined $cgi->param('close_date')){ + my @sta = $cgi->param('close_date'); + unless (scalar @sta > 1){ + if ($cgi->param('close_date') == 1){ + push(@specialchart, ['close_date', 'isnotnull', 'null']); + } + else { + push(@specialchart, ['close_date', 'isnull', 'null']); + } + } + } + # Check the tags and add them to the chart + if ($cgi->param('tags')) { + my $t = $cgi->param('tags_type'); + if (!$t || $t eq "or") { + $t = "anywords"; + } + push(@specialchart, ["tags", $t, $cgi->param('tags')]); + } + # Check for author + my @clist; + foreach my $profile ("author", "manager", "default_tester", + "assignee", "testedby"){ + $t = $cgi->param($profile . "_type") || ''; + if ($t eq "exact" || $t eq '') { + $t = "anyexact"; + if ($cgi->param($profile)){ + foreach my $name (split(',', $cgi->param($profile))) { + $name = trim($name); + if ($name) { + login_to_id($name); + } + } + } + } + if ($cgi->param($profile)){ + if ($cgi->param('andor')){ + push(@specialchart, [$profile, $t, trim($cgi->param($profile))]); + } + else{ + push(@clist, $profile, $t, trim($cgi->param($profile))); + } + } + } + if (@clist) { + push(@specialchart, \@clist); + } + + # check static text fields + foreach my $f ("case_summary", "summary", "tcaction", "tceffect", "script", + "requirement", "name", "plan_text", "environment_name", + "notes", "env_value_selected") { + if (defined $cgi->param($f)) { + my $s = trim($cgi->param($f)); + if ($s ne "") { + trick_taint($s); + my $type = $cgi->param($f . "_type"); + push(@specialchart, [$f, $type, $s]); + } + } + } + if ($obj eq 'plan'){ + unless ($cgi->param('isactive')){ + push @wherepart, 'test_plans.isactive = 1'; + } + } + if ($obj eq 'case_run'){ + unless ($cgi->param('isactive')){ + push @wherepart, 'test_case_runs.iscurrent = 1'; + } + } + + my @funcnames; + while (@funcdefs) { + my $key = shift(@funcdefs); + my $value = shift(@funcdefs); + if ($key =~ /^[^,]*$/) { + die "All defs in %funcs must have a comma in their name: $key"; + } + if (exists $funcsbykey{$key}) { + die "Duplicate key in %funcs: $key"; + } + $funcsbykey{$key} = $value; + push(@funcnames, $key); + } + + # first we delete any sign of "Chart #-1" from the HTML form hash + # since we want to guarantee the user didn't hide something here + my @badcharts = grep /^(field|type|value)-1-/, $cgi->param(); + foreach my $field (@badcharts) { + $cgi->delete($field); + } + + # now we take our special chart and stuff it into the form hash + my $chart = -1; + my $row = 0; + foreach my $ref (@specialchart) { + my $col = 0; + while (@$ref) { + $cgi->param("field$chart-$row-$col", shift(@$ref)); + $cgi->param("type$chart-$row-$col", shift(@$ref)); + $cgi->param("value$chart-$row-$col", shift(@$ref)); + if ($debug) { + print qq{

$cgi->param("field$chart-$row-$col") | $cgi->param("type$chart-$row-$col") | $cgi->param("value$chart-$row-$col")*

\n}; + } + $col++; + + } + $row++; + } + # get a list of field names to verify the user-submitted chart fields against + my $ref = $dbh->selectall_arrayref("SELECT name, fieldid FROM test_fielddefs"); + foreach my $list (@{$ref}) { + my ($name, $id) = @{$list}; + $chartfields{$name} = $id; + } + + $row = 0; + for ($chart=-1 ; + $chart < 0 || $cgi->param("field$chart-0-0") ; + $chart++) { + $chartid = $chart >= 0 ? $chart : ""; + my @chartandlist = (); + for ($row = 0 ; + $cgi->param("field$chart-$row-0") ; + $row++) { + my @orlist; + for (my $col = 0 ; + $cgi->param("field$chart-$row-$col") ; + $col++) { + $f = $cgi->param("field$chart-$row-$col") || "noop"; + $t = $cgi->param("type$chart-$row-$col") || "noop"; + $v = $cgi->param("value$chart-$row-$col"); + $v = "" if !defined $v; + $v = trim($v); + if ($f eq "noop" || $t eq "noop" || $v eq "") { + next; + } + # chart -1 is generated by other code above, not from the user- + # submitted form, so we'll blindly accept any values in chart -1 + if ((!$chartfields{$f}) && ($chart != -1)) { + ThrowCodeError("invalid_field_name", {field => $f}); + } + + # This is either from the internal chart (in which case we + # already know about it), or it was in %chartfields, so it is + # a valid field name, which means that it's ok. + trick_taint($f); + $q = $dbh->quote($v); + my $rhs = $v; + $rhs =~ tr/,//; + my $func; + $term = undef; + foreach my $key (@funcnames) { + if ("$f,$t,$rhs" =~ m/$key/) { + my $ref = $funcsbykey{$key}; + if ($debug) { + print "

$key ($f , $t , $rhs ) => "; + } + $ff = $f; + if ($f !~ /\./) { + $ff = "test_". $obj ."s.$f"; + } + &$ref; + if ($debug) { + print "$f , $t , $v , $term

"; + } + if ($term) { + last; + } + } + } + if ($term) { + push(@orlist, $term); + } + else { + # This field and this type don't work together. + ThrowCodeError("field_type_mismatch", + { field => $cgi->param("field$chart-$row-$col"), + type => $cgi->param("type$chart-$row-$col"), + }); + } + } + if (@orlist) { + @orlist = map("($_)", @orlist) if (scalar(@orlist) > 1); + push(@chartandlist, "(" . join(" OR ", @orlist) . ")"); + } + } + if (@chartandlist) { + if ($cgi->param("negate$chart")) { + push(@andlist, "NOT(" . join(" AND ", @chartandlist) . ")"); + } else { + push(@andlist, "(" . join(" AND ", @chartandlist) . ")"); + } + } + } + + # The ORDER BY clause goes last, but can require modifications + # to other parts of the query, so we want to create it before we + # write the FROM clause. + foreach my $orderitem (@inputorder) { + # Some fields have 'AS' aliases. The aliases go in the ORDER BY, + # not the whole fields. + # XXX - Ideally, we would get just the aliases in @inputorder, + # and we'd never have to deal with this. + if ($orderitem =~ /\s+AS\s+(.+)$/i) { + $orderitem = $1; + } + BuildOrderBy($orderitem, \@orderby); + } + # Now JOIN the correct tables in the FROM clause. + # This is done separately from the above because it's + # cleaner to do it this way. + foreach my $orderitem (@inputorder) { + # Grab the part without ASC or DESC. + my @splitfield = split(/\s+/, $orderitem); + if ($specialorderjoin{$splitfield[0]}) { + push(@supptables, $specialorderjoin{$splitfield[0]}); + } + } + if ($debug){ + print "
";
+        print join("\n", @supptables);
+        print "
"; + } + my %suppseen = ("test_". $obj ."s" => 1); + my $suppstring = "test_". $obj ."s"; + my @supplist = (" "); + foreach my $str (@supptables) { + if (!$suppseen{$str}) { + if ($str =~ /^(LEFT|INNER|RIGHT)\s+JOIN/i) { + $str =~ /^(.*?)\s+ON\s+(.*)$/i; + my ($leftside, $rightside) = ($1, $2); + if ($suppseen{$leftside}) { + $supplist[$suppseen{$leftside}] .= " AND ($rightside)"; + } else { + $suppseen{$leftside} = scalar @supplist; + push @supplist, " $leftside ON ($rightside)"; + } + } else { + # Do not accept implicit joins using comma operator + # as they are not DB agnostic + # ThrowCodeError("comma_operator_deprecated"); + $suppstring .= ", $str"; + $suppseen{$str} = 1; + } + } + } + $suppstring .= join('', @supplist); + + # Make sure we create a legal SQL query. + @andlist = ("1 = 1") if !@andlist; + + my $query; + if ($self->{'fields'}){ + $query = "SELECT ". join(",", @{$self->{'fields'}}); + } + else { + $query = "SELECT test_". $obj ."s.". $obj. "_id"; + } + $query .= " FROM $suppstring"; + $query .= " WHERE " . join(' AND ', (@wherepart, @andlist)); + + + foreach my $field (@fields, @orderby) { + next if ($field =~ /(AVG|SUM|COUNT|MAX|MIN|VARIANCE)\s*\(/i || + $field =~ /^\d+$/ || $field eq "bugs.bug_id" || + $field =~ /^relevance/); + if ($field =~ /.*AS\s+(\w+)$/i) { + push(@groupby, $1) if !grep($_ eq $1, @groupby); + } else { + push(@groupby, $field) if !grep($_ eq $field, @groupby); + } + } + $query .= " " . $dbh->sql_group_by("test_". $obj ."s.". $obj ."_id", join(', ', @groupby)); + + + if (@having) { + $query .= " HAVING " . join(" AND ", @having); + } + + if (@orderby) { + $query .= " ORDER BY " . join(',', @orderby); + } + if (defined $page){ + $query .= " LIMIT $pagesize OFFSET ". $page*$pagesize; + } + if ($debug) { + print "

" . value_quote($query) . "

\n"; + } + + $self->{'sql'} = $query; + +} + +sub query { + my $self = shift; + return $self->{'sql'}; +} + +sub GetByWordList { + my ($field, $strs) = (@_); + my @list; + my $dbh = Bugzilla->dbh; + + foreach my $w (split(/[\s,]+/, $strs)) { + my $word = $w; + if ($word ne "") { + $word =~ tr/A-Z/a-z/; + $word = $dbh->quote(quotemeta($word)); + trick_taint($word); + $word =~ s/^'//; + $word =~ s/'$//; + $word = '(^|[^a-z0-9])' . $word . '($|[^a-z0-9])'; + push(@list, "$field " . $dbh->sql_regexp() . " '$word'"); + } + } + + return \@list; +} + +# Support for "any/all/nowordssubstr" comparison type ("words as substrings") +sub GetByWordListSubstr { + my ($field, $strs) = (@_); + my @list; + my $dbh = Bugzilla->dbh; + + foreach my $word (split(/[\s,]+/, $strs)) { + trick_taint($word); + if ($word ne "") { + push(@list, $dbh->sql_position(lc($dbh->quote($word)), + "LOWER($field)") . " > 0"); + } + } + + return \@list; +} + +=head1 SEE ALSO + +Testopia::Table Bugzilla::Search + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/Table.pm b/Bugzilla/Testopia/Table.pm new file mode 100644 index 0000000..3bd077a --- /dev/null +++ b/Bugzilla/Testopia/Table.pm @@ -0,0 +1,484 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks + +=head1 NAME + +Bugzilla::Testopia::Table - Produces display tables for Testopia lists + +=head1 DESCRIPTION + +A table is generated as a result of a query. This module returns +a list of Testopia objects that were queried for. It supports +pagination of data as well as sorting. It takes the following +arguments: + +=over + +=item type - one of 'case', 'plan', 'run', 'caserun', or 'environment' + +=item url - the cgi file that is calling this + +=item cgi - a CGI object + +=item list - A reference to a list + +=item query - An SQL query string, usually generated by Search.pm + +=back + +=head1 SYNOPSIS + + $table = Bugzilla::Testopia::Table->new($type, $url, $cgi, $list, $query); + +=cut + +package Bugzilla::Testopia::Table; + +use strict; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestCase; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::TestCaseRun; + +############################### +#### Initialization #### +############################### + +# For use in sorting functions which do not allow arguments +our $field; +our $reverse; + +=head1 METHODS + +=head2 new + +Instantiates a new table object + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + + my $self = {}; + bless($self, $class); + + $self->init(@_); + + return $self; +} + +=head2 init + +Private constructor for this class + +=cut + +sub init { + my $self = shift; + my ($type, $url, $cgi, $list, $query) = @_; + $self->{'user'} = Bugzilla->user; + $self->{'type'} = $type || ThrowCodeError('bad_arg', + {argument => 'type', + function => 'Testopia::Table::_init'}); + $self->{'url_loc'} = $url; + $self->{'cgi'} = $cgi; + my $debug = $cgi->param('debug') if $cgi; + my @list; + if ($query){ + print "$query" if $debug; + + # For paging we need to know the total number of items + # but Search.pm returns a query with a subset + my $countquery = $query; + $countquery =~ s/ LIMIT.*$//; + print "
$countquery" if $debug; + + my $dbh = Bugzilla->switch_to_shadow_db(); + + my $count_res = $dbh->selectcol_arrayref($countquery); + my $count = scalar @$count_res; + print "
total rows: $count" if $debug; + + $self->{'list_count'} = $count; + my @ids; + my $list = $dbh->selectcol_arrayref($query); + + $dbh = Bugzilla->switch_to_main_db(); + + foreach my $id (@$list){ + my $o; + if ($type eq 'case'){ + $o = Bugzilla::Testopia::TestCase->new($id); + } + elsif ($type eq 'plan'){ + $o = Bugzilla::Testopia::TestPlan->new($id); + } + elsif ($type eq 'run'){ + $o = Bugzilla::Testopia::TestRun->new($id); + } + elsif ($type eq 'case_run'){ + $o = Bugzilla::Testopia::TestCaseRun->new($id); + } + elsif ($type eq 'environment'){ + $o = Bugzilla::Testopia::Environment->new($id); + } + push (@ids, $id); + push (@list, $o); + } + $self->{'list'} = \@list; + $self->{'view_count'} = scalar @list; + $self->{'id_list'} = join(",", @$count_res); + } + if ($cgi){ + $self->{'viewall'} = $cgi->param('viewall'); + $self->{'page'} = $cgi->param('page') || 0; + } + +# elsif (!$query && !$list){ +# my @list; +# foreach my $id (split(",", $self->get_saved_list())){ +# if ($self->{'type'} eq 'case'){ +# my $o = Bugzilla::Testopia::TestCase->new($id); +# push @list, $o; +# $o->category; +# $o->status; +# $o->priority; +# } +# elsif ($self->{'type'} eq 'plan'){ +# my $o = Bugzilla::Testopia::TestPlan->new($id); +# push @list, $o; +# $o->test_case_count; +# $o->test_run_count; +# } +# elsif ($self->{'type'} eq 'run'){ +# my $o = Bugzilla::Testopia::TestCase->new($id); +# push @list, $o; +## $o->category; +## $o->status; +## $o->priority; +# } +# elsif ($self->{'type'} eq 'caserun'){ +# my $o = Bugzilla::Testopia::TestCase->new($id); +# push @list, $o; +## $o->category; +## $o->status; +## $o->priority; +# } +# elsif ($self->{'type'} eq 'attachment'){ +# my $o = Bugzilla::Testopia::TestCase->new($id); +# push @list, $o; +## $o->category; +## $o->status; +## $o->priority; +# } +# else { +# ThrowUserError('unknown-type'); +# } +# } +# $self->{'list'} = \@list; +# } +# else { +# $self->{'list'} = $list; +# } +# my @params = split(":", $cgi->cookie('TESTORDER')); +# $self->{'last_sort'} = shift @params || undef; +# $self->{'reverse_sort'} = shift @params || undef; +# +# #### SORT #### +# # This is very inefficient. It would be much better to have +# # the database do this. +# my $order = $cgi->param('order'); +# if ($order){ +# $self->sort_fields($order); +# $self->{'reverse_sort'} = ($self->{'reverse_sort'} ? 1 : 0); +# } +# + #### SAVE #### + # Save the list of testcases for use in paginating and sorting + $self->save_list; +# +# #### SPLICE #### +# # If we are using a paged view of the data we split it up here +# $self->get_page($self->{'page'}); + +} + +############################### +#### Methods #### +############################### + +=head2 save_list + +Saves the last list to the database as a hidden saved search +Used only in list context + +=cut + +sub save_list { + my $self = shift; + return if ($self->{'user'}->id == 0); +# my @ids; +# foreach my $i (@{$self->{'list'}}){ +# push @ids, $i->id; +# } +# my $list = join(",", @ids); + my $dbh = Bugzilla->dbh; + if ($self->{'id_list'}){ + $dbh->bz_lock_tables('test_named_queries WRITE'); + my ($is) = $dbh->selectrow_array( + "SELECT 1 FROM test_named_queries + WHERE userid = ? AND name = ?", undef, + ($self->{'user'}->id, "__". $self->{'type'} ."__")); + + if ($is) { + $dbh->do("UPDATE test_named_queries SET query = ? + WHERE userid = ? AND name = ?", undef, + (join(",", $self->{'id_list'}), $self->{'user'}->id, "__". $self->{'type'} ."__")); + } + else { + $dbh->do("INSERT INTO test_named_queries (userid, name, isvisible, query) VALUES(?,?,?,?)", undef, + ($self->{'user'}->id, "__". $self->{'type'} ."__", 0, join(",", $self->{'id_list'}))); + } + $dbh->bz_unlock_tables(); + } +# $self->{'list_count'} = scalar @ids unless $self->{'query'}; +} + +=head2 get_saved_list + +Retrieves a saved list from the database +Used only in list context + +=cut + +sub get_saved_list { + my $self = shift; + return undef if ($self->{'user'}->id == 0); + my $type = shift || $self->{'type'}; + my $dbh = Bugzilla->dbh; + my ($list) = $dbh->selectrow_array( + "SELECT query FROM test_named_queries + WHERE userid = ? AND name = ?", undef, + ($self->{'user'}->id, "__". $type ."__")); + my @list = split(',', $list); + return \@list; +} + +# used by the sort function to check which field to sort on +# we turn off warnings to supress the nonnumeric vs numeric junk +sub sort_fields { + no warnings; + if ($field eq 'category'){ + if ($reverse){ + $a->category->name cmp $b->category->name; + } + else { + $b->category->name cmp $a->category->name; + } + } + elsif ($field eq 'plans'){ + if ($reverse){ + scalar @{$a->plans} <=> scalar @{$b->plans}; + } + else { + scalar @{$b->plans} <=> scalar @{$a->plans}; + } + } + else{ + if ($reverse){ + $a->{$field} cmp $b->{$field}; + } + else { + $b->{$field} cmp $a->{$field}; + } + } + use warnings; +} + +sub sort_list { + my $self = shift; + $field = shift; + $reverse = $self->{'reverse_sort'}; + my @list = sort sort_fields @{$self->{'list'}}; + $self->{'list'} = \@list; + return $self->{'list'}; +} + +sub get_page { + my $self = shift; + if ($self->{'viewall'}){ + return $self->{'list'}; + } + my $pagenum = shift || $self->{'page'}; + $self->{'page'} = $pagenum; + my $offset = $pagenum * $self->page_size; + my @list = @{$self->{'list'}}; + @list = splice(@list, $offset, $self->page_size); + $self->{'list'} = \@list; + return $self->{'list'}; +} + +sub get_next{ + my $self = shift; + my ($curr) = @_; + + my $list = $self->get_list; + my $ref = lsearch($curr, $list); + return undef if $ref == -1; + return $list->[$ref]; +} +############################### +#### Accessors #### +############################### + +sub list { return $_[0]->{'list'}; } +sub id_list { return $_[0]->{'id_list'}; } +sub list_count { return $_[0]->{'list_count'}; } +sub view_count { return $_[0]->{'view_count'}; } +sub page { return $_[0]->{'page'}; } +sub url_loc { return $_[0]->{'url_loc'}; } +sub type { return $_[0]->{'type'}; } + +=head2 page_size + +Returns an ineger representing how many items should appear on a page + +=cut + +sub page_size { + my $self = shift; + my $cgi = $self->{'cgi'}; + return $cgi->param('pagesize') if $cgi->param('pagesize'); + return 25; +} + +=head2 get_order_url + +Returns a URL query string from a CGI object which is used by +column headers to produce a sort order + +=cut + +sub get_order_url { + my $self = shift; + return $self->get_url('(page|order)'); +} + +=head2 get_page_url + +Retrns a URL query string from a CGI object which is used by +the page navigation links to move from page to page. + +=cut + +sub get_page_url { + my $self = shift; + return $self->get_url('page'); +} + +sub get_url { + my ($self, $regxp) = @_; + my $cgi = $self->{'cgi'}; + my @keys = $cgi->param; + my $qstring =''; + foreach my $key (@keys){ + if ((defined $regxp) && ($key =~ $regxp)){ + next; + } + my @vals = $cgi->param($key); + foreach my $val (@vals){ + $qstring .= $key ."=". url_quote($val) ."&"; + } + } + chop $qstring; + $qstring = $self->{'url_loc'} ."?". $qstring; + $self->{'url'} = $qstring; + return $self->{'url'}; +} + +sub get_query_part { + my $self = shift; + my $cgi = $self->{'cgi'}; + my @keys = $cgi->param; + my $qstring; + foreach my $key (@keys){ + my @vals = $cgi->param($key); + foreach my $val (@vals){ + $qstring .= $key ."=". url_quote($val) ."&"; + } + } + chop $qstring; + return $qstring +} + +=head2 page_count + +Returns a total count of the number of pages returned by a query. +Determined in part by page_size + +=cut + +sub page_count { + my $self = shift; + if ($self->list_count % $self->page_size){ + use integer; + return ($self->list_count / $self->page_size) + 1; + } + return $self->list_count/$self->page_size; +} + +sub reverse_sort { + my $self = shift; + return $self->{'reverse_sort'}; +} + +sub ajax { + my $self = shift; + return $self->{'ajax'} ? 1 : 0; +} + +sub arrow { + my $self = shift; + if ($self->{'reverse_sort'}) { + $self->{'arrow'} = ''; + } + else { + $self->{'arrow'} = ''; + } + return $self->{'arrow'}; +} + +=head1 SEE ALSO + +Testopia::Search + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/TestCase.pm b/Bugzilla/Testopia/TestCase.pm new file mode 100644 index 0000000..c205b5a --- /dev/null +++ b/Bugzilla/Testopia/TestCase.pm @@ -0,0 +1,1825 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Portions taken from processbug.cgi and Bug.pm +# which are copyrighted by +# Terry Weissman +# Dan Mosedale +# Dave Miller +# Christopher Aillon +# Myk Melez +# Jeff Hedlund +# Frederic Buclin +# +# Contributor(s): Greg Hendricks + +=head1 NAME + +Bugzilla::Testopia::TestCase - Testopia Test Case object + +=head1 DESCRIPTION + +This module represents a test case in Testopia. Each test case must +be linked to one or more test plans. + +=head1 SYNOPSIS + +use Bugzilla::Testopia::TestCase; + + $case = Bugzilla::Testopia::TestCase->new($case_id); + $case = Bugzilla::Testopia::TestCase->new(\%case_hash); + +=cut + +package Bugzilla::Testopia::TestCase; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Bug; +use Bugzilla::User; +use Bugzilla::Config; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Testopia::Constants; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::TestCaseRun; +use Bugzilla::Testopia::Category; + +use Text::Diff; + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + case_id + case_status_id + category_id + priority_id + author_id + default_tester_id + creation_date + estimated_time + isautomated + sortkey + script + arguments + summary + requirement + alias + +=cut + +use constant DB_COLUMNS => qw( + case_id + test_cases.case_status_id + category_id + priority_id + author_id + default_tester_id + creation_date + estimated_time + isautomated + sortkey + script + arguments + summary + requirement + alias +); + +use constant ALIAS_MAX_LENGTH => 255; +use constant REQUIREMENT_MAX_LENGTH => 255; +use constant SUMMARY_MAX_LENGTH => 255; +use constant TAG_MAX_LENGTH => 255; + +our $columns = join(", ", DB_COLUMNS); + +sub display_columns { +my $self = shift; +my @columns = + [{column => 'case_id', desc => 'ID' }, + {column => 'case_status_id', desc => 'Status' }, + {column => 'category_id', desc => 'Category' }, + {column => 'priority_id', desc => 'Priority' }, + {column => 'summary', desc => 'Summary' }, + {column => 'requirement', desc => 'Requirement' }, + {column => 'alias', desc => 'Alias' }]; + +$self->{'display_columns'} = \@columns; +return $self->{'display_columns'}; +} + +sub report_columns { + my $self = shift; + my %columns; + # Changes here need to match Report.pm + $columns{'Status'} = "case_status"; + $columns{'Priority'} = "priority"; + $columns{'Product'} = "product_id"; + $columns{'Component'} = "component"; + $columns{'Category'} = "category"; + $columns{'Automated'} = "isautomated"; + $columns{'Tags'} = "tags"; + $columns{'Requirement'} = "requirement"; + $columns{'Author'} = "author"; + $columns{'Default tester'} = "default_tester"; + my @result; + push @result, {'name' => $_, 'id' => $columns{$_}} foreach (sort(keys %columns)); + unshift @result, {'name' => '', 'id'=> ''}; + return \@result; + +} + +=head1 METHODS + +=cut + +############################### +#### Methods #### +############################### + +=head2 new + +Instantiate a new Test Case. This takes a single argument +either a test case ID or a reference to a hash containing keys +identical to a test case's fields and desired values. + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private Test Case constructor. This does the actual work of building +a test case object which is passed to new to be blessed + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns FROM test_cases + WHERE case_id = ?}, undef, $id); + } elsif (ref $param eq 'HASH'){ + $obj = $param; + } else { + ThrowCodeError('bad_arg', + {argument => 'param', + function => 'Testopia::TestCase::_init'}); + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + return $self; +} + +=head2 get_selectable_components + +Returns a reference to a list of selectable components not already +associated with this case. + +=cut + +sub get_selectable_components { + my $self = shift; + my ($byid) = @_; + my $dbh = Bugzilla->dbh; + my @exclusions; + unless ($byid) { + foreach my $e (@{$self->components}){ + push @exclusions, $e->{'id'}; + } + } + my $query = "SELECT DISTINCT id FROM components + WHERE product_id IN (" . join(",", @{$self->get_product_ids}) . ") "; + if (@exclusions){ + $query .= "AND id NOT IN(". join(",", @exclusions) .") "; + } + $query .= "ORDER BY name"; + + my $ref = $dbh->selectcol_arrayref($query); + my @comps; + push @comps, {'id' => '0', 'name' => '--Please Select--'} unless $byid; + foreach my $id (@$ref){ + push @comps, Bugzilla::Component->new($id); + } + return \@comps; +} + +=head2 get_category_list + +Returns a list of categories associated with products in all +plans referenced by this case. + +=cut + +sub get_category_list{ + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $ids = $dbh->selectcol_arrayref( + "SELECT category_id + FROM test_case_categories + WHERE product_id IN (". join(",", @{$self->get_product_ids}) .")"); + my @categories; + foreach my $c (@$ids){ + push @categories, Bugzilla::Testopia::Category->new($c); + } + return \@categories; +} + +=head2 get_product_ids + +Returns the list of product ids that this case is associated with + +=cut + +sub get_product_ids { + my $self = shift; + + if ($self->id == 0){ + my @ids; + foreach my $plan (@{$self->plans}){ + push @ids, $plan->product_id if Bugzilla->user->can_see_product($plan->product->name); + } + return \@ids; + } + + my $dbh = Bugzilla->dbh; + + my $ref = $dbh->selectcol_arrayref( + "SELECT DISTINCT products.id FROM products + JOIN test_plans AS plans ON plans.product_id = products.id + JOIN test_case_plans ON plans.plan_id = test_case_plans.plan_id + JOIN test_cases AS cases ON cases.case_id = test_case_plans.case_id + WHERE cases.case_id = ? + ORDER BY products.id", undef, $self->{'case_id'}); + return $ref; +} + +=head2 get_status_list + +Returns the list of legal statuses for a test case + +=cut + +sub get_status_list { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref(" + SELECT case_status_id AS id, name + FROM test_case_status", {"Slice"=>{}}); + return $ref +} + +=head2 get_priority_list + +Returns a list of legal priorities + +=cut + +sub get_priority_list { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref(" + SELECT id, value AS name FROM priority + ORDER BY sortkey", {"Slice"=>{}}); + return $ref +} + +=head2 get_caserun_count + +Takes a status and returns the count of that status + +=cut + +sub get_caserun_count { + my $self = shift; + my ($status) = @_; + my $dbh = Bugzilla->dbh; + + my $query = "SELECT COUNT(*) + FROM test_case_runs + WHERE case_id = ? "; + $query .= "AND case_run_status_id = ?" if $status; + + my $count; + if ($status){ + ($count) = $dbh->selectrow_array($query,undef,($self->id,$status)); + } + else { + ($count) = $dbh->selectrow_array($query,undef,$self->id); + } + return $count; +} + +=head2 add_tag + +Associates a tag with this test case + +=cut + +sub add_tag { + my $self = shift; + my ($tag_id) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->bz_lock_tables('test_case_tags WRITE'); + my $tagged = $dbh->selectrow_array( + "SELECT 1 FROM test_case_tags + WHERE tag_id = ? AND case_id = ?", + undef, $tag_id, $self->{'case_id'}); + if ($tagged) { + $dbh->bz_unlock_tables(); + return 1; + } + $dbh->do("INSERT INTO test_case_tags(tag_id, case_id, userid) VALUES(?,?,?)", + undef, $tag_id, $self->{'case_id'}, Bugzilla->user->id); + $dbh->bz_unlock_tables(); + + return 0; +} + +=head2 remove_tag + +Disassociates a tag from this test case + +=cut + +sub remove_tag { + my $self = shift; + my ($tag_id) = @_; + my $dbh = Bugzilla->dbh; + $dbh->do("DELETE FROM test_case_tags + WHERE tag_id=? AND case_id=?", + undef, $tag_id, $self->{'case_id'}); + return; +} + +=head2 attach_bug + +Attaches the specified bug to this test case + +=cut + +sub attach_bug { + my $self = shift; + my ($bug, $case_id) = @_; + $case_id ||= $self->{'case_id'}; + my $dbh = Bugzilla->dbh; + + $dbh->bz_lock_tables('test_case_bugs WRITE'); + my ($exists) = $dbh->selectrow_array( + "SELECT bug_id + FROM test_case_bugs + WHERE case_id=? + AND bug_id=?", + undef, ($case_id, $bug)); + if ($exists) { + $dbh->bz_unlock_tables(); + return; + } + $dbh->do("INSERT INTO test_case_bugs (bug_id, case_run_id, case_id) + VALUES(?,?,?)", undef, ($bug, undef, $self->{'case_id'})); + $dbh->bz_unlock_tables(); +} + +=head2 detach_bug + +Removes the association of the specified bug from this test case-run + +=cut + +sub detach_bug { + my $self = shift; + my ($bug) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->do("DELETE FROM test_case_bugs + WHERE bug_id = ? + AND case_id = ?", + undef, ($bug, $self->{'case_id'})); +} + +=head2 add_component + +Associates a component with this test case + +=cut + +sub add_component { + my $self = shift; + my ($comp_id) = @_; + my $dbh = Bugzilla->dbh; + my ($is) = $dbh->selectrow_array( + "SELECT case_id FROM test_case_components + WHERE case_id = ? AND component_id = ?", + undef, ($self->id, $comp_id)); + return 0 if $is; + + $dbh->do("INSERT INTO test_case_components (case_id, component_id) + VALUES (?,?)",undef, $self->{'case_id'}, $comp_id); + delete $self->{'components'}; +} + +=head2 remove_component + +Disassociates a component with this test case + +=cut + +sub remove_component { + my $self = shift; + my ($comp_id) = @_; + my $dbh = Bugzilla->dbh; + $dbh->do("DELETE FROM test_case_components + WHERE case_id = ? AND component_id = ?", + undef, $self->{'case_id'}, $comp_id); +} + +=head2 compare_doc_versions + +Returns a unified diff of two versions of a case document (action +and effect). It takes two arguments both integers representing +the first and second versions to compare. + +=cut + +sub compare_doc_versions { + my $self = shift; + my ($newversion, $oldversion) = @_; + detaint_natural($newversion); + detaint_natural($oldversion); + my $dbh = Bugzilla->dbh; + my %diff; + my ($newaction, $neweffect, $newsetup, $newbreakdown) = $dbh->selectrow_array( + "SELECT action, effect, setup, breakdown FROM test_case_texts + WHERE case_id = ? AND case_text_version = ?", + undef, $self->{'case_id'}, $newversion); + + my ($oldaction, $oldeffect, $oldsetup, $oldbreakdown) = $dbh->selectrow_array( + "SELECT action, effect, setup, breakdown FROM test_case_texts + WHERE case_id = ? AND case_text_version = ?", + undef, $self->{'case_id'}, $oldversion); + $diff{'action'} = diff(\$newaction, \$oldaction); + $diff{'effect'} = diff(\$neweffect, \$oldeffect); + $diff{'setup'} = diff(\$newsetup, \$oldsetup); + $diff{'breakdown'} = diff(\$newbreakdown, \$oldbreakdown); + return \%diff; +} + +=head2 diff_case_doc + +Returns the diff of the latest case document (action and effect) +with some text passed as an argument. Used to determine if the +text has changed and thus requiring a new version be created. + +=cut + +sub diff_case_doc { + my $self = shift; + my ($newaction, $neweffect, $newsetup, $newbreakdown) = @_; + my $dbh = Bugzilla->dbh; + my ($oldaction, $oldeffect, $oldsetup, $oldbreakdown) = $dbh->selectrow_array( + "SELECT action, effect, setup, breakdown + FROM test_case_texts + WHERE case_id = ? AND case_text_version = ?", + undef, ($self->{'case_id'}, $self->version)); + my $diff = diff(\$newaction, \$oldaction); + $diff .= diff(\$neweffect, \$oldeffect); + $diff .= diff(\$newsetup, \$oldsetup); + $diff .= diff(\$newbreakdown, \$oldbreakdown); + return $diff +} + +=head2 get_fields + +Returns a reference to a list of test case field descriptions from +the test_fielddefs table. + +=cut + +sub get_fields { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $types = $dbh->selectall_arrayref( + "SELECT fieldid AS id, description AS name + FROM test_fielddefs + WHERE table_name=?", + {"Slice"=>{}}, "test_cases"); + return $types; +} + +=head2 store + +Stores a test case object in the database. This method is used to store a +newly created test case. It returns the new ID. + +=cut + +sub store { + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($timestamp) = Bugzilla::Testopia::Util::get_time_stamp(); + $dbh->do("INSERT INTO test_cases ($columns) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + undef, ## Database Column ## + (undef, # case_id + $self->{'case_status_id'}, # case_status_id + $self->{'category_id'}, # category_id + $self->{'priority_id'}, # priority_id + $self->{'author_id'}, # author_id + $self->{'default_tester_id'}, # default_tester_id + $timestamp, # creation_date + $self->{'estimated_time'}, # estimated_time + $self->{'isautomated'}, # isautomated + $self->sortkey, # sortkey + $self->{'script'}, # script + $self->{'arguments'}, # arguments + $self->{'summary'}, # summary + $self->{'requirement'}, # requirement + $self->{'alias'}, # alias + )); + my $key = $dbh->bz_last_key( 'test_cases', 'case_id' ); + + $self->store_text($key, $self->{'author_id'}, $self->{'action'}, $self->{'effect'}, + $self->{'setup'}, $self->{'breakdown'},0 ,$timestamp); + $self->update_deps($self->{'dependson'}, $self->{'blocks'}, $key); + foreach my $p (@{$self->{'plans'}}){ + $self->link_plan($p->id, $key); + } + return $key; +} + +=head2 store_text + +Stores the test case document (action and effect) in the test_case_texts +table. Used by both store and copy. Accepts the the test case id, +author id, action text, effect text, and an optional timestamp. + +=cut + +sub store_text { + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($key, $author, $action, $effect, $setup, $breakdown, $reset_version, $timestamp) = @_; + if (!defined $timestamp){ + ($timestamp) = Bugzilla::Testopia::Util::get_time_stamp(); + } + my $version = $reset_version ? 0 : $self->version || 0; + $dbh->do("INSERT INTO test_case_texts + (case_id, case_text_version, who, creation_ts, action, effect, setup, breakdown) + VALUES(?,?,?,?,?,?,?,?)", + undef, $key, ++$version, $author, + $timestamp, $action, $effect, $setup, $breakdown); + $self->{'version'} = $version; + return $self->{'version'}; + +} + +=head2 link_plan + +Creates a link to the specified plan id. Optionally can create a link +for an arbitrary test case, not just this one. + +=cut + +sub link_plan { + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($plan_id, $case_id) = @_; + $case_id = $self->{'case_id'} unless defined $case_id; + + #Check that it isn't linked already + + $dbh->bz_lock_tables('test_case_plans WRITE'); + my ($is) = $dbh->selectrow_array( + "SELECT 1 + FROM test_case_plans + WHERE case_id = ? + AND plan_id = ?", + undef, ($case_id, $plan_id)); + if ($is) { + $dbh->bz_unlock_tables(); + return; + } + $dbh->do("INSERT INTO test_case_plans (plan_id, case_id) + VALUES (?,?)", undef, $plan_id, $case_id); + $dbh->bz_unlock_tables(); + + # Update the plans array to include new plan added. + + push @{$self->{'plans'}}, Bugzilla::Testopia::TestPlan->new($plan_id); + +} + + +=head2 unlink_plan + +Removes the link to the specified plan id. + +=cut + +sub unlink_plan { + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($plan_id) = @_; + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + + if (scalar @{$self->plans} == 1){ + $self->obliterate; + return 1; + } + + $dbh->bz_lock_tables('test_case_plans WRITE', 'test_case_runs WRITE', + 'test_runs READ', 'test_plans READ'); + + foreach my $run (@{$plan->test_runs}){ + $dbh->do("DELETE FROM test_case_runs + WHERE case_id = ? + AND run_id = ?", undef, $self->id, $run->id); + } + + $dbh->do("DELETE FROM test_case_plans + WHERE plan_id = ? + AND case_id = ?", + undef, $plan_id, $self->{'case_id'}); + + $dbh->bz_unlock_tables(); + + # Update the plans array. + delete $self->{'plans'}; + + return 1; +} + +=head2 copy + +Creates a copy of this test case. Accepts the plan id to link to and +a boolean representing whether to copy the case document as well. + +=cut + +sub copy { + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($planid, $author, $copydoc) = @_; + my ($timestamp) = Bugzilla::Testopia::Util::get_time_stamp(); + $dbh->do("INSERT INTO test_cases ($columns) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", + undef, + (undef, # case_id + $self->{'case_status_id'}, # case_status_id + $self->{'category_id'}, # category_id + $self->{'priority_id'}, # priority_id + $author, # author_id + $self->{'default_tester_id'}, # default_tester_id + $timestamp, # creation_date + $self->{'estimated_time'}, # estimated_time + $self->{'isautomated'}, # isautomated + $self->sortkey, # sortkey + $self->{'script'}, # script + $self->{'arguments'}, # arguments + $self->{'summary'}, # summary + $self->{'requirement'}, # requirement + undef # alias + )); + + my $key = $dbh->bz_last_key( 'test_cases', 'case_id' ); + + if ($copydoc){ + $self->store_text($key, Bugzilla->user->id, $self->text->{'action'}, + $self->text->{'effect'}, $self->text->{'setup'}, + $self->text->{'breakdown'},'VRESET' , $timestamp); + } + + return $key; + +} + +=head2 check_alias + +Checks if the given alias exists already. Returns the case_id of +the matching case if it does. + +=cut + +sub check_alias { + my $self = shift; + my ($alias) = @_; + + return unless $alias; + my $id = $self->{'case_id'} || ''; + my $dbh = Bugzilla->dbh; + ($id) = $dbh->selectrow_array( + "SELECT case_id + FROM test_cases + WHERE alias = ? + AND case_id != ?", + undef, ($alias, $id)); + + return $id; +} + +=head2 class_check_alias + +Checks if the given alias exists already. Returns the case_id of +the matching test case if it does. + +=cut + +sub class_check_alias { + my ($alias) = @_; + + return unless $alias; + + my $dbh = Bugzilla->dbh; + my ($id) = $dbh->selectrow_array( + "SELECT case_id + FROM test_cases + WHERE alias = ?", + undef, ($alias)); + + return $id; +} + +=head2 update + +Updates this test case with new values supplied by the user. +Accepts a reference to a hash with keys identical to a test cases +fields and values representing the new values entered. +Validation tests should be performed on the values +before calling this method. If a field is changed, a history +of that change is logged in the test_case_activity table. + +=cut + +sub update { + my $self = shift; + my ($newvalues) = @_; + my $dbh = Bugzilla->dbh; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + $dbh->bz_lock_tables('test_cases WRITE', 'test_case_activity WRITE', + 'test_fielddefs READ'); + foreach my $field (keys %{$newvalues}){ + if ($self->{$field} ne $newvalues->{$field}){ + trick_taint($newvalues->{$field}); + $dbh->do("UPDATE test_cases + SET $field = ? WHERE case_id = ?", + undef, $newvalues->{$field}, $self->{'case_id'}); + # Update the history + my $field_id = Bugzilla::Testopia::Util::get_field_id($field, "test_cases"); + $dbh->do("INSERT INTO test_case_activity + (case_id, fieldid, who, changed, oldvalue, newvalue) + VALUES(?,?,?,?,?,?)", + undef, $self->{'case_id'}, $field_id, Bugzilla->user->id, + $timestamp, $self->{$field}, $newvalues->{$field}); + $self->{$field} = $newvalues->{$field}; + } + } + $dbh->bz_unlock_tables(); +} + +=head2 history + +Returns a reference to a list of history entries from the +test_case_activity table. + +=cut + +sub history { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref( + "SELECT defs.description AS what, + p.login_name AS who, a.changed, a.oldvalue, a.newvalue + FROM test_case_activity AS a + JOIN test_fielddefs AS defs ON a.fieldid = defs.fieldid + JOIN profiles AS p ON a.who = p.userid + WHERE a.case_id = ?", + {'Slice'=>{}}, $self->{'case_id'}); + + foreach my $row (@$ref){ + if ($row->{'what'} eq 'Case Status'){ + $row->{'oldvalue'} = $self->lookup_status($row->{'oldvalue'}); + $row->{'newvalue'} = $self->lookup_status($row->{'newvalue'}); + } + elsif ($row->{'what'} eq 'Category'){ + $row->{'oldvalue'} = $self->lookup_category($row->{'oldvalue'}); + $row->{'newvalue'} = $self->lookup_category($row->{'newvalue'}); + } + elsif ($row->{'what'} eq 'Priority'){ + $row->{'oldvalue'} = $self->lookup_priority($row->{'oldvalue'}); + $row->{'newvalue'} = $self->lookup_priority($row->{'newvalue'}); + } + elsif ($row->{'what'} eq 'Default Tester'){ + $row->{'oldvalue'} = $self->lookup_default_tester($row->{'oldvalue'}); + $row->{'newvalue'} = $self->lookup_default_tester($row->{'newvalue'}); + } + } + return $ref; +} + +sub last_changed { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my ($date) = $dbh->selectrow_array( + "SELECT MAX(changed) + FROM test_case_activity + WHERE case_id = ?", + undef, $self->id); + + return $self->{'creation_date'} unless $date; + return $date; + +} + +=head2 lookup_status + +Takes an ID of the status field and returns the value + +=cut + +sub lookup_status { + my $self = shift; + my ($id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT name + FROM test_case_status + WHERE case_status_id = ?", + undef, $id); + return $value; +} + +=head2 lookup_status_by_name + +Returns the id of the status name passed. + +=cut + +sub lookup_status_by_name { + my ($name) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT case_status_id + FROM test_case_status + WHERE name = ?", + undef, $name); + return $value; +} + +=head2 lookup_category + +Takes an ID of the category field and returns the value + +=cut + +sub lookup_category { + my $self = shift; + my ($id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT name + FROM test_case_categories + WHERE category_id = ?", + undef, $id); + return $value; +} + +=head2 lookup_category_by_name + +Returns the id of the category name passed. + +=cut + +sub lookup_category_by_name { + my ($name) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT category_id + FROM test_case_categories + WHERE name = ?", + undef, $name); + return $value; +} + +=head2 lookup_priority + +Takes an ID of the priority field and returns the value + +=cut + +sub lookup_priority { + my $self = shift; + my ($id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT value + FROM priority + WHERE id = ?", + undef, $id); + return $value; +} + +=head2 lookup_priority_by_name + +Returns the id of the priority name passed. + +=cut + +sub lookup_priority_by_value { + my ($value) = @_; + my $dbh = Bugzilla->dbh; + my ($id) = $dbh->selectrow_array( + "SELECT id + FROM priority + WHERE value = ?", + undef, $value); + return $id; +} + + +=head2 lookup_default_tester + +Takes an ID of the default_tester field and returns the value + +=cut + +sub lookup_default_tester { + my $self = shift; + my ($id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT login_name + FROM profiles + WHERE userid = ?", + undef, $id); + return $value; +} + +# From process bug +sub _snap_shot_deps { + my ($i, $target, $me) = (@_); + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectcol_arrayref( + "SELECT $target + FROM test_case_dependencies + WHERE $me = ? ORDER BY $target", undef, $i); + + return join(',', @{$ref}); +} + +# Taken from Bugzilla::Bug +sub _get_dep_lists { + my ($myfield, $targetfield, $case_id) = (@_); + my $dbh = Bugzilla->dbh; + my $list_ref = + $dbh->selectcol_arrayref( + "SELECT test_case_dependencies.$targetfield + FROM test_case_dependencies + JOIN test_cases ON test_cases.case_id = test_case_dependencies.$targetfield + WHERE test_case_dependencies.$myfield = ? + ORDER BY test_case_dependencies.$targetfield", + undef, ($case_id)); + return $list_ref; +} + +sub update_deps { + my $self = shift; + my ($dependson, $blocks, $case_id) = @_; + $case_id = $self->{'case_id'} unless $case_id; + my $dbh = Bugzilla->dbh; + my $fields = {}; + $fields->{'dependson'} = $dependson; + $fields->{'blocked'} = $blocks; +# From process bug + foreach my $field ("dependson", "blocked") { + if ($fields->{$field}) { + my @validvalues; + foreach my $id (split(/[\s,]+/, $fields->{$field})) { + next unless $id; + Bugzilla::Testopia::Util::validate_test_id($id, 'case'); + push(@validvalues, $id); + } + $fields->{$field} = join(",", @validvalues); + } + } +#From Bug.pm sub ValidateDependencies($$$) +# my $fields = {}; +# $fields->{'dependson'} = shift; +# $fields->{'blocked'} = shift; + my $id = $case_id || 0; + + unless (defined($fields->{'dependson'}) + || defined($fields->{'blocked'})) + { + return; + } + + my %deps; + my %deptree; + foreach my $pair (["blocked", "dependson"], ["dependson", "blocked"]) { + my ($me, $target) = @{$pair}; + $deptree{$target} = []; + $deps{$target} = []; + next unless $fields->{$target}; + + my %seen; + foreach my $i (split('[\s,]+', $fields->{$target})) { + if ($id == $i) { + ThrowUserError("dependency_loop_single"); + } + if (!exists $seen{$i}) { + push(@{$deptree{$target}}, $i); + $seen{$i} = 1; + } + } + # populate $deps{$target} as first-level deps only. + # and find remainder of dependency tree in $deptree{$target} + @{$deps{$target}} = @{$deptree{$target}}; + my @stack = @{$deps{$target}}; + while (@stack) { + my $i = shift @stack; + my $dep_list = + $dbh->selectcol_arrayref("SELECT $target + FROM test_case_dependencies + WHERE $me = ?", undef, $i); + foreach my $t (@$dep_list) { + # ignore any _current_ dependencies involving this test_case, + # as they will be overwritten with data from the form. + if ($t != $id && !exists $seen{$t}) { + push(@{$deptree{$target}}, $t); + push @stack, $t; + $seen{$t} = 1; + } + } + } + } + + my @deps = @{$deptree{'dependson'}}; + my @blocks = @{$deptree{'blocked'}}; + my @union = (); + my @isect = (); + my %union = (); + my %isect = (); + foreach my $b (@deps, @blocks) { $union{$b}++ && $isect{$b}++ } + @union = keys %union; + @isect = keys %isect; + if (scalar(@isect) > 0) { + my $both = ""; + foreach my $i (@isect) { + $both .= "$i " ; + } + ThrowUserError("dependency_loop_multi", { both => $both }); + } + +#from process_bug + foreach my $pair ("blocked/dependson", "dependson/blocked") { + my ($me, $target) = split("/", $pair); + + my @oldlist = @{$dbh->selectcol_arrayref("SELECT $target FROM test_case_dependencies + WHERE $me = ? ORDER BY $target", + undef, $id)}; +# @dependencychanged{@oldlist} = 1; + + if (defined $fields->{$target}) { + my %snapshot; + my @newlist = sort {$a <=> $b} @{$deps{$target}}; +# @dependencychanged{@newlist} = 1; + + while (0 < @oldlist || 0 < @newlist) { + if (@oldlist == 0 || (@newlist > 0 && + $oldlist[0] > $newlist[0])) { + $snapshot{$newlist[0]} = _snap_shot_deps($newlist[0], $me, + $target); + shift @newlist; + } elsif (@newlist == 0 || (@oldlist > 0 && + $newlist[0] > $oldlist[0])) { + $snapshot{$oldlist[0]} = _snap_shot_deps($oldlist[0], $me, + $target); + shift @oldlist; + } else { + if ($oldlist[0] != $newlist[0]) { + die "Error in list comparing code"; + } + shift @oldlist; + shift @newlist; + } + } + my @keys = keys(%snapshot); + if (@keys) { + my $oldsnap = _snap_shot_deps($id, $target, $me); + $dbh->do("DELETE FROM test_case_dependencies WHERE $me = ?", undef, $id); + foreach my $i (@{$deps{$target}}) { + $dbh->do("INSERT INTO test_case_dependencies ($me, $target) VALUES (?,?)", undef, $id, $i); + } +# foreach my $k (@keys) { +# LogDependencyActivity($k, $snapshot{$k}, $me, $target, $timestamp); +# } +# LogDependencyActivity($id, $oldsnap, $target, $me, $timestamp); +# $check_dep_bugs = 1; + } + } + } +} + +=head2 get_dep_tree + +Returns a list of test case dependencies + +=cut + +sub get_dep_tree { + my $self = shift; + $self->{'dep_list'} = (); + $self->_generate_dep_tree($self->{'case_id'}); + return $self->{'dep_list'}; +} + +=head2 _generate_dep_tree + +Private method that recursivly gets a list of the test cases this blocks + +=cut + +sub _generate_dep_tree { + my $self = shift; + my ($case_id) = @_; + my $deps = _get_dep_lists("dependson", "blocked", $case_id); + return unless scalar @$deps; + foreach my $id (@$deps){ + $self->_generate_dep_tree($id); + push @{$self->{'dep_list'}}, $id + } +} + +=head2 obliterate + +Removes this case and all things that reference it. + +=cut + +sub obliterate { + my $self = shift; + my $dbh = Bugzilla->dbh; + + foreach my $obj (@{$self->attachments}){ + $obj->obliterate; + } + foreach my $obj (@{$self->caseruns}){ + $obj->obliterate; + } + + $dbh->do("DELETE FROM test_case_texts WHERE case_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_case_plans WHERE case_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_case_components WHERE case_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_case_tags WHERE case_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_case_bugs WHERE case_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_case_activity WHERE case_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_case_dependencies + WHERE dependson = ? OR blocked = ?", undef, ($self->id, $self->id)); + $dbh->do("DELETE FROM test_cases WHERE case_id = ?", undef, $self->id); + return 1; +} + +=head2 canview + +Returns true if the logged in user has rights to view this test case. + +=cut + +sub canview { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + return 1 if $self->get_user_rights(Bugzilla->user->id) & TR_READ; + return 0; +} + +=head2 canedit + +Returns true if the logged in user has rights to edit this test case. + +=cut + +sub canedit { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + return 1 if $self->get_user_rights(Bugzilla->user->id) & TR_WRITE; + return 0; +} + +=head2 candelete + +Returns true if the logged in user has rights to delete this test case. + +=cut + +sub candelete { + my $self = shift; + return 1 if Bugzilla->user->in_group('admin'); + return 0 unless Param("allow-test-deletion"); + return 1 if Bugzilla->user->in_group('Testers') && Param("testopia-allow-group-member-deletes"); + # Otherwise, check for delete rights on all the plans this is linked to + my $own_all = 1; + foreach my $plan (@{$self->plans}){ + if (!($plan->get_user_rights(Bugzilla->user->id) & TR_DELETE)) { + $own_all = 0; + last; + } + } + return 1 if $own_all; + return 0; +} + +=head2 can_unlink_plan + +Returns true if this test case can be unlinked from the given plan + +=cut + +sub can_unlink_plan { + my $self = shift; + my ($plan_id) = @_; + + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + return 1 if Bugzilla->user->in_group('admin'); + return 1 if Bugzilla->user->in_group('Testers') && Param("testopia-allow-group-member-deletes"); + return 1 if $plan->get_user_rights(Bugzilla->user->id) & TR_DELETE; + return 0; +} + +sub get_user_rights { + my $self = shift; + my ($userid) = @_; + my $dbh = Bugzilla->dbh; + + my $plan_ids = $dbh->selectcol_arrayref( + "SELECT plan_id FROM test_case_plans WHERE case_id = ?", + undef, $self->id); + + return 0 unless $plan_ids; + $plan_ids = join(',',@$plan_ids); + + my ($perms) = $dbh->selectrow_array( + "SELECT MAX(permissions) FROM test_plan_permissions + LEFT JOIN test_case_plans ON test_plan_permissions.plan_id = test_case_plans.plan_id + INNER JOIN test_cases ON test_case_plans.case_id = test_cases.case_id + WHERE userid = ? AND test_plan_permissions.plan_id IN ($plan_ids)", + undef, $userid); + + return $perms; +} +############################### +#### Accessors #### +############################### + +=head1 ACCESSOR METHODS + +=head2 id + +Returns the ID of this object + +=head2 author + +Returns a Bugzilla::User object representing the Author of this case + +=head2 default_tester + +Returns a Bugzilla::User object representing the run's default tester + +=head2 creation_date + +Returns the creation time stamp of this object + +=head2 isautomated + +Returns true if this is an automatic test case + +=head2 script + +Returns the script of this object + +=head2 status_id + +Returns the status_id of this object + +=head2 arguments + +Returns the arguments for the script of this object + +=head2 summary + +Returns the summary of this object + +=head2 requirements + +Returns the requirements of this object + +=head2 alias + +Returns the alias of this object + +=cut + +sub id { return $_[0]->{'case_id'}; } +sub author { return Bugzilla::User->new($_[0]->{'author_id'}); } +sub default_tester { return Bugzilla::User->new($_[0]->{'default_tester_id'}); } +sub creation_date { return $_[0]->{'creation_date'}; } +sub estimated_time { return $_[0]->{'estimated_time'}; } +sub isautomated { return $_[0]->{'isautomated'}; } +sub script { return $_[0]->{'script'}; } +sub status_id { return $_[0]->{'case_status_id'};} +sub arguments { return $_[0]->{'arguments'}; } +sub summary { return $_[0]->{'summary'}; } +sub requirement { return $_[0]->{'requirement'}; } +sub alias { return $_[0]->{'alias'}; } + +=head2 type + +Returns 'case' + +=cut + +sub type { + my $self = shift; + $self->{'type'} = 'case'; + return $self->{'type'}; +} + +=head2 attachments + +Returns a reference to a list of attachments associated with this +case. + +=cut + +sub attachments { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'attachments'} if exists $self->{'attachments'}; + + my $attachments = $dbh->selectcol_arrayref( + "SELECT attachment_id + FROM test_case_attachments + WHERE case_id = ?", + undef, $self->{'case_id'}); + + my @attachments; + foreach my $a (@{$attachments}){ + push @attachments, Bugzilla::Testopia::Attachment->new($a); + } + $self->{'attachments'} = \@attachments; + return $self->{'attachments'}; + +} + +=head2 version + +Returns the case text version. This number is incremented any time +changes are made to the case docs (action and effect). + +=cut + +sub version { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'version'} if exists $self->{'version'}; + my ($ver) = $dbh->selectrow_array("SELECT MAX(case_text_version) + FROM test_case_texts + WHERE case_id = ?", + undef, $self->{'case_id'}); + $self->{'version'} = $ver; + return $self->{'version'}; +} + +=head2 status + +Looks up the case status based on the case_status_id of this case. + +=cut + +sub status { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'status'} if exists $self->{'status'}; + my ($res) = $dbh->selectrow_array("SELECT name + FROM test_case_status + WHERE case_status_id = ?", + undef, $self->{'case_status_id'}); + $self->{'status'} = $res; + return $self->{'status'}; +} + +=head2 priority + +Looks up the Bugzilla priority value based on the priority_id +of this case. + +=cut + +sub priority { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'priority'} if exists $self->{'priority'}; + my ($res) = $dbh->selectrow_array("SELECT value + FROM priority + WHERE id = ?", + undef, $self->{'priority_id'}); + $self->{'priority'} = $res; + return $self->{'priority'}; +} + +=head2 category + +Returns the category name based on the category_id of this case + +=cut + +sub category { + my $self = shift; + return $self->{'category'} if exists $self->{'category'}; + $self->{'category'} = Bugzilla::Testopia::Category->new($self->{'category_id'}); + return $self->{'category'}; +} + +=head2 components + +Returns a reference to a list of bugzilla components assoicated with +this test case. + +=cut + +sub components { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'components'} if exists $self->{'components'}; + my $comps = $dbh->selectcol_arrayref( + "SELECT comp.id + FROM components AS comp + JOIN test_case_components AS tcc ON tcc.component_id = comp.id + JOIN test_cases ON tcc.case_id = test_cases.case_id + WHERE test_cases.case_id = ?", + {'Slice' => {}}, $self->{'case_id'}); + + my @comps; + foreach my $id (@$comps){ + my $comp = Bugzilla::Component->new($id); + my $prod = Bugzilla::Product->new($comp->product_id); + $comp->{'product_name'} = $prod->name; + push @comps, $comp; + } + $self->{'components'} = \@comps; + return $self->{'components'}; +} + +=head2 tags + +Returns a reference to a list of Bugzilla::Testopia::TestTag objects +associated with this case. + +=cut + +sub tags { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'tags'} if exists $self->{'tags'}; + my $tagids = $dbh->selectcol_arrayref("SELECT test_case_tags.tag_id + FROM test_case_tags + INNER JOIN test_tags ON test_case_tags.tag_id = test_tags.tag_id + WHERE case_id = ? + ORDER BY test_tags.tag_name", + undef, $self->{'case_id'}); + my @tags; + foreach my $id (@{$tagids}){ + push @tags, Bugzilla::Testopia::TestTag->new($id); + } + $self->{'tags'} = \@tags; + return $self->{'tags'}; +} + +=head2 plans + +Returns a reference to a list of Bugzilla::Testopia::TestPlan objects +associated with this case. + +=cut + +sub plans { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'plans'} if exists $self->{'plans'}; + my $ref = $dbh->selectcol_arrayref("SELECT plan_id + FROM test_case_plans + WHERE case_id = ?", + undef, $self->{'case_id'}); + my @plans; + foreach my $id (@{$ref}){ + push @plans, Bugzilla::Testopia::TestPlan->new($id); + } + $self->{'plans'} = \@plans; + return $self->{'plans'}; +} + +=head2 bugs + +Returns a reference to a list of Bugzilla::Bug objects +associated with this case. + +=cut + +sub bugs { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'bugs'} if exists $self->{'bugs'}; + my $ref = $dbh->selectcol_arrayref( + "SELECT DISTINCT bug_id + FROM test_case_bugs + WHERE case_id = ?", + undef, $self->{'case_id'}); + my @bugs; + foreach my $id (@{$ref}){ + push @bugs, Bugzilla::Bug->new($id, Bugzilla->user->id) if Bugzilla->user->can_see_bug($id); + } + $self->{'bugs'} = \@bugs; + return $self->{'bugs'}; +} + +=head2 bug_list + +Returns a comma separated list of bug ids associated with this case + +=cut + +sub bug_list { + my $self = shift; + return $self->{'bug_list'} if exists $self->{'bug_list'}; + my $dbh = Bugzilla->dbh; + my @bugs; + my $bugids = $dbh->selectcol_arrayref("SELECT bug_id + FROM test_case_bugs + WHERE case_id=?", + undef, $self->id); + my @visible; + foreach my $bugid (@{$bugids}){ + push @visible, $bugid if Bugzilla->user->can_see_bug($bugid); + } + $self->{'bug_list'} = join(",", @$bugids); + + return $self->{'bug_list'}; +} + +=head2 text + +Returns a hash reference representing the action and effect of this +case. + +=cut + + +sub text { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'text'} if exists $self->{'text'}; + my $text = $dbh->selectrow_hashref( + "SELECT action, effect, setup, breakdown, who AS author_id, case_text_version AS version + FROM test_case_texts + WHERE case_id=? AND case_text_version=?", + undef, $self->{'case_id'}, + $self->version); + $self->{'text'} = $text; + return $self->{'text'}; +} + +=head2 runs + +Returns a reference to a list of Bugzilla::Testopia::TestRun objects +associated with this case. + +=cut + +sub runs { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'runs'} if exists $self->{'runs'}; + my $ref = $dbh->selectcol_arrayref( + "SELECT DISTINCT t.run_id + FROM test_runs t + INNER JOIN test_case_runs r ON r.run_id = t.run_id + WHERE case_id = ?", + undef, $self->{'case_id'}); + my @runs; + foreach my $id (@{$ref}){ + push @runs, Bugzilla::Testopia::TestRun->new($id); + } + $self->{'runs'} = \@runs; + return $self->{'runs'}; +} + +sub run_count { + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($runcount) = $dbh->selectrow_array( + "SELECT DISTINCT count(run_id) + FROM test_case_runs + WHERE case_id = ?", + undef, $self->id); + return $runcount; +} + +=head2 caseruns + +Returns a reference to a list of Bugzilla::Testopia::TestCaseRun objects +associated with this case. + +=cut + +sub caseruns { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'caseruns'} if exists $self->{'caseruns'}; + my $ref = $dbh->selectcol_arrayref("SELECT case_run_id + FROM test_case_runs + WHERE case_id = ?", + undef, $self->{'case_id'}); + my @runs; + foreach my $id (@{$ref}){ + push @runs, Bugzilla::Testopia::TestCaseRun->new($id); + } + $self->{'caseruns'} = \@runs; + return $self->{'caseruns'}; +} + +sub sortkey { + my $self = shift; + return $self->{'sortkey'} if exists $self->{'sortkey'}; + my $dbh = Bugzilla->dbh; + my ($sortkey) = $dbh->selectrow_array("SELECT MAX(sortkey) FROM test_cases"); + $self->{'sortkey'} = ++$sortkey; + return $self->{'sortkey'}; +} + +=head2 blocked + +Returns a reference to a list of Bugzilla::Testopia::TestCase objects +which are blocked by this test case. + +=cut + +sub blocked { + my ($self) = @_; + return $self->{'blocked'} if exists $self->{'blocked'}; + my @deps; + my $ref = _get_dep_lists("dependson", "blocked", $self->{'case_id'}); + foreach my $id (@{$ref}){ + push @deps, Bugzilla::Testopia::TestCase->new($id); + } + $self->{'blocked'} = \@deps; + return $self->{'blocked'}; +} + +sub blocked_list { + my ($self) = @_; + return $self->{'blocked_list'} if exists $self->{'blocked_list'}; + my @deps; + my $ref = _get_dep_lists("dependson", "blocked", $self->{'case_id'}); + $self->{'blocked_list'} = join(",", @$ref); + return $self->{'blocked_list'}; +} + +=head2 blocked_list_uncached + +Returns a space separated list of test cases that are blocked by this test case. +This method does not cache the blocked test cases so each call will result +in a database read. + +=cut + +sub blocked_list_uncached { + my ($self) = @_; + my $ref = _get_dep_lists("dependson", "blocked", $self->{'case_id'}); + return join(" ", @$ref) +} + +=head2 dependson + +Returns a reference to a list of Bugzilla::Testopia::TestCase objects +which depend on this test case. + +=cut + +sub dependson { + my ($self) = @_; + return $self->{'dependson'} if exists $self->{'dependson'}; + my @deps; + my $ref = _get_dep_lists("blocked", "dependson", $self->{'case_id'}); + foreach my $id (@{$ref}){ + push @deps, Bugzilla::Testopia::TestCase->new($id); + } + $self->{'dependson'} = \@deps; + return $self->{'dependson'}; +} + +sub dependson_list { + my ($self) = @_; + return $self->{'dependson_list'} if exists $self->{'dependson_list'}; + my @deps; + my $ref = _get_dep_lists("blocked", "dependson", $self->{'case_id'}); + $self->{'dependson_list'} = join(",", @$ref); + return $self->{'dependson_list'}; +} + +=head2 dependson_list_uncached + +Returns a space separated list of test cases that depend on this test case. +This method does not cache the dependent test cases so each call will result +in a database read. + +=cut + +sub dependson_list_uncached { + my ($self) = @_; + my $ref = _get_dep_lists("blocked", "dependson", $self->{'case_id'}); + return join(" ", @$ref) +} + +sub calculate_average_time { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $totalseconds; + my $min = 0; + my $hours = 0; + my $sec = 0; + my $i = 0; + foreach my $cr (@{$self->caseruns}){ + if ($cr->completion_time){ + $totalseconds += $cr->completion_time; + $i++; + } + } + + my $average = $i ? int($totalseconds / $i) : 0; + $min = int($average/60); + $sec = $average % 60; + if ($min > 60){ + $hours = int($min/60); + $min = $min % 60; + } + + return "$hours:$min:$sec"; +} + + +=head1 TODO + +=head1 SEE ALSO + +TestPlan, TestRun, TestCaseRun + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/TestCaseRun.pm b/Bugzilla/Testopia/TestCaseRun.pm new file mode 100644 index 0000000..19b29bc --- /dev/null +++ b/Bugzilla/Testopia/TestCaseRun.pm @@ -0,0 +1,1085 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks +=head1 NAME + +Bugzilla::Testopia::TestCaseRun - Testopia Test Case Run object + +=head1 DESCRIPTION + +This module represents a test case run in Testopia. +A test case run is a record in the test_case_runs table which joins +test cases to test runs. Basically, for each test run a selction of +test cases is made to be included in that run. As a test run +progresses, testers set statuses on each of the cases in the run. +If the build is changed on a case-run with a status, a clone of that +case-run is made in the table for historical purposes. + +=head1 SYNOPSIS + +use Bugzilla::Testopia::TestCaseRun; + + $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + $caserun = Bugzilla::Testopia::TestCaseRun->new(\%caserun_hash); + +=cut + +package Bugzilla::Testopia::TestCaseRun; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::User; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Constants; +use Bugzilla::Testopia::Attachment; +use Bugzilla::Bug; + +use Date::Format; +use Date::Parse; + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + case_run_id + run_id + case_id + assignee + testedby + case_run_status_id + case_text_version + build_id + environment_id + notes + running_date + close_date + iscurrent + sortkey + +=cut + +use constant DB_COLUMNS => qw( + case_run_id + run_id + case_id + assignee + testedby + case_run_status_id + case_text_version + build_id + environment_id + notes + running_date + close_date + iscurrent + sortkey +); + +our $columns = join(", ", DB_COLUMNS); + +sub report_columns { + my $self = shift; + my %columns; + # Changes here need to match Report.pm + $columns{'Build'} = "build"; + $columns{'Status'} = "status"; + $columns{'Environment'} = "environment"; + $columns{'Assignee'} = "assignee"; + $columns{'Tested By'} = "testedby"; + $columns{'Milestone'} = "milestone"; + $columns{'Case Tags'} = "case_tags"; + $columns{'Run Tags'} = "run_tags"; + $columns{'Requirement'} = "requirement"; + $columns{'Priority'} = "priority"; + $columns{'Default tester'} = "default_tester"; + $columns{'Category'} = "category"; + $columns{'Component'} = "component"; + my @result; + push @result, {'name' => $_, 'id' => $columns{$_}} foreach (sort(keys %columns)); + unshift @result, {'name' => '', 'id'=> ''}; + return \@result; + +} + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=head2 new + +Instantiate a new case run. This takes a single argument +either a test case ID or a reference to a hash containing keys +identical to a test case-run's fields and desired values. + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for this object + +=cut + +sub _init { + my $self = shift; + my ($param, $run_id, $build_id, $env_id) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id) && !$run_id) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns FROM test_case_runs + WHERE case_run_id = ?}, undef, $id); + + } elsif ($run_id && detaint_natural($run_id) + && $build_id && detaint_natural($build_id) + && $env_id && detaint_natural($env_id)){ + + my $case_id = $param; + detaint_natural($case_id) || return undef; + $obj = $dbh->selectrow_hashref( + "SELECT $columns FROM test_case_runs + WHERE case_id = ? + AND run_id = ? + AND build_id = ? + AND environment_id = ?", + undef, ($case_id, $run_id, $build_id, $env_id)); + + } elsif (ref $param eq 'HASH'){ + $obj = $param; + + } else { + Bugzilla::Error::ThrowCodeError('bad_arg', + {argument => 'param', + function => 'Testopia::TestCaseRun::_init'}); + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + + return $self; +} + +=head2 store + +Stores a test case run object in the database. This method is used +to store a newly created test case run. It returns the new id. + +=cut + +sub store { + my $self = shift; + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_case_runs ($columns) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", undef, + (undef, # case_run_id + $self->{'run_id'}, # run_id + $self->{'case_id'}, # case_id + $self->{'assignee'}, # assignee + undef, # testedby + IDLE, # case_run_status_id + $self->{'case_text_version'}, # case_text_version + $self->{'build_id'}, # build_id + $self->{'environment_id'}, # environment_id + undef, # notes + undef, # running_date + undef, # close_date + 1, # iscurrent + 0, # sortkey + )); + + my $key = $dbh->bz_last_key( 'test_case_runs', 'case_run_id' ); + return $key; +} + +=head2 clone + +Creates a copy of this caserun and sets it as the current record + +=cut + +sub clone { + my $self = shift; + my ($build_id, $env_id ,$run_id, $case_id) = @_; + $run_id ||= $self->{'run_id'}; + $case_id ||= $self->{'case_id'}; + + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_case_runs ($columns) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)", undef, + (undef, # case_run_id + $run_id, # run_id + $case_id, # case_id + $self->{'assignee'}, # assignee + undef, # testedby + IDLE, # case_run_status_id + $self->{'case_text_version'}, # case_text_version + $build_id, # build_id + $env_id, # environment_id + undef, # notes + undef, # running_date + undef, # close_date + 1, # iscurrent + 0, # sortkey + )); + + my $key = $dbh->bz_last_key( 'test_case_runs', 'case_run_id' ); + + $self->set_as_current($key); + return $key; +} + +=head2 check_exists + +Checks for an existing entry with the same build and environment for this +case and run and switches self to that object. + +=cut + +sub switch { + my $self = shift; + my ($build_id, $env_id ,$run_id, $case_id) = @_; + + $run_id ||= $self->{'run_id'}; + $case_id ||= $self->{'case_id'}; + $build_id ||= $self->{'build_id'}; + $env_id ||= $self->{'environment_id'}; + + my $dbh = Bugzilla->dbh; + my ($is) = $dbh->selectrow_array( + "SELECT case_run_id + FROM test_case_runs + WHERE run_id = ? + AND case_id = ? + AND build_id = ? + AND environment_id = ?", + undef, ($run_id, $case_id, $build_id, $env_id)); + + if ($is){ + $self = Bugzilla::Testopia::TestCaseRun->new($is); + } + else { + my $oldbuild = $self->{'build_id'}; + my $oldenv = $self->{'environment_id'}; + + $self = Bugzilla::Testopia::TestCaseRun->new($self->clone($build_id,$env_id)); + + if ($oldbuild != $build_id){ + my $build = Bugzilla::Testopia::Build->new($oldbuild); + my $note = "Build Changed by ". Bugzilla->user->login; + $note .= ". Old build: '". $build->name; + $note .= "' New build: '". $self->build->name; + $note .= "'. Resetting to IDLE."; + $self->append_note($note); + } + if ($oldenv != $env_id){ + my $environment = Bugzilla::Testopia::Environment->new($oldenv); + my $note = "Environment Changed by ". Bugzilla->user->login; + $note .= ". Old environment: '". $environment->name; + $note .= "' New environment: '". $self->environment->name; + $note .= "'. Resetting to IDLE."; + $self->append_note($note); + } + } + $self->set_as_current; + return $self; +} + +=head2 _update_fields + +Update this case-run in the database if a change is made to an +updatable field. + +=cut + +sub _update_fields{ + my $self = shift; + my ($newvalues) = @_; + my $dbh = Bugzilla->dbh; + + if ($newvalues->{'case_run_status_id'} && $newvalues->{'case_run_status_id'} == FAILED){ + $self->_update_deps(BLOCKED); + } + elsif ($newvalues->{'case_run_status_id'} && $newvalues->{'case_run_status_id'} == PASSED){ + $self->_update_deps(IDLE); + } + + $dbh->bz_lock_tables('test_case_runs WRITE'); + foreach my $field (keys %{$newvalues}){ + $dbh->do("UPDATE test_case_runs + SET $field = ? WHERE case_run_id = ?", + undef, $newvalues->{$field}, $self->{'case_run_id'}); + } + $dbh->bz_unlock_tables(); + + return $self->{'case_run_id'}; +} + +=head2 set_as_current + +Sets this case-run as the current or active one in the history +list of case-runs of this build and case_id + +=cut + +sub set_as_current { + my $self = shift; + my ($caserun) = @_; + $caserun = $self->{'case_run_id'} unless defined $caserun; + my $dbh = Bugzilla->dbh; + my $list = $self->get_case_run_list; + + $dbh->bz_lock_tables('test_case_runs WRITE'); + foreach my $c (@{$list}){ + $dbh->do("UPDATE test_case_runs + SET iscurrent = 0 + WHERE case_run_id = ?", + undef, $c); + } + $dbh->do("UPDATE test_case_runs + SET iscurrent = 1 + WHERE case_run_id = ?", + undef, $caserun); + $dbh->bz_unlock_tables(); +} + +=head2 set_status + +Sets the status on a case-run and updates the close_date and testedby +if the status is a closed status. + +=cut + +sub set_status { + my $self = shift; + my ($status_id, $update_bugs) = @_; + return if $self->status_id == $status_id; + my $oldstatus = $self->status; + my $newstatus = $self->lookup_status($status_id); + + $self->_update_fields({'case_run_status_id' => $status_id}); + if ($status_id == IDLE){ + $self->_update_fields({'close_date' => undef}); + $self->_update_fields({'testedby' => undef}); + $self->{'close_date'} = undef; + $self->{'testedby'} = undef; + } + elsif ($status_id == RUNNING || $status_id == PAUSED){ + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + $self->_update_fields({'running_date' => $timestamp}) if $status_id == RUNNING; + $self->_update_fields({'close_date' => undef}); + $self->{'close_date'} = undef; + } + else { + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + $self->_update_fields({'close_date' => $timestamp}); + $self->_update_fields({'testedby' => Bugzilla->user->id}); + $self->{'close_date'} = $timestamp; + $self->{'testedby'} = Bugzilla->user->id; + $self->update_bugs('REOPENED') if ($status_id == FAILED && $update_bugs); + $self->update_bugs('VERIFIED') if ($status_id == PASSED && $update_bugs); + } + + my $note = "Status changed from $oldstatus to $newstatus by ". Bugzilla->user->login; + $note .= " for build '". $self->build->name ."' and environment '". $self->environment->name; + $self->append_note($note); + $self->{'case_run_status_id'} = $status_id; + $self->{'status'} = undef; +} + +sub set_sortkey { + my $self = shift; + my ($sortkey) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->do("UPDATE test_case_runs SET sortkey = ? + WHERE case_id = ? AND run_id = ?", + undef, ($sortkey, $self->case_id, $self->run_id)); + +} + +=head2 set_assignee + +Sets the assigned tester for the case-run + +=cut + +sub set_assignee { + my $self = shift; + my ($user_id) = @_; + + my $oldassignee = $self->assignee->login; + my $newassignee = Bugzilla::User->new($user_id); + + $self->_update_fields({'assignee' => $user_id}); + $self->{'assignee'} = $newassignee; + + my $note = "Assignee changed from $oldassignee to ". $newassignee->login; + $note .= " by ". Bugzilla->user->login; + $note .= " for build '". $self->build->name; + $note .= "' and environment '". $self->environment->name; + $self->append_note($note); +} + +=head2 lookup_status + +Returns the status name of the given case_run_status_id + +=cut + +sub lookup_status { + my $self = shift; + my ($status_id) = @_; + my $dbh = Bugzilla->dbh; + my ($status) = $dbh->selectrow_array( + "SELECT name + FROM test_case_run_status + WHERE case_run_status_id = ?", + undef, $status_id); + return $status; +} + +=head2 lookup_status_by_name + +Returns the id of the status name passed. + +=cut + +sub lookup_status_by_name { + my ($name) = @_; + my $dbh = Bugzilla->dbh; + + my ($value) = $dbh->selectrow_array( + "SELECT case_run_status_id + FROM test_case_run_status + WHERE name = ?", + undef, $name); + return $value; +} + +=head2 append_note + +Updates the notes field for the case-run + +=cut + +sub append_note { + my $self = shift; + my ($note) = @_; + return unless $note; + my $timestamp = time2str("%c", time()); + $note = "$timestamp: $note"; + if ($self->{'notes'}){ + $note = $self->{'notes'} . "\n" . $note; + } + $self->_update_fields({'notes' => $note}); + $self->{'notes'} = $note; +} + +=head2 _update_deps + +Private method for updating blocked test cases. If the pre-requisite +case fails, the blocked test cases in a run get a status of BLOCKED +if it passes they are set back to IDLE. This only happens to the +current case run and only if it doesn't already have a closed status. +=cut + +sub _update_deps { + my $self = shift; + my ($status) = @_; + my $deplist = $self->case->get_dep_tree; + return unless $deplist; + + my $dbh = Bugzilla->dbh; + $dbh->bz_lock_tables("test_case_runs WRITE"); + my $caseruns = $dbh->selectcol_arrayref( + "SELECT case_run_id + FROM test_case_runs + WHERE iscurrent = 1 + AND run_id = ? + AND case_run_status_id IN(". join(',', (IDLE,RUNNING,PAUSED,BLOCKED)) .") + AND case_id IN (". join(',', @$deplist) .")", + undef, $self->{'run_id'}); + my $sth = $dbh->prepare_cached( + "UPDATE test_case_runs + SET case_run_status_id = ? + WHERE case_run_id = ?"); + + foreach my $id (@$caseruns){ + $sth->execute($status, $id); + } + $dbh->bz_unlock_tables; + + $self->{'updated_deps'} = $caseruns; +} + +=head2 get_case_run_list + +Returns a reference to a list of case-runs for the given case and run + +=cut + +sub get_case_run_list { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectcol_arrayref( + "SELECT case_run_id FROM test_case_runs + WHERE case_id = ? AND run_id = ?", undef, + ($self->{'case_id'}, $self->{'run_id'})); + + return $ref; +} + +=head2 get_status_list + +Returns a list reference of the legal statuses for a test case-run + +=cut + +sub get_status_list { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref( + "SELECT case_run_status_id AS id, name + FROM test_case_run_status + ORDER BY sortkey", {'Slice' =>{}}); + + return $ref +} + +=head2 attach_bug + +Attaches the specified bug to this test case-run + +=cut + +sub attach_bug { + my $self = shift; + my ($bug, $caserun_id) = @_; + $caserun_id ||= $self->{'case_run_id'}; + my $dbh = Bugzilla->dbh; + + $dbh->bz_lock_tables('test_case_bugs WRITE'); + my ($exists) = $dbh->selectrow_array( + "SELECT bug_id + FROM test_case_bugs + WHERE case_run_id=? + AND bug_id=?", + undef, ($caserun_id, $bug)); + if ($exists) { + $dbh->bz_unlock_tables(); + return; + } + my ($check) = $dbh->selectrow_array( + "SELECT bug_id + FROM test_case_bugs + WHERE case_id=? + AND bug_id=? + AND case_run_id=?", + undef, ($caserun_id, $bug, undef)); + + if ($check){ + $dbh->do("UPDATE test_case_bugs + SET test_case_run_id = ? + WHERE case_id = ? + AND bug_id = ?", + undef, ($bug, $self->{'case_run_id'})); + } + else{ + $dbh->do("INSERT INTO test_case_bugs (bug_id, case_run_id, case_id) + VALUES(?,?,?)", undef, ($bug, $self->{'case_run_id'}, $self->{'case_id'})); + } + $dbh->bz_unlock_tables(); +} + +=head2 detach_bug + +Removes the association of the specified bug from this test case-run + +=cut + +sub detach_bug { + my $self = shift; + my ($bug) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->do("DELETE FROM test_case_bugs + WHERE bug_id = ? + AND case_run_id = ?", + undef, ($bug, $self->{'case_run_id'})); + +} + +=head2 update_bugs + +Updates bug status depending on whether the case passed or failed. If +the case failed it will reopen any attached bugs that are closed. If it +passed it will mark RESOLVED bugs VERIFIED. + +=cut + +sub update_bugs { + my $self = shift; + my ($status) = @_; + my $resolution; + my $dbh = Bugzilla->dbh; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + foreach my $bug (@{$self->bugs}){ + my $oldstatus = $bug->bug_status; + my $oldresolution = $bug->resolution; + + next if ($status eq 'VERIFIED' && $oldstatus ne 'RESOLVED'); + next if ($status eq 'REOPENED' && $oldstatus !~ /(RESOLVED|VERIFIED|CLOSED)/); + next if $oldresolution eq 'DUPLICATE'; + if ($status eq 'REOPENED'){ + $resolution = ''; + } + else{ + $resolution = $oldresolution; + } + my $comment = "Status updated by Testopia: ". Param('urlbase'); + $comment .= "tr_show_caserun.cgi?caserun_id=" . $self->id; + + $dbh->bz_lock_tables("bugs WRITE, fielddefs READ, longdescs WRITE, bugs_activity WRITE"); + $dbh->do("UPDATE bugs + SET bug_status = ?, + resolution = ?, + delta_ts = ? + WHERE bug_id = ?", + undef,($status, $resolution, $timestamp, $bug->bug_id)); + LogActivityEntry($bug->bug_id, 'bug_status', $oldstatus, + $status, Bugzilla->user->id, $timestamp); + LogActivityEntry($bug->bug_id, 'resolution', $bug->resolution, '', + Bugzilla->user->id, $timestamp) if ($status eq 'REOPENED'); + AppendComment($bug->bug_id, Bugzilla->user->id, $comment, + !Bugzilla->user->in_group(Param('insidergroup')), $timestamp); + + $dbh->bz_unlock_tables(); + } +} + +=head2 obliterate + +Removes this caserun, its history, and all things that reference it. + +=cut + +sub obliterate { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $sth = $dbh->prepare_cached("DELETE FROM test_case_bugs WHERE case_run_id = ?"); + foreach my $id (@{$self->get_case_run_list}){ + $sth->execute($id); + } + + $dbh->do("DELETE FROM test_case_runs WHERE case_id = ? AND run_id = ?", + undef, ($self->case_id, $self->run_id)); + return 1; +} + +############################### +#### Accessors #### +############################### + +=head1 ACCESSOR METHODS + +=head2 id + +Returns the ID of the object + +=head2 testedby + +Returns a Bugzilla::User object representing the user that closed +this case-run. + +=head2 assignee + +Returns a Bugzilla::User object representing the user assigned to +update this case-run. + +=head2 case_text_version + +Returns the version of the test case document that this case-run +was run against. + +=head2 notes + +Returns the notes of the object + +=head2 close_date + +Returns the time stamp of when this case-run was closed + +=head2 iscurrent + +Returns true if this is the current case-run in the history list + +=head2 status_id + +Returns the status id of the object + +=head2 sortkey + +Returns the sortkey of the object + +=head2 isprivate + +Returns the true if this case-run is private. + +=cut + +=head2 updated_deps + +Returns a reference to a list of dependent caseruns that were updated + +=cut + +sub id { return $_[0]->{'case_run_id'}; } +sub case_id { return $_[0]->{'case_id'}; } +sub run_id { return $_[0]->{'run_id'}; } +sub testedby { return Bugzilla::User->new($_[0]->{'testedby'}); } +sub assignee { return Bugzilla::User->new($_[0]->{'assignee'}); } +sub case_text_version { return $_[0]->{'case_text_version'}; } +sub running_date { return $_[0]->{'running_date'}; } +sub close_date { return $_[0]->{'close_date'}; } +sub iscurrent { return $_[0]->{'iscurrent'}; } +sub status_id { return $_[0]->{'case_run_status_id'}; } +sub sortkey { return $_[0]->{'sortkey'}; } +sub isprivate { return $_[0]->{'isprivate'}; } +sub updated_deps { return $_[0]->{'updated_deps'}; } + +=head2 type + +Returns 'case' + +=cut + +sub type { + my $self = shift; + $self->{'type'} = 'caserun'; + return $self->{'type'}; +} + +=head2 notes + +Returns the cumulative notes of all caserun records of this case and run. + +=cut + +sub notes { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $notes = $dbh->selectcol_arrayref( + "SELECT notes + FROM test_case_runs + WHERE case_id = ? AND run_id = ? + ORDER BY case_run_id", + undef,($self->case_id, $self->run_id)); + + return join("\n", @$notes); +} + +=head2 run + +Returns the TestRun object that this case-run is associated with + +=cut + +# The potential exists for creating a circular reference here. +sub run { + my $self = shift; + return $self->{'run'} if exists $self->{'run'}; + $self->{'run'} = Bugzilla::Testopia::TestRun->new($self->{'run_id'}); + return $self->{'run'}; +} + +=head2 case + +Returns the TestCase object that this case-run is associated with + +=cut + +# The potential exists for creating a circular reference here. +sub case { + my $self = shift; + return $self->{'case'} if exists $self->{'case'}; + $self->{'case'} = Bugzilla::Testopia::TestCase->new($self->{'case_id'}); + return $self->{'case'}; +} + +=head2 build + +Returns the Build object that this case-run is associated with + +=cut + +sub build { + my $self = shift; + return $self->{'build'} if exists $self->{'build'}; + $self->{'build'} = Bugzilla::Testopia::Build->new($self->{'build_id'}); + return $self->{'build'}; +} + +=head2 environment + +Returns the Build object that this case-run is associated with + +=cut + +sub environment { + my $self = shift; + return $self->{'environment'} if exists $self->{'environment'}; + $self->{'environment'} = Bugzilla::Testopia::Environment->new($self->{'environment_id'}); + return $self->{'environment'}; +} + +=head2 status + +Looks up the status name of the associated status_id for this object + +=cut + +sub status { + my $self = shift; + my $dbh = Bugzilla->dbh; + ($self->{'status'}) = $dbh->selectrow_array( + "SELECT name FROM test_case_run_status + WHERE case_run_status_id=?", undef, + $self->{'case_run_status_id'}); + return $self->{'status'}; +} + +=head2 attachments + +Returns a reference to a list of attachments associated with this +case. + +=cut + +sub attachments { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'attachments'} if exists $self->{'attachments'}; + + my $attachments = $dbh->selectcol_arrayref( + "SELECT attachment_id + FROM test_case_attachments + WHERE caserun_id = ?", + undef, $self->{'case_id'}); + + my @attachments; + foreach my $a (@{$attachments}){ + push @attachments, Bugzilla::Testopia::Attachment->new($a); + } + $self->{'attachments'} = \@attachments; + return $self->{'attachments'}; + +} + +=head2 bugs + +Returns a list of Bugzilla::Bug objects associated with this case-run + +=cut + +sub bugs { + my $self = shift; + #return $self->{'bug'} if exists $self->{'bug'}; + my $dbh = Bugzilla->dbh; + my @bugs; + my $bugids = $dbh->selectcol_arrayref("SELECT bug_id + FROM test_case_bugs + WHERE case_run_id=?", + undef, $self->{'case_run_id'}); + foreach my $bugid (@{$bugids}){ + push @bugs, Bugzilla::Bug->new($bugid, Bugzilla->user->id) if Bugzilla->user->can_see_bug($bugid); + } + $self->{'bugs'} = \@bugs; #join(",", @$bugids); + + return $self->{'bugs'}; +} + +=head2 bug_list + +Returns a comma separated list of bug ids associated with this case-run + +=cut + +sub bug_list { + my $self = shift; + return $self->{'bug_list'} if exists $self->{'bug_list'}; + my $dbh = Bugzilla->dbh; + my @bugs; + my $bugids = $dbh->selectcol_arrayref("SELECT bug_id + FROM test_case_bugs + WHERE case_run_id=?", + undef, $self->id); + my @visible; + foreach my $bugid (@{$bugids}){ + push @visible, $bugid if Bugzilla->user->can_see_bug($bugid); + } + $self->{'bug_list'} = join(",", @$bugids); + + return $self->{'bug_list'}; +} + +=head2 bug_count + +Retuns a count of the bugs associated with this case-run + +=cut + +sub bug_count{ + my $self = shift; + return $self->{'bug_count'} if exists $self->{'bug_count'}; + my $dbh = Bugzilla->dbh; + + $self->{'bug_count'} = $dbh->selectrow_array("SELECT COUNT(bug_id) + FROM test_case_bugs + WHERE case_run_id=?", + undef, $self->{'case_run_id'}); + return $self->{'bug_count'}; +} + +=head2 get_buglist + +Returns a comma separated string off bug ids associated with +this case-run + +=cut + +sub get_buglist { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $bugids = $dbh->selectcol_arrayref("SELECT bug_id + FROM test_case_bugs + WHERE case_run_id=?", + undef, $self->{'case_run_id'}); + return join(',', @{$bugids}); +} + +=head2 is_open_status + +Returns true if the status of this case-run is an open status + +=cut + +sub is_open_status { + my $self = shift; + my $status = shift; + my @open_status_list = (IDLE, RUNNING, PAUSED); + return 1 if lsearch(\@open_status_list, $status) > -1; +} + +=head2 is_closed_status + +Returns true if the status of this case-run is a closed status + +=cut + +sub is_closed_status { + my $self = shift; + my $status = shift; + my @closed_status_list = (PASSED, FAILED, BLOCKED); + return 1 if lsearch(\@closed_status_list, $status) > -1; +} + +=head2 canview + +Returns true if the logged in user has rights to view this case-run. + +=cut + +sub canview { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + return 1 if $self->run->plan->get_user_rights(Bugzilla->user->id) & TR_READ; + return 0; +} + +=head2 canedit + +Returns true if the logged in user has rights to edit this case-run. + +=cut + +sub canedit { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + return 1 if $self->run->plan->get_user_rights(Bugzilla->user->id) & TR_WRITE; + return 0; +} + +=head2 candelete + +Returns true if the logged in user has rights to delete this case-run. + +=cut + +sub candelete { + my $self = shift; + return 1 if Bugzilla->user->in_group('admin'); + return 0 unless Param("allow-test-deletion"); + return 1 if Bugzilla->user->in_group('Testers') && Param("testopia-allow-group-member-deletes"); + return 1 if $self->run->plan->get_user_rights(Bugzilla->user->id) & TR_DELETE; + return 0; +} + +sub completion_time { + my $self = shift; + my $dbh = Bugzilla->dbh; + if ($self->running_date && $self->close_date){ + my $seconds = str2time($self->close_date) - str2time($self->running_date); + return $seconds; + } + return 0; +} + +=head1 SEE ALSO + +TestCase TestRun + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/TestPlan.pm b/Bugzilla/Testopia/TestPlan.pm new file mode 100644 index 0000000..0b9671d --- /dev/null +++ b/Bugzilla/Testopia/TestPlan.pm @@ -0,0 +1,1341 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks + +=head1 NAME + +Bugzilla::Testopia::TestPlan - Testopia Test Plan object + +=head1 DESCRIPTION + +This module represents a test plan in Testopia. The test plan +is the glue of testopia. Virtually all other objects associate +to a plan. + +=head1 SYNOPSIS + +use Bugzilla::Testopia::TestPlan; + + $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + $plan = Bugzilla::Testopia::TestPlan->new(\%plan_hash); + +=cut + +package Bugzilla::Testopia::TestPlan; + +use strict; + +use Bugzilla::User; +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Testopia::Constants; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::TestCase; +use Bugzilla::Testopia::Category; +use Bugzilla::Testopia::Build; +use Bugzilla::Testopia::TestTag; +use Bugzilla::Testopia::Product; +use Bugzilla::Bug; + +use Text::Diff; + +use base qw(Exporter); + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + plan_id + product_id + author_id + type_id + default_product_version + name + creation_date + isactive + +=cut + +use constant DB_COLUMNS => qw( + plan_id + product_id + author_id + type_id + default_product_version + name + creation_date + isactive +); + +use constant NAME_MAX_LENGTH => 255; + +our $columns = join(", ", DB_COLUMNS); + +sub report_columns { + my $self = shift; + my %columns; + # Changes here need to match Report.pm + $columns{'Type'} = "plan_type"; + $columns{'Version'} = "default_product_version"; + $columns{'Product'} = "product"; + $columns{'Archived'} = "archived"; + $columns{'Tags'} = "tags"; + $columns{'Author'} = "author"; + my @result; + push @result, {'name' => $_, 'id' => $columns{$_}} foreach (sort(keys %columns)); + unshift @result, {'name' => '', 'id'=> ''}; + return \@result; + +} + +############################### +#### Methods #### +############################### + +=head2 new + +Instantiate a new test plan. This takes a single argument +either a test plan ID or a reference to a hash containing keys +identical to a test plan's fields and desired values. + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for this object + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns FROM test_plans + WHERE plan_id = ?}, undef, $id); + } elsif (ref $param eq 'HASH'){ + $obj = $param; + + } else { + ThrowCodeError('bad_arg', + {argument => 'param', + function => 'Testopia::TestPlan::_init'}); + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + return $self; +} + +=head2 store + +Stores a test plan object in the database. This method is used to store a +newly created test plan. It returns the new ID. + +=cut + +sub store { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + $dbh->do("INSERT INTO test_plans ($columns) + VALUES (?,?,?,?,?,?,?,?)", + undef, (undef, $self->{'product_id'}, $self->{'author_id'}, + $self->{'type_id'}, $self->{'default_product_version'}, $self->{'name'}, + $timestamp, 1)); + my $key = $dbh->bz_last_key( 'test_plans', 'plan_id' ); + $self->store_text($key, $self->{'author_id'}, $self->text, $timestamp); + $self->{'plan_id'} = $key; + + # Add permissions for the plan + $self->add_tester($self->{'author_id'},15); + if (Param('testopia-default-plan-testers-regexp')) { + $self->set_tester_regexp( Param('testopia-default-plan-testers-regexp'), 3); + $self->derive_regexp_testers(Param('testopia-default-plan-testers-regexp')); + } + + # Create default category + unless (scalar @{$self->product->categories}){ + my $category = Bugzilla::Testopia::Category->new( + {'name' => '--default--', + 'description' => 'Default product category for test cases', + 'product_id' => $self->product->id }); + $category->store; + } + + return $key; +} + +=head2 store_text + +Stores the test plan document in the test_plan_texts +table. Used by both store and copy. Accepts the the test plan id, +author id, text, and a an optional timestamp. + +=cut + +sub store_text { + my $self = shift; + my $dbh = Bugzilla->dbh; + my ($key, $author, $text, $timestamp) = @_; + if (!defined $timestamp){ + ($timestamp) = Bugzilla::Testopia::Util::get_time_stamp(); + } + $text ||= ''; + trick_taint($text); + my $version = $self->version || 0; + $dbh->do("INSERT INTO test_plan_texts + (plan_id, plan_text_version, who, creation_ts, plan_text) + VALUES(?,?,?,?,?)", + undef, $key, ++$version, $author, + $timestamp, $text); + $self->{'version'} = $version; + return $self->{'version'}; + +} + +=head2 clone + +Creates a copy of this test plan. Accepts the name of the new plan +and a boolean representing whether to copy the plan document as well. + +=cut + +sub clone { + my $self = shift; + my ($name, $author, $product_id, $version, $store_doc) = @_; + $store_doc = 1 unless defined($store_doc); + my $dbh = Bugzilla->dbh; + my ($timestamp) = Bugzilla::Testopia::Util::get_time_stamp(); + $dbh->do("INSERT INTO test_plans ($columns) + VALUES (?,?,?,?,?,?,?,?)", + undef, (undef, $product_id, $author, + $self->{'type_id'}, $version, $name, + $timestamp, 1)); + my $key = $dbh->bz_last_key( 'test_plans', 'plan_id' ); + my $text = $store_doc ? $self->text : ''; + $self->store_text($key, $self->{'author_id'}, $text, $timestamp); + return $key; + +} + +=head2 toggle_archive + +Toggles the archive bit on the plan. + +=cut + +sub toggle_archive { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $oldvalue = $self->isactive; + my $newvalue = $oldvalue == 1 ? 0 : 1; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + $dbh->bz_lock_tables('test_plans WRITE', 'test_plan_activity WRITE', + 'test_fielddefs READ'); + $dbh->do("UPDATE test_plans SET isactive = ? + WHERE plan_id = ?", undef, $newvalue, $self->{'plan_id'}); + my $field_id = Bugzilla::Testopia::Util::get_field_id("isactive", "test_plans"); + $dbh->do("INSERT INTO test_plan_activity + (plan_id, fieldid, who, changed, oldvalue, newvalue) + VALUES(?,?,?,?,?,?)", + undef, ($self->{'plan_id'}, $field_id, Bugzilla->user->id, + $timestamp, $oldvalue, $newvalue)); + $dbh->bz_unlock_tables(); + + $self->{'isactive'} = $newvalue; +} + +=head2 add_tag + +Associates a tag with this test plan. Takes the tag_id of the tag +to link. + +=cut + +sub add_tag { + my $self = shift; + my ($tag_id) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->bz_lock_tables('test_plan_tags WRITE'); + my $tagged = $dbh->selectrow_array( + "SELECT 1 FROM test_plan_tags + WHERE tag_id = ? AND plan_id = ?", + undef, ($tag_id, $self->{'plan_id'})); + if ($tagged) { + $dbh->bz_unlock_tables(); + return 1; + } + $dbh->do("INSERT INTO test_plan_tags(tag_id, plan_id, userid) VALUES(?,?,?)", + undef, ($tag_id, $self->{'plan_id'}), Bugzilla->user->id); + $dbh->bz_unlock_tables(); + +} + +=head2 remove_tag + +Removes a tag from this plan. Takes the tag_id of the tag to remove. + +=cut + +sub remove_tag { + my $self = shift; + my ($tag_id) = @_; + my $dbh = Bugzilla->dbh; + $dbh->do("DELETE FROM test_plan_tags + WHERE tag_id=? AND plan_id=?", + undef, ($tag_id, $self->{'plan_id'})); +} + +sub get_used_categories { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref( + "SELECT DISTINCT test_case_categories.category_id AS id, name + FROM test_case_categories + JOIN test_cases ON test_cases.category_id = test_case_categories.category_id + JOIN test_case_plans ON test_cases.case_id = test_case_plans.case_id + WHERE plan_id = ? + ORDER BY name", + {'Slice'=>{}}, $self->id); + + return $ref; +} + +=head2 get_plan_types + +Returns a list of types from the test_plan_types table + +=cut + +sub get_plan_types { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $types = $dbh->selectall_arrayref( + "SELECT type_id AS id, name + FROM test_plan_types + ORDER BY name", + {"Slice"=>{}}); + return $types; + +} + +=head2 last_changed + +Returns the date of the last change in the history table + +=cut + +sub last_changed { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my ($date) = $dbh->selectrow_array( + "SELECT MAX(changed) + FROM test_plan_activity + WHERE plan_id = ?", + undef, $self->id); + + return $self->{'creation_date'} unless $date; + return $date; +} + +=head2 plan_type_ref + +Returns a type name matching the given type id + +=cut + +sub plan_type_ref { + my $self = shift; + my $type_id = shift; + my $dbh = Bugzilla->dbh; + + my $type = $dbh->selectrow_hashref( + "SELECT type_id AS id, name, description + FROM test_plan_types + WHERE type_id = ?", + undef, $type_id); + + return $type; +} + +=head2 check_plan_type + +Returns true if a type with the given name exists + +=cut + +sub check_plan_type { + my $self = shift; + my $name = shift; + my $dbh = Bugzilla->dbh; + + my $type = $dbh->selectrow_hashref( + "SELECT 1 + FROM test_plan_types + WHERE name = ?", + undef, $name); + + return $type; +} + +sub check_tester { + my $self = shift; + my $userid = shift; + my $dbh = Bugzilla->dbh; + + my ($exists) = $dbh->selectrow_array( + "SELECT 1 + FROM test_plan_permissions + WHERE userid = ? AND plan_id = ? AND grant_type = ?", + undef, ($userid, $self->id, GRANT_DIRECT)); + + return $exists; + +} + +=head2 update_plan_type + +Update the given type + +=cut + +sub update_plan_type { + my $self = shift; + my ($type_id, $name, $desc) = @_; + my $dbh = Bugzilla->dbh; + + my $type = $dbh->do( + "UPDATE test_plan_types + SET name = ?, description = ? + WHERE type_id = ?", + undef, ($name, $desc, $type_id)); + +} + +=head2 add_plan_type + +Add the given type + +=cut + +sub add_plan_type { + my $self = shift; + my ($name, $desc) = @_; + my $dbh = Bugzilla->dbh; + + my $type = $dbh->do( + "INSERT INTO test_plan_types (type_id, name, description) + VALUES(?,?,?)", + undef, (undef, $name, $desc)); +} + +=head2 get_fields + +Returns a list of fields from the fielddefs table associated with +a plan + +=cut + +sub get_fields { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $types = $dbh->selectall_arrayref( + "SELECT fieldid AS id, description AS name + FROM test_fielddefs + WHERE table_name=?", + {"Slice"=>{}}, "test_plans"); + return $types; +} + +=head2 get_plan_versions + +Returns the list of versions of the plan document. + +=cut + +sub get_plan_versions { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $versions = $dbh->selectall_arrayref( + "SELECT plan_text_version AS id, plan_text_version AS name + FROM test_plan_texts + WHERE plan_id = ?", + {'Slice' =>{}}, $self->id); + return $versions; +} + +=head2 diff_plan_doc + +Returns either the diff of the latest version with a new text +or two numerical versions. + +=cut + +sub diff_plan_doc { + my $self = shift; + my ($new, $old) = @_; + $old ||= $self->version; + my $dbh = Bugzilla->dbh; + my $newdoc; + my $text = $new; + if (detaint_natural($new)){ + # we are looking for a version + $newdoc = $dbh->selectrow_array( + "SELECT plan_text FROM test_plan_texts + WHERE plan_id = ? AND plan_text_version = ?", + undef, ($self->{'plan_id'}, $new)); + } + else { + $newdoc = $text; + } + detaint_natural($old); + my $olddoc = $dbh->selectrow_array( + "SELECT plan_text FROM test_plan_texts + WHERE plan_id = ? AND plan_text_version = ?", + undef, ($self->{'plan_id'}, $old)); + my $diff = diff(\$newdoc, \$olddoc); + return $diff +} + +=head2 update + +Updates this test plan with new values supplied by the user. +Accepts a reference to a hash with keys identical to a test plan's +fields and values representing the new values entered. +Validation tests should be performed on the values +before calling this method. If a field is changed, a history +of that change is logged in the test_plan_activity table. + +=cut + +sub update { + my $self = shift; + my ($newvalues) = @_; + my $dbh = Bugzilla->dbh; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + $dbh->bz_lock_tables('test_plans WRITE', 'test_plan_activity WRITE', + 'test_fielddefs READ'); + foreach my $field (keys %{$newvalues}){ + if ($self->{$field} ne $newvalues->{$field}){ + trick_taint($newvalues->{$field}); + $dbh->do("UPDATE test_plans + SET $field = ? + WHERE plan_id = ?", + undef, ($newvalues->{$field}, $self->{'plan_id'})); + # Update the history + my $field_id = Bugzilla::Testopia::Util::get_field_id($field, "test_plans"); + $dbh->do("INSERT INTO test_plan_activity + (plan_id, fieldid, who, changed, oldvalue, newvalue) + VALUES(?,?,?,?,?,?)", + undef, ($self->{'plan_id'}, $field_id, Bugzilla->user->id, + $timestamp, $self->{$field}, $newvalues->{$field})); + $self->{$field} = $newvalues->{$field}; + + } + } + $dbh->bz_unlock_tables(); +} + +=head2 history + +Returns a reference to a list of history entries from the +test_plan_activity table. + +=cut + +sub history { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref( + "SELECT defs.description AS what, + p.login_name AS who, a.changed, a.oldvalue, a.newvalue + FROM test_plan_activity AS a + JOIN test_fielddefs AS defs ON a.fieldid = defs.fieldid + JOIN profiles AS p ON a.who = p.userid + WHERE a.plan_id = ?", + {'Slice'=>{}}, $self->{'plan_id'}); + foreach my $row (@$ref){ + if ($row->{'what'} eq 'Product'){ + $row->{'oldvalue'} = $self->lookup_product($row->{'oldvalue'}); + $row->{'newvalue'} = $self->lookup_product($row->{'newvalue'}); + } + elsif ($row->{'what'} eq 'Plan Type'){ + $row->{'oldvalue'} = $self->lookup_type($row->{'oldvalue'}); + $row->{'newvalue'} = $self->lookup_type($row->{'newvalue'}); + } + } + return $ref; +} + +sub copy_permissions { + my $self = shift; + my ($planid) = @_; + my $dbh = Bugzilla->dbh; + + my ($regexp, $perms) = $dbh->selectrow_array( + "SELECT user_regexp, permissions + FROM test_plan_permissions_regexp + WHERE plan_id = ?",undef, $self->id); + + $dbh->do("INSERT INTO test_plan_permissions_regexp (plan_id, user_regexp, permissions) + VALUES(?,?,?)", undef,($planid, $regexp, $perms)) if $regexp; + + my $ref = $dbh->selectall_arrayref( + "SELECT userid, permissions + FROM test_plan_permissions + WHERE plan_id = ? AND grant_type = ?", + {'Slice' =>{}}, ($self->id, GRANT_DIRECT)); + foreach my $row (@$ref){ + $dbh->do("INSERT INTO test_plan_permissions (userid, plan_id, permissions, grant_type) + VALUES(?,?,?,?)", undef, ($row->{'userid'}, $planid, $row->{'permissions'}, GRANT_DIRECT)); + } +} + +=head2 lookup_type + +Takes an ID of the type field and returns the value + +=cut + +sub lookup_type { + my $self = shift; + my ($id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT name + FROM test_plan_types + WHERE type_id = ?", + undef, $id); + return $value; +} + +=head2 lookup_type_by_name + +Returns the id of the type name passed. + +=cut + +sub lookup_type_by_name { + my $self = shift; + my ($name) = @_; + my $dbh = Bugzilla->dbh; + + my ($value) = $dbh->selectrow_array( + "SELECT type_id + FROM test_plan_types + WHERE name = ?", + undef, $name); + return $value; +} + +=head2 lookup_product + +Takes an ID of the status field and returns the value + +=cut + +sub lookup_product { + my $self = shift; + my ($id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT name + FROM products + WHERE id = ?", + undef, $id); + return $value; +} + +=head2 lookup_product_by_name + +Returns the id of the product name passed. + +=cut + +sub lookup_product_by_name { + my ($name) = @_; + my $dbh = Bugzilla->dbh; + + # TODO 2.22 use Product.pm + my ($value) = $dbh->selectrow_array( + "SELECT id + FROM products + WHERE name = ?", + undef, $name); + return $value; +} + +sub set_tester_regexp { + my $self = shift; + my ($regexp, $permissions) = @_; + my $dbh = Bugzilla->dbh; + my ($is, $oldreg, $oldperms) = $dbh->selectrow_array( + "SELECT 1, user_regexp, permissions + FROM test_plan_permissions_regexp + WHERE plan_id = ?",undef, $self->id); + + return unless ($oldreg ne $regexp || $oldperms != $permissions); + if ($is){ + $dbh->do("UPDATE test_plan_permissions_regexp + SET user_regexp = ?, permissions = ? + WHERE plan_id = ?", undef, ($regexp, $permissions, $self->id)); + } + else { + $dbh->do("INSERT INTO test_plan_permissions_regexp + (plan_id, user_regexp, permissions) + VALUES(?,?,?)", + undef, ($self->id, $regexp, $permissions)); + } + + $self->derive_regexp_testers($regexp); + +} + +sub derive_regexp_testers { + my $self = shift; + my $regexp = shift; + my $dbh = Bugzilla->dbh; + # Get the permissions of the regexp testers so we can set it later. + my ($permissions) = $dbh->selectrow_array( + "SELECT permissions + FROM test_plan_permissions_regexp + WHERE plan_id = ?", undef, $self->id); + + my $sth = $dbh->prepare("SELECT profiles.userid, profiles.login_name, plan_id + FROM profiles + LEFT JOIN test_plan_permissions + ON test_plan_permissions.userid = profiles.userid + AND test_plan_permissions.plan_id = ? + AND grant_type = ?"); + my $plan_add = $dbh->prepare("INSERT INTO test_plan_permissions + (userid, plan_id, permissions, grant_type) + VALUES (?,?,?,?)"); + my $plan_update = $dbh->prepare("UPDATE test_plan_permissions + SET permissions = ? + WHERE userid = ? AND plan_id = ? AND grant_type = ?"); + my $plan_del = $dbh->prepare("DELETE FROM test_plan_permissions + WHERE userid = ? AND plan_id = ? + AND grant_type = ?"); + $sth->execute($self->id, GRANT_REGEXP); + while (my ($userid, $login, $present) = $sth->fetchrow_array()) { + if (($regexp =~ /\S+/) && ($login =~ m/$regexp/i)){ + if ($present){ + $plan_update->execute($permissions, $userid, $self->id, GRANT_REGEXP) + } + else { + $plan_add->execute($userid, $self->id, $permissions, GRANT_REGEXP) + } + } + else { + $plan_del->execute($userid, $self->id, GRANT_REGEXP) if $present; + } + } + +} + +sub remove_tester { + my $self = shift; + my ($userid) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->do("DELETE FROM test_plan_permissions + WHERE userid = ? AND plan_id = ? AND grant_type = ?", + undef, ($userid, $self->id, GRANT_DIRECT)); +} + +sub add_tester { + my $self = shift; + my ($userid, $perms) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->do("INSERT INTO test_plan_permissions + (userid, plan_id, permissions, grant_type) + VALUES(?,?,?,?)", + undef, ($userid, $self->id, $perms, GRANT_DIRECT)); +} + +sub update_tester { + my $self = shift; + my ($userid, $perms) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->do("UPDATE test_plan_permissions SET permissions = ? + WHERE userid = ? AND plan_id = ? AND grant_type = ?", + undef, ($perms, $userid, $self->id, GRANT_DIRECT)); +} + +=head2 obliterate + +Removes this plan and all things that reference it. + +=cut + +sub obliterate { + my $self = shift; + my ($cgi, $template) = @_; + my $vars; + my $dbh = Bugzilla->dbh; + + my $progress_interval = 250; + my $i = 0; + my $total = scalar @{$self->test_cases} + scalar @{$self->test_runs}; + + foreach my $obj (@{$self->attachments}){ + $obj->obliterate; + } + foreach my $obj (@{$self->test_runs}){ + $obj->obliterate($cgi, $template); + } + foreach my $obj (@{$self->test_cases}){ + $i++; + if ($cgi && $i % $progress_interval == 0){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $vars->{'process'} = "Deleting test cases"; + + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + $obj->obliterate if (scalar @{$obj->plans} == 1); + } + + $dbh->do("DELETE FROM test_plan_texts WHERE plan_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_plan_tags WHERE plan_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_plan_activity WHERE plan_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_case_plans WHERE plan_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_plans WHERE plan_id = ?", undef, $self->id); + return 1; +} + +=head2 canview + +Returns true if the logged in user has rights to view this plan + +=cut + +sub canview { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + return 1 if $self->get_user_rights(Bugzilla->user->id) & TR_READ; + return 0; +} + +=head2 canedit + +Returns true if the logged in user has rights to edit this plan + +=cut + +sub canedit { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + return 1 if $self->get_user_rights(Bugzilla->user->id) & TR_WRITE; + return 0; + +} + +=head2 candelete + +Returns true if the logged in user has rights to delete this plan + +=cut + +sub candelete { + my $self = shift; + return 1 if Bugzilla->user->in_group('admin'); + return 0 unless Param("allow-test-deletion"); + return 1 if Bugzilla->user->in_group('Testers') && Param("testopia-allow-group-member-deletes"); + return 1 if $self->get_user_rights(Bugzilla->user->id) & TR_DELETE; + return 0; +} + +sub canadmin { + my $self = shift; + return 1 if Bugzilla->user->in_group("admin"); + return 1 if ($self->get_user_rights(Bugzilla->user->id) & TR_ADMIN); + return 0; +} + +sub get_user_rights { + my $self = shift; + my ($userid) = @_; + + my $dbh = Bugzilla->dbh; + my ($perms) = $dbh->selectrow_array( + "SELECT permissions FROM test_plan_permissions + WHERE userid = ? AND plan_id = ?", + undef, ($userid, $self->id)); + + return $perms; +} + +############################### +#### Accessors #### +############################### +=head1 ACCESSOR METHODS + +=head2 id + +Returns the ID for this object + +=head2 creation_date + +Returns the creation timestamp for this object + +=head2 product_version + +Returns the product version for this object + +=head2 product_id + +Returns the product id for this object + +=head2 author + +Returns a Bugzilla::User object representing the plan author + +=head2 name + +Returns the name of this plan + +=head2 type_id + +Returns the type id of this plan + +=head2 isactive + +Returns true if this plan is not archived + +=cut + +sub id { return $_[0]->{'plan_id'}; } +sub creation_date { return $_[0]->{'creation_date'}; } +sub product_version { return $_[0]->{'default_product_version'}; } +sub product_id { return $_[0]->{'product_id'}; } +sub author { return Bugzilla::User->new($_[0]->{'author_id'}); } +sub name { return $_[0]->{'name'}; } +sub type_id { return $_[0]->{'type_id'}; } +sub isactive { return $_[0]->{'isactive'}; } + +=head2 type + +Returns 'case' + +=cut + +sub type { + my $self = shift; + $self->{'type'} = 'plan'; + return $self->{'type'}; +} + +sub tester_regexp { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + + my ($regexp) = $dbh->selectrow_array( + "SELECT user_regexp + FROM test_plan_permissions_regexp + WHERE plan_id = ?", undef, $self->id); + + return $regexp; +} + +sub tester_regexp_permissions { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + + my ($perms) = $dbh->selectrow_array( + "SELECT permissions + FROM test_plan_permissions_regexp + WHERE plan_id = ?", undef, $self->id); + my $p; + + $p->{'read'} = $perms >= TR_READ; + $p->{'write'} = $perms >= TR_WRITE; + $p->{'delete'} = $perms >= TR_DELETE; + $p->{'admin'} = $perms >= TR_ADMIN; + + return $p; +} + +sub access_list { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + + my $ref = $dbh->selectall_arrayref( + "SELECT tpp.userid, permissions + FROM test_plan_permissions AS tpp + JOIN profiles ON profiles.userid = tpp.userid + WHERE plan_id = ? AND grant_type = ? + ORDER BY profiles.realname", {'Slice' =>{}}, ($self->id, GRANT_DIRECT)); + my @rows; + foreach my $row (@$ref){ + push @rows, {'user' => Bugzilla::User->new($row->{'userid'}), + 'read' => $row->{'permissions'} >= TR_READ, + 'write' => $row->{'permissions'} >= TR_WRITE, + 'delete' => $row->{'permissions'} >= TR_DELETE, + 'admin' => $row->{'permissions'} >= TR_ADMIN, + }; + } + $self->{'access_list'} = \@rows; + return $self->{'access_list'}; +} + +=head2 attachments + +Returns a reference to a list of attachments on this plan + +=cut + +sub attachments { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'attachments'} if exists $self->{'attachments'}; + + my $attachments = $dbh->selectcol_arrayref( + "SELECT attachment_id + FROM test_plan_attachments + WHERE plan_id = ?", + undef, $self->{'plan_id'}); + + my @attachments; + foreach my $a (@{$attachments}){ + push @attachments, Bugzilla::Testopia::Attachment->new($a); + } + $self->{'attachments'} = \@attachments; + return $self->{'attachments'}; + +} + +=head2 bugs + +Returns a reference to a list of Bugzilla::Bug objects associated +with this plan + +=cut + +sub bugs { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'bugs'} if exists $self->{'bugs'}; + my $ref = $dbh->selectcol_arrayref( + "SELECT DISTINCT bug_id + FROM test_case_bugs + JOIN test_cases ON test_case_bugs.case_id = test_cases.case_id + JOIN test_case_plans ON test_case_plans.case_id = test_cases.case_id + WHERE test_case_plans.plan_id = ?", + undef, $self->id); + my @bugs; + foreach my $id (@{$ref}){ + push @bugs, Bugzilla::Bug->new($id, Bugzilla->user->id); + } + $self->{'bugs'} = \@bugs if @bugs; + $self->{'bug_list'} = join(',', @$ref); + return $self->{'bugs'}; +} + +=head2 product + +Returns the product this plan is associated with + +=cut + +sub product { + my ($self) = @_; + + return $self->{'product'} if exists $self->{'product'}; + + $self->{'product'} = Bugzilla::Testopia::Product->new($self->product_id); + return $self->{'product'}; +} + +=head2 test_cases + +Returns a reference to a list of Testopia::TestCase objects linked +to this plan + +=cut + +sub test_cases { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'test_cases'} if exists $self->{'test_cases'}; + my $caseids = $dbh->selectcol_arrayref( + "SELECT case_id FROM test_case_plans + WHERE plan_id = ?", + undef, $self->{'plan_id'}); + my @cases; + foreach my $id (@{$caseids}){ + push @cases, Bugzilla::Testopia::TestCase->new($id); + } + + $self->{'test_cases'} = \@cases; + return $self->{'test_cases'}; +} + +=head2 test_case_count + +Returns a count of the test cases linked to this plan + +=cut + +sub test_case_count { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'test_case_count'} if exists $self->{'test_case_count'}; + $self->{'test_case_count'} = $dbh->selectrow_array( + "SELECT COUNT(case_id) FROM test_case_plans + WHERE plan_id = ?", + undef, $self->{'plan_id'}) || 0; + return $self->{'test_case_count'}; +} + +=head2 test_runs + +Returns a reference to a list of test runs in this plan + +=cut + +sub test_runs { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'test_runs'} if exists $self->{'test_runs'}; + + my $runids = $dbh->selectcol_arrayref("SELECT run_id FROM test_runs + WHERE plan_id = ?", + undef, $self->{'plan_id'}); + my @runs; + foreach my $id (@{$runids}){ + push @runs, Bugzilla::Testopia::TestRun->new($id); + } + + $self->{'test_runs'} = \@runs; + return $self->{'test_runs'}; +} + +=head2 test_run_count + +Returns a count of the test cases linked to this plan + +=cut + +sub test_run_count { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'test_run_count'} if exists $self->{'test_run_count'}; + $self->{'test_run_count'} = $dbh->selectrow_array( + "SELECT COUNT(run_id) FROM test_runs + WHERE plan_id = ?", + undef, $self->{'plan_id'}) || 0; + return $self->{'test_run_count'}; +} + +sub test_case_run_count { + my $self = shift; + my ($status_id) = @_; + my $dbh = Bugzilla->dbh; + my $query = + "SELECT count(case_run_id) FROM test_case_runs + INNER JOIN test_runs ON test_case_runs.run_id = test_runs.run_id + INNER JOIN test_plans ON test_runs.plan_id = test_plans.plan_id + WHERE test_case_runs.iscurrent = 1 AND test_plans.plan_id = ?"; + $query .= " AND test_case_runs.case_run_status_id = ?" if $status_id; + my $count; + if ($status_id){ + ($count) = $dbh->selectrow_array($query,undef,($self->id,$status_id)); + } + else { + ($count) = $dbh->selectrow_array($query,undef,$self->id); + } + + return $count; +} + +sub builds_seen { + my $self = shift; + my ($status_id) = @_; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectcol_arrayref( + "SELECT DISTINCT test_case_runs.build_id + FROM test_case_runs + INNER JOIN test_runs ON test_case_runs.run_id = test_runs.run_id + WHERE test_runs.plan_id = ? AND test_case_runs.iscurrent = 1", + undef,$self->id); + + my @o; + foreach my $id (@$ref){ + push @o, Bugzilla::Testopia::Build->new($id); + } + return \@o; +} + +sub environments_seen { + my $self = shift; + my ($status_id) = @_; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectcol_arrayref( + "SELECT DISTINCT test_case_runs.environment_id + FROM test_case_runs + INNER JOIN test_runs ON test_case_runs.run_id = test_runs.run_id + WHERE test_runs.plan_id = ? AND test_case_runs.iscurrent = 1", + undef,$self->id); + + my @o; + foreach my $id (@$ref){ + push @o, Bugzilla::Testopia::Environment->new($id); + } + return \@o; +} + +=head2 tags + +Returns a reference to a list of Testopia::TestTag objects +associated with this plan + +=cut + +sub tags { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'tags'} if exists $self->{'tags'}; + my $tagids = $dbh->selectcol_arrayref("SELECT test_plan_tags.tag_id + FROM test_plan_tags + INNER JOIN test_tags ON test_plan_tags.tag_id = test_tags.tag_id + WHERE plan_id = ? + ORDER BY test_tags.tag_name", + undef, $self->{'plan_id'}); + my @plan_tags; + foreach my $t (@{$tagids}){ + push @plan_tags, Bugzilla::Testopia::TestTag->new($t); + } + $self->{'tags'} = \@plan_tags; + return $self->{'tags'}; +} + +=head2 text + +Returns the text of the plan document from the latest version +in the test_plan_texts table + +=cut + +sub text { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'text'} if exists $self->{'text'}; + my ($text) = $dbh->selectrow_array("SELECT plan_text + FROM test_plan_texts + WHERE plan_id = ? AND plan_text_version = ?", + undef, $self->{'plan_id'}, $self->version); + $self->{'text'} = $text; + return $self->{'text'}; +} + + +=head2 version + +Returns the plan text version. This number is incremented any time +changes are made to the plan document. + +=cut + +sub version { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'version'} if exists $self->{'version'}; + my ($ver) = $dbh->selectrow_array("SELECT MAX(plan_text_version) + FROM test_plan_texts + WHERE plan_id = ?", + undef, $self->{'plan_id'}); + + $self->{'version'} = $ver; + return $self->{'version'}; + + +} + +=head2 type + +Returns the type of this plan + +=cut + +sub plan_type { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'plan_type'} if exists $self->{'plan_type'}; + my ($type) = $dbh->selectrow_array("SELECT name + FROM test_plan_types + WHERE type_id = ?", + undef, $self->{'type_id'}); + + $self->{'plan_type'} = $type; + return $self->{'plan_type'}; +} + +=head1 TODO + +Use Bugzilla::Product and Version in 2.22 + +=head1 SEE ALSO + +Testopia::(TestRun, TestCase, Category, Build, Util) + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/TestRun.pm b/Bugzilla/Testopia/TestRun.pm new file mode 100644 index 0000000..d87750a --- /dev/null +++ b/Bugzilla/Testopia/TestRun.pm @@ -0,0 +1,1286 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks +# Ed Fuentetaja + +=head1 NAME + +Bugzilla::Testopia::TestRun - Testopia Test Run object + +=head1 DESCRIPTION + +This module represents a test run in Testopia. A test run is the +place where most of the work of testing is done. A run is associated +with a single test plan and multiple test cases through the test +case-runs. + +=head1 SYNOPSIS + +use Bugzilla::Testopia::TestRun; + + $run = Bugzilla::Testopia::TestRun->new($run_id); + $run = Bugzilla::Testopia::TestRun->new(\%run_hash); + +=cut + +package Bugzilla::Testopia::TestRun; + +use strict; + +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Constants; +use Bugzilla::Testopia::Constants; +use Bugzilla::Config; +use Bugzilla::Testopia::Environment; +use Bugzilla::Bug; + +use base qw(Exporter); +@Bugzilla::Testopia::TestRun::EXPORT = qw(CalculatePercentCompleted); + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + run_id + plan_id + environment_id + product_version + build_id + plan_text_version + manager_id + start_date + stop_date + summary + notes + +=cut + +use constant DB_COLUMNS => qw( + run_id + plan_id + environment_id + product_version + build_id + plan_text_version + manager_id + start_date + stop_date + summary + notes +); + +our $columns = join(", ", DB_COLUMNS); + +sub report_columns { + my $self = shift; + my %columns; + # Changes here need to match Report.pm + $columns{'Status'} = "run_status"; + $columns{'Version'} = "default_product_version"; + $columns{'Product'} = "product"; + $columns{'Build'} = "build"; + $columns{'Milestone'} = "milestone"; + $columns{'Environment'} = "environment"; + $columns{'Tags'} = "tags"; + $columns{'Manager'} = "manager"; + my @result; + push @result, {'name' => $_, 'id' => $columns{$_}} foreach (sort(keys %columns)); + unshift @result, {'name' => '', 'id'=> ''}; + return \@result; + +} + +############################### +#### Methods #### +############################### + +=head2 new + +Instantiate a new Test Run. This takes a single argument +either a test run ID or a reference to a hash containing keys +identical to a test run's fields and desired values. + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor for this object + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns FROM test_runs + WHERE run_id = ?}, undef, $id); + + } elsif (ref $param eq 'HASH'){ + $obj = $param; + + } else { + Bugzilla::Error::ThrowCodeError('bad_arg', + {argument => 'param', + function => 'Testopia::TestRun::_init'}); + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + + return $self; +} + +=head2 calculate_percent_completed + +Calculates a percentage from two numbers. Takes the total number +of IDLE case runs and the number of those that have another status +and adds them to get a total then takes the percentage. + +=cut + +sub calculate_percent_completed { + + my ($idle, $run) = (@_); + my $total = $idle + $run; + my $percent; + if ($total == 0) { + $percent = 0; + } else { + $percent = $run*100/$total; + $percent = int($percent + 0.5); + if (($percent == 100) && ($idle != 0)) { + #I don't want to see 100% unless every test is run + $percent = 99; + } + } + return $percent; +} + +=head2 add_cc + +Adds a user to the CC list for this run + +=cut + +sub add_cc{ + my $self = shift; + my ($ccid) = (@_); + my $dbh = Bugzilla->dbh; + $dbh->do("INSERT INTO test_run_cc(run_id, who) + VALUES (?,?)", undef, $self->{'run_id'}, $ccid); + #TODO: send mail + return 1; +} + +=head2 remove_cc + +Removes a user from the CC list of this run + +=cut + +sub remove_cc{ + my $self = shift; + my ($ccid) = (@_); + my $dbh = Bugzilla->dbh; + $dbh->do("DELETE FROM test_run_cc + WHERE run_id=? AND who=?", + undef, $self->{'run_id'}, $ccid); + #TODO: send mail + return 1; +} + +=head2 add_tag + +Associates a tag with this test case + +=cut + +sub add_tag { + my $self = shift; + my ($tag_id) = @_; + my $dbh = Bugzilla->dbh; + + $dbh->bz_lock_tables('test_run_tags WRITE'); + my $tagged = $dbh->selectrow_array( + "SELECT 1 FROM test_run_tags + WHERE tag_id = ? AND run_id = ?", + undef, $tag_id, $self->{'run_id'}); + if ($tagged) { + $dbh->bz_unlock_tables; + return 1; + } + $dbh->do("INSERT INTO test_run_tags(tag_id, run_id, userid) VALUES(?,?,?)", + undef, $tag_id, $self->{'run_id'}, Bugzilla->user->id); + $dbh->bz_unlock_tables; + + return 0; +} + +=head2 remove_tag + +Disassociates a tag from this test case + +=cut + +sub remove_tag { + my $self = shift; + my ($tag_id) = @_; + my $dbh = Bugzilla->dbh; + $dbh->do("DELETE FROM test_run_tags + WHERE tag_id=? AND run_id=?", + undef, $tag_id, $self->{'run_id'}); + return; +} + +=head2 add_case_run + +Associates a test case with this run by adding a new row to +the test_case_runs table + +=cut + +sub add_case_run { + my $self = shift; + my ($case_id) = @_; + return 0 if $self->check_case($case_id); + my $case = Bugzilla::Testopia::TestCase->new($case_id); + return 0 if $case->status ne 'CONFIRMED'; + my $caserun = Bugzilla::Testopia::TestCaseRun->new({ + 'run_id' => $self->{'run_id'}, + 'case_id' => $case_id, + 'assignee' => $case->default_tester->id, + 'case_text_version' => $case->version, + 'build_id' => $self->build->id, + 'environment_id' => $self->environment_id, + }); + $caserun->store; +} + +=head2 store + +Stores a test run object in the database. This method is used to store a +newly created test run. It returns the new ID. + +=cut + +sub store { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + $dbh->do("INSERT INTO test_runs ($columns) + VALUES (?,?,?,?,?,?,?,?,?,?,?)", + undef, (undef, $self->{'plan_id'}, $self->{'environment_id'}, + $self->{'product_version'}, $self->{'build_id'}, + $self->{'plan_text_version'}, $self->{'manager_id'}, + $timestamp, undef, $self->{'summary'}, $self->{'notes'})); + my $key = $dbh->bz_last_key( 'test_runs', 'run_id' ); + return $key; +} + +=head2 update + +Updates this test run with new values supplied by the user. +Accepts a reference to a hash with keys identical to a test run's +fields and values representing the new values entered. +Validation tests should be performed on the values +before calling this method. If a field is changed, a history +of that change is logged in the test_run_activity table. + +=cut + +sub update { + my $self = shift; + my ($newvalues) = @_; + my $dbh = Bugzilla->dbh; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + + $dbh->bz_lock_tables('test_runs WRITE', 'test_run_activity WRITE', + 'test_fielddefs READ'); + foreach my $field (keys %{$newvalues}){ + if ($newvalues->{$field} && $self->{$field} ne $newvalues->{$field}){ + $dbh->do("UPDATE test_runs + SET $field = ? WHERE run_id = ?", + undef, ($newvalues->{$field}, $self->{'run_id'})); + # Update the history + my $field_id = Bugzilla::Testopia::Util::get_field_id($field, "test_runs"); + $dbh->do("INSERT INTO test_run_activity + (run_id, fieldid, who, changed, oldvalue, newvalue) + VALUES(?,?,?,?,?,?)", + undef, ($self->{'run_id'}, $field_id, Bugzilla->user->id, + $timestamp, $self->{$field}, $newvalues->{$field})); + $self->{$field} = $newvalues->{$field}; + } + } + $dbh->bz_unlock_tables(); +} + +=head2 update_notes + +Updates just the notes for this run + +=cut + +sub update_notes { + my $self = shift; + my ($notes) = @_; + my $dbh = Bugzilla->dbh; + $dbh->do("UPDATE test_runs + SET notes = ? WHERE run_id = ?", + undef, $notes, $self->{'run_id'}); +} + +=head2 clone + +Creates a copy of this test run. Accepts the summary of the new run +and the build id to use. + +=cut + +sub clone { + my $self = shift; + my ($summary, $manager, $plan_id, $build) = @_; + my $dbh = Bugzilla->dbh; + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + $dbh->do("INSERT INTO test_runs ($columns) + VALUES (?,?,?,?,?,?,?,?,?,?,?)", + undef, (undef, $plan_id, $self->{'environment_id'}, + $self->{'product_version'}, $build, + $self->{'plan_text_version'}, $manager, + $timestamp, undef, $summary, undef)); + my $key = $dbh->bz_last_key( 'test_runs', 'run_id' ); + return $key; +} + +=head2 history + +Returns a reference to a list of history entries from the +test_run_activity table. + +=cut + +sub history { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref( + "SELECT defs.description AS what, + p.login_name AS who, a.changed, a.oldvalue, a.newvalue + FROM test_run_activity AS a + JOIN test_fielddefs AS defs ON a.fieldid = defs.fieldid + JOIN profiles AS p ON a.who = p.userid + WHERE a.run_id = ?", + {'Slice'=>{}}, $self->{'run_id'}); + + foreach my $row (@$ref){ + if ($row->{'what'} eq 'Environment'){ + $row->{'oldvalue'} = $self->lookup_environment($row->{'oldvalue'}); + $row->{'newvalue'} = $self->lookup_environment($row->{'newvalue'}); + } + elsif ($row->{'what'} eq 'Default Build'){ + $row->{'oldvalue'} = $self->lookup_build($row->{'oldvalue'}); + $row->{'newvalue'} = $self->lookup_build($row->{'newvalue'}); + } + elsif ($row->{'what'} eq 'Manager'){ + $row->{'oldvalue'} = $self->lookup_manager($row->{'oldvalue'}); + $row->{'newvalue'} = $self->lookup_manager($row->{'newvalue'}); + } + } + return $ref; +} + +=head2 obliterate + +Removes this run and all things that reference it. + +=cut + +sub obliterate { + my $self = shift; + my ($cgi, $template) = @_; + my $dbh = Bugzilla->dbh; + my $vars; + + my $progress_interval = 500; + my $i = 0; + my $total = scalar @{$self->caseruns}; + + foreach my $obj (@{$self->caseruns}){ + $i++; + if ($cgi && $i % $progress_interval == 0){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $vars->{'process'} = "Deleting Run " . $self->id; + + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + $obj->obliterate; + } + + $dbh->do("DELETE FROM test_run_cc WHERE run_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_run_tags WHERE run_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_run_activity WHERE run_id = ?", undef, $self->id); + $dbh->do("DELETE FROM test_runs WHERE run_id = ?", undef, $self->id); + return 1; +} + +=head2 Check_case + +Checks if the given test case is already associated with this run + +=cut + +sub check_case { + my $self = shift; + my ($case_id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT case_run_id + FROM test_case_runs + WHERE case_id = ? AND run_id = ?", + undef, ($case_id, $self->{'run_id'})); + return $value; +} + +=head2 lookup_environment + +Takes an ID of the envionment field and returns the value + +=cut + +sub lookup_environment { + my $self = shift; + my ($id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT name + FROM test_environments + WHERE environment_id = ?", + undef, $id); + return $value; +} + +=head2 lookup_environment_by_name + +Takes the name of an envionment and returns its id + +=cut + +sub lookup_environment_by_name { + my ($name) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT environment_id + FROM test_environments + WHERE name = ?", + undef, $name); + return $value; +} + +=head2 lookup_build + +Takes an ID of the build field and returns the value + +=cut + +sub lookup_build { + my $self = shift; + my ($id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT name + FROM test_builds + WHERE build_id = ?", + undef, $id); + return $value; +} + +=head2 lookup_manager + +Takes an ID of the manager field and returns the value + +=cut + +sub lookup_manager { + my $self = shift; + my ($id) = @_; + my $dbh = Bugzilla->dbh; + my ($value) = $dbh->selectrow_array( + "SELECT login_name + FROM profiles + WHERE userid = ?", + undef, $id); + return $value; +} + +=head2 last_changed + +Returns the date of the last change in the history table + +=cut + +sub last_changed { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my ($date) = $dbh->selectrow_array( + "SELECT MAX(changed) + FROM test_run_activity + WHERE run_id = ?", + undef, $self->id); + + return $self->{'creation_date'} unless $date; + return $date; +} + +sub filter_case_categories { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $ids = $dbh->selectcol_arrayref( + "SELECT DISTINCT tcc.category_id + FROM test_case_categories AS tcc + JOIN test_cases ON test_cases.category_id = tcc.category_id + JOIN test_case_runs AS tcr ON test_cases.case_id = tcr.case_id + WHERE run_id = ?", + undef, $self->id); + + my @categories; + foreach my $id (@$ids){ + push @categories, Bugzilla::Testopia::Category->new($id); + } + + return \@categories; +} + +sub filter_builds { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $ids = $dbh->selectcol_arrayref( + "SELECT DISTINCT build_id + FROM test_case_runs + WHERE run_id = ?", + undef, $self->id); + + my @builds; + foreach my $id (@$ids){ + push @builds, Bugzilla::Testopia::Build->new($id); + } + return \@builds; +} + +sub filter_components { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my $ids = $dbh->selectcol_arrayref( + "SELECT DISTINCT components.id + FROM components + JOIN test_case_components AS tcc ON tcc.component_id = components.id + JOIN test_cases ON test_cases.case_id = tcc.case_id + JOIN test_case_runs AS tcr ON test_cases.case_id = tcr.case_id + WHERE run_id = ?", + undef, $self->id); + + my @components; + foreach my $id (@$ids){ + push @components, Bugzilla::Component->new($id); + } + + return \@components; +} + +=head2 environments + +Returns a reference to a list of Testopia::Environment objects. + +=cut + +sub environments { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'environments'} if exists $self->{'environments'}; + + my $environments = + $dbh->selectcol_arrayref("SELECT environment_id + FROM test_environments"); + + my @environments; + foreach my $id (@{$environments}){ + push @environments, Bugzilla::Testopia::Environment->new($id); + } + $self->{'environments'} = \@environments; + return $self->{'environments'}; +} + +=head2 get_status_list + +Returns a list of statuses for a run + +=cut + +sub get_status_list { + my @status = ( + { 'id' => 0, 'name' => 'Running' }, + { 'id' => 1, 'name' => 'Stopped' }, + ); + return \@status; +} + +=head2 get_distinct_builds + +Returns a list of build names for use in searches + +=cut + +sub get_distinct_builds { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $query = "SELECT build.name AS id, build.name " . + "FROM test_builds AS build " . + "JOIN products ON build.product_id = products.id " . + "LEFT JOIN group_control_map " . + "ON group_control_map.product_id = products.id "; + if (Param('useentrygroupdefault')) { + $query .= "AND group_control_map.entry != 0 "; + } else { + $query .= "AND group_control_map.membercontrol = " . + CONTROLMAPMANDATORY . " "; + } + if (%{Bugzilla->user->groups}) { + $query .= "AND group_id NOT IN(" . + join(',', values(%{Bugzilla->user->groups})) . ") "; + } + $query .= "WHERE group_id IS NULL AND build.isactive = 1 ORDER BY build.name"; + + my $ref = $dbh->selectall_arrayref($query, {'Slice'=>{}}); + + return $ref; +} + +=head2 get_distinct_milestones + +Returns a list of milestones for use in searches + +=cut + +sub get_distinct_milestones { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref( + "SELECT DISTINCT value AS id, value as name + FROM milestones + ORDER BY sortkey", {'Slice'=>{}}); + + return $ref; +} + +=head2 get_environments + +Returns a list of environments for use in searches + +=cut + +sub get_environments { + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref( + "SELECT DISTINCT name AS id, name + FROM test_environments + ORDER BY name", + {'Slice'=>{}}); + + return $ref; +} + +=head2 canview + +Returns true if the logged in user has rights to view this test run. + +=cut + +sub canview { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + return 1 if $self->plan->get_user_rights(Bugzilla->user->id) & TR_READ; + return 0; + +} + +=head2 canedit + +Returns true if the logged in user has rights to edit this test run. + +=cut + +sub canedit { + my $self = shift; + return 1 if Bugzilla->user->in_group('Testers'); + return 1 if $self->plan->get_user_rights(Bugzilla->user->id) & TR_WRITE; + return 0; +} + +=head2 candelete + +Returns true if the logged in user has rights to delete this test run. + +=cut + +sub candelete { + my $self = shift; + return 1 if Bugzilla->user->in_group('admin'); + return 0 unless Param("allow-test-deletion"); + return 1 if Bugzilla->user->in_group('Testers') && Param("testopia-allow-group-member-deletes"); + return 1 if $self->plan->get_user_rights(Bugzilla->user->id) & TR_DELETE; + return 0; +} + +############################### +#### Accessors #### +############################### + +=head1 ACCESSOR METHODS + +=head2 id + +Returns the ID for this object + +=head2 plan_text_version + +Returns the plan's text version of this run + +=head2 plan_id + +Returns the plan idof this run + +=head2 environment_id + +Returns the environment id of this run + +=head2 manager + +Returns a Bugzilla::User object representing the run's manager + +=head2 start_date + +Returns the time stamp of when this run was started + +=head2 stop_date + +Returns the time stamp of when this run was completed + +=head2 summary + +Returns the summary of this run + +=head2 notes + +Returns the notes for this run + +=head2 product_version + +Returns the product version of this run + +=cut + +sub id { return $_[0]->{'run_id'}; } +sub plan_text_version { return $_[0]->{'plan_text_version'}; } +sub plan_id { return $_[0]->{'plan_id'}; } +sub environment_id { return $_[0]->{'environment_id'}; } +sub manager { return Bugzilla::User->new($_[0]->{'manager_id'}); } +sub start_date { return $_[0]->{'start_date'}; } +sub stop_date { return $_[0]->{'stop_date'}; } +sub summary { return $_[0]->{'summary'}; } +sub notes { return $_[0]->{'notes'}; } +sub product_version { return $_[0]->{'product_version'}; } + +=head2 type + +Returns 'case' + +=cut + +sub type { + my $self = shift; + $self->{'type'} = 'run'; + return $self->{'type'}; +} + +=head2 plan + +Returns the Testopia::TestPlan object of the plan this run +is assoceated with + +=cut + +sub plan { + my $self = shift; + return $self->{'plan'} if exists $self->{'plan'}; + $self->{'plan'} = Bugzilla::Testopia::TestPlan->new($self->{'plan_id'}); + return $self->{'plan'}; +} + +=head2 tags + +Returns a reference to a list of Testopia::TestTag objects +associated with this run + +=cut + +sub tags { + my ($self) = @_; + my $dbh = Bugzilla->dbh; + return $self->{'tags'} if exists $self->{'tags'}; + my $tagids = $dbh->selectcol_arrayref("SELECT test_run_tags.tag_id + FROM test_run_tags + INNER JOIN test_tags ON test_run_tags.tag_id = test_tags.tag_id + WHERE run_id = ? + ORDER BY test_tags.tag_name", + undef, $self->{'run_id'}); + my @tags; + foreach my $t (@{$tagids}){ + push @tags, Bugzilla::Testopia::TestTag->new($t); + } + $self->{'tags'} = \@tags; + return $self->{'tags'}; +} + +=head2 environment + +Returns the Testopia::Environment object of the environment +this run is assoceated with + +=cut + +sub environment { + my $self = shift; + return $self->{'environment'} if exists $self->{'environment'}; + $self->{'environment'} = Bugzilla::Testopia::Environment->new($self->{'environment_id'}); + return $self->{'environment'}; + +} + +=head2 build + +Returns the Testopia::Build object of the plan this run +is assoceated with + +=cut + +sub build { + my $self = shift; + return $self->{'build'} if exists $self->{'build'}; + $self->{'build'} = Bugzilla::Testopia::Build->new($self->{'build_id'}); + return $self->{'build'}; + +} + +=head2 runtime + +Returns the total time the run took to complete + +=cut + +sub runtime { + +} + +=head2 bugs + +Returns a reference to a list of Bugzilla::Bug objects associated +with this run + +=cut + +sub bugs { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'bugs'} if exists $self->{'bugs'}; + my $ref = $dbh->selectcol_arrayref( + "SELECT DISTINCT bug_id + FROM test_case_bugs b + JOIN test_case_runs r ON r.case_run_id = b.case_run_id + WHERE r.run_id = ?", + undef, $self->{'run_id'}); + my @bugs; + foreach my $id (@{$ref}){ + push @bugs, Bugzilla::Bug->new($id, Bugzilla->user->id); + } + $self->{'bugs'} = \@bugs if @bugs; + $self->{'bug_list'} = join(',', @$ref); + return $self->{'bugs'}; +} + +=head2 cc + +Returns a reference to a list of Bugzilla::User objects +on the CC list of this run + +=cut + +sub cc { + my $self = shift; + return $self->{'cc'} if exists $self->{'cc'}; + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectcol_arrayref( + "SELECT who FROM test_run_cc + WHERE run_id=?", undef, $self->{'run_id'}); + my @cc; + foreach my $id (@{$ref}){ + push @cc, Bugzilla::User->new($id); + } + $self->{'cc'} = \@cc; + return $self->{'cc'}; +} + +=head2 cases + +Returns a reference to a list of Testopia::TestCase objects +associated with this run + +=cut + +sub cases { + my $self = shift; + return $self->{'cases'} if exists $self->{'cases'}; + my @cases; + foreach my $cr (@{$self->current_caseruns}){ + push @cases, Bugzilla::Testopia::TestCase->new($cr->case_id); + } + $self->{'cases'} = \@cases; + return $self->{'cases'}; + +} + +=head2 case_count + +Returns a count of the test cases associated with this run + +=cut + +sub case_count { + my $self = shift; + return scalar @{$self->cases}; +} + +sub case_run_count { + my $self = shift; + my ($status_id) = @_; + my $dbh = Bugzilla->dbh; + my $query = + "SELECT COUNT(*) + FROM test_case_runs + WHERE run_id = ? AND iscurrent = 1"; + $query .= " AND case_run_status_id = ?" if $status_id; + + my $count; + if ($status_id){ + ($count) = $dbh->selectrow_array($query,undef,($self->{'run_id'}, $status_id)); + } + else { + ($count) = $dbh->selectrow_array($query,undef,$self->{'run_id'}); + } + + return $count; +} + +#TODO: Replace these with case_run_count +=head2 idle_count + +Returns a count of the number of case-runs in this run with a status +of IDLE + +=cut + +sub idle_count { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_case_runs cr + JOIN test_case_run_status cs + ON cr.case_run_status_id = cs.case_run_status_id + WHERE cs.name = ? AND cr.run_id = ? AND cr.iscurrent = 1", + undef, ('IDLE', $self->{'run_id'})); + + $self->{'idle_count'} = $count; + return $self->{'idle_count'}; +} + +=head2 passed_count + +Returns a count of the number of case-runs in this run with a status +of PASSED + +=cut + +sub passed_count { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_case_runs cr + JOIN test_case_run_status cs + ON cr.case_run_status_id = cs.case_run_status_id + WHERE cs.name = ? AND cr.run_id = ? AND cr.iscurrent = 1", + undef, ('PASSED', $self->{'run_id'})); + + $self->{'passed_count'} = $count; + return $self->{'passed_count'}; +} + +=head2 failed_count + +Returns a count of the number of case-runs in this run with a status +of FAILED + +=cut + +sub failed_count { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_case_runs cr + JOIN test_case_run_status cs + ON cr.case_run_status_id = cs.case_run_status_id + WHERE cs.name = ? AND cr.run_id = ? AND cr.iscurrent = 1", + undef, ('FAILED', $self->{'run_id'})); + + $self->{'failed_count'} = $count; + return $self->{'failed_count'}; +} + +=head2 running_count + +Returns a count of the number of case-runs in this run with a status +of RUNNING + +=cut + +sub running_count { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_case_runs cr + JOIN test_case_run_status cs + ON cr.case_run_status_id = cs.case_run_status_id + WHERE cs.name = ? AND cr.run_id = ? AND cr.iscurrent = 1", + undef, ('RUNNING', $self->{'run_id'})); + + $self->{'running_count'} = $count; + return $self->{'running_count'}; +} + +=head2 paused_count + +Returns a count of the number of case-runs in this run with a status +of PAUSED + +=cut + +sub paused_count { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_case_runs cr + JOIN test_case_run_status cs + ON cr.case_run_status_id = cs.case_run_status_id + WHERE cs.name = ? AND cr.run_id = ? AND cr.iscurrent = 1", + undef, ('PAUSED', $self->{'run_id'})); + + $self->{'paused_count'} = $count; + return $self->{'paused_count'}; +} + +=head2 blocked_count + +Returns a count of the number of case-runs in this run with a status +of BLOCKED + +=cut + +sub blocked_count { + my $self = shift; + my $dbh = Bugzilla->dbh; + + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(*) + FROM test_case_runs cr + JOIN test_case_run_status cs + ON cr.case_run_status_id = cs.case_run_status_id + WHERE cs.name = ? AND cr.run_id = ? AND cr.iscurrent = 1", + undef, ('BLOCKED', $self->{'run_id'})); + + $self->{'blocked_count'} = $count; + return $self->{'blocked_count'}; +} + +=head2 percent_complete + +Returns a number representing the percentage of case-runs +that have a status vs. those with a status of IDLE + +=cut + +sub percent_complete { + my $self = shift; + my $notrun = $self->idle_count + $self->running_count + $self->paused_count; + my $run = $self->passed_count + $self->failed_count + $self->blocked_count; + $self->{'percent_complete'} = calculate_percent_completed($notrun, $run); + return $self->{'percent_complete'}; +} + +sub percent_passed { + my $self = shift; + my $notrun = $self->idle_count + $self->running_count + $self->paused_count + $self->failed_count + $self->blocked_count; + my $run = $self->passed_count; + $self->{'percent_passed'} = calculate_percent_completed($notrun, $run); + return $self->{'percent_passed'}; +} + +sub percent_failed { + my $self = shift; + my $notrun = $self->idle_count + $self->running_count + $self->paused_count + $self->passed_count + $self->blocked_count; + my $run = $self->failed_count; + $self->{'percent_failed'} = calculate_percent_completed($notrun, $run); + return $self->{'percent_failed'}; +} + +sub percent_blocked { + my $self = shift; + my $notrun = $self->idle_count + $self->running_count + $self->paused_count + $self->passed_count + $self->failed_count; + my $run = $self->blocked_count; + $self->{'percent_blocked'} = calculate_percent_completed($notrun, $run); + return $self->{'percent_blocked'}; +} + +sub percent_not_run { + my $self = shift; + my $notrun = $self->failed_count + $self->running_count + $self->paused_count + $self->passed_count; + my $run = $self->idle_count + $self->blocked_count; + $self->{'percent_not_run'} = calculate_percent_completed($notrun, $run); + return $self->{'percent_not_run'}; +} + + +=head2 current_caseruns + +Returns a reference to a list of TestCaseRun objects that are the +current case-runs on this run + +=cut + +sub current_caseruns { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'current_caseruns'} if exists $self->{'current_caseruns'}; + my $ref = $dbh->selectcol_arrayref( + "SELECT case_run_id FROM test_case_runs + WHERE run_id=? AND iscurrent=1", undef, + $self->{'run_id'}); + my @caseruns; + + foreach my $id (@{$ref}){ + push @caseruns, Bugzilla::Testopia::TestCaseRun->new($id); + } + $self->{'current_caseruns'} = \@caseruns; + return $self->{'current_caseruns'}; +} + +=head2 caseruns + +Returns a reference to a list of TestCaseRun objects that belong +to this run + +=cut + +sub caseruns { + my $self = shift; + my $dbh = Bugzilla->dbh; + return $self->{'caseruns'} if exists $self->{'caseruns'}; + my $ref = $dbh->selectcol_arrayref( + "SELECT case_run_id FROM test_case_runs + WHERE run_id=?", undef, $self->{'run_id'}); + my @caseruns; + + foreach my $id (@{$ref}){ + push @caseruns, Bugzilla::Testopia::TestCaseRun->new($id); + } + $self->{'caseruns'} = \@caseruns; + return $self->{'caseruns'}; +} + +=head2 case_id_list + +Returns a list of case_id's from the current case runs. + +=cut + +sub case_id_list { + my $self = shift; + my @ids; + foreach my $c (@{$self->current_caseruns}){ + push @ids, $c->case_id; + } + + return join(",", @ids); +} + +=head1 SEE ALSO + +Testopia::(TestPlan, TestCase, Category, Build, Environment) + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/TestTag.pm b/Bugzilla/Testopia/TestTag.pm new file mode 100644 index 0000000..ad9679b --- /dev/null +++ b/Bugzilla/Testopia/TestTag.pm @@ -0,0 +1,340 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks +=head1 NAME + +Bugzilla::Testopia::TestTag - A Testopia tag + +=head1 DESCRIPTION + +Tags in Testopia are used to classify objects in an intuitive manner. +Tags are user defined strings that can be attached to Test Plans, test +Cases, and Test Runs. They are similar to keywords in Bugzilla but do +not require administrator privileges to create. + +=head1 SYNOPSIS + +use Bugzilla::Testopia::TestTag; + + $tag = Bugzilla::Testopia::TestTag->new($tag_id); + $tag = Bugzilla::Testopia::TestTag->new($tag_hash); + +=cut + +package Bugzilla::Testopia::TestTag; + +use strict; + +use Bugzilla::Util; +use Bugzilla::Error; + +############################### +#### Initialization #### +############################### + +=head1 FIELDS + + tag_id + tag_name + +=cut + +use constant DB_COLUMNS => qw( + tag_id + tag_name + +); + +our $columns = join(", ", DB_COLUMNS); + + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=head2 new + +Instantiates a new TestTag + +=cut + +sub new { + my $invocant = shift; + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + return $self->_init(@_); +} + +=head2 _init + +Private constructor + +=cut + +sub _init { + my $self = shift; + my ($param) = (@_); + my $dbh = Bugzilla->dbh; + + my $id = $param unless (ref $param eq 'HASH'); + my $name = $param unless (ref $param eq 'HASH'); + my $obj; + + if (defined $id && detaint_natural($id)) { + + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns FROM test_tags + WHERE tag_id = ?}, undef, $id); + } elsif ($name){ + $obj = $dbh->selectrow_hashref(qq{ + SELECT $columns FROM test_tags + WHERE tag_name = ?}, undef, $name); + } elsif (ref $param eq 'HASH'){ + $obj = $param; + } else { + ThrowCodeError('bad_arg', + {argument => 'param', + function => 'Testopia::TestTag::_init'}); + } + + return undef unless (defined $obj); + + foreach my $field (keys %$obj) { + $self->{$field} = $obj->{$field}; + } + $self->case_count; + $self->plan_count; + $self->run_count; + return $self; +} + +=head2 check_name + +Checks the supplied name to see if a tag of that name exists. +If it does it returns a TestTag object. Otherwise it returns +undef. + +=cut + +sub check_name { + my $self = shift; + my ($name) = @_; + my $dbh = Bugzilla->dbh; + my ($id) = $dbh->selectrow_array( + "SELECT tag_id FROM test_tags + WHERE tag_name = ?", + undef, lc($name)); + if ($id){ + return Bugzilla::Testopia::TestTag->new($id); + } + else{ + return undef; + } +} + +=head2 store + +Checks if the given tag exists in the database. If so, it returns +that ID. Otherwise it submits the tag to the database and returns +the newly created ID. + +=cut + +sub store { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $key; + $self->{'tag_name'} = trim($self->{'tag_name'}); + $dbh->bz_lock_tables('test_tags WRITE'); + ($key) = $dbh->selectrow_array("SELECT tag_id FROM test_tags + WHERE LOWER(tag_name) = ?", + undef, lc($self->{'tag_name'})); + if ($key) { + $dbh->bz_unlock_tables(); + return $key; + } + $dbh->do("INSERT INTO test_tags ($columns) + VALUES (?,?)", + undef, (undef, $self->{'tag_name'})); + $key = $dbh->bz_last_key( 'test_tags', 'tag_id' ); + $dbh->bz_unlock_tables(); + + $self->{'tag_id'} = $key; + return $key; +} + +=head2 obliterate + +Completely removes a tag from the database. This is the only safe +way to do this. + +=cut + +sub obliterate { + my $self = shift; + my $dbh = Bugzilla->dbh; + $dbh->do("DELETE FROM test_case_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); + $dbh->do("DELETE FROM test_plan_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); + $dbh->do("DELETE FROM test_run_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); + $dbh->do("DELETE FROM test_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); +} + +=head2 case_list + +Returns a comma separated list of case ids associated with this tag + +=cut + +sub case_list { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $list = $dbh->selectcol_arrayref( + "SELECT case_id FROM test_case_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); + return join(",", @{$list}); +} + +=head2 plan_list + +Returns a comma separated list of plan ids associated with this tag + +=cut + +sub plan_list { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $list = $dbh->selectcol_arrayref( + "SELECT plan_id FROM test_plan_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); + return join(",", @{$list}); +} + +=head2 run_list + +Returns a comma separated list of run ids associated with this tag + +=cut + +sub run_list { + my $self = shift; + my $dbh = Bugzilla->dbh; + my $list = $dbh->selectcol_arrayref( + "SELECT run_id FROM test_run_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); + return join(",", @{$list}); +} + +sub candelete { + my $self = shift; + return 0 unless Bugzilla->user->in_group("admin"); +} + +############################### +#### Accessors #### +############################### + +=head1 ACCCESSOR METHODS + +=head2 id + +Returns the tag ID + +=head2 name + +Returns the tag name + +=cut + +sub id { return $_[0]->{'tag_id'}; } +sub name { return $_[0]->{'tag_name'}; } + +=head2 case_count + +Returns a count of the test cases associated with this tag + +=cut + +sub case_count { + my $self = shift; + return $self->{'case_count'} if exists $self->{'case_count'}; + my $dbh = Bugzilla->dbh; + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(tag_id) + FROM test_case_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); + $self->{'case_count'} = $count; + return $self->{'case_count'}; +} + +=head2 plan_count + +Returns a count of the test plans associated with this tag + +=cut + +sub plan_count { + my $self = shift; + return $self->{'plan_count'} if exists $self->{'plan_count'}; + my $dbh = Bugzilla->dbh; + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(tag_id) + FROM test_plan_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); + + $self->{'plan_count'} = $count; + return $self->{'plan_count'}; + +} + +=head2 run_count + +Returns a count of the test runs associated with this tag + +=cut + +sub run_count { + my $self = shift; + return $self->{'run_count'} if exists $self->{'run_count'}; + my $dbh = Bugzilla->dbh; + my ($count) = $dbh->selectrow_array( + "SELECT COUNT(tag_id) + FROM test_run_tags + WHERE tag_id = ?", undef, $self->{'tag_id'}); + $self->{'run_count'} = $count; + return $self->{'run_count'} +} + +=head1 SEE ALSO + +TestPlan TestRun TestCase + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/Util.pm b/Bugzilla/Testopia/Util.pm new file mode 100644 index 0000000..d69eabd --- /dev/null +++ b/Bugzilla/Testopia/Util.pm @@ -0,0 +1,183 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Maciej Maczynski +# Ed Fuentetaja +# Greg Hendricks + +=head1 NAME + +Bugzilla::Testopia::Util + +=head1 DESCRIPTION + +This module contains miscillaneous functions used by Testopia. +It exports all of these functions using Exporter. + +=cut + +package Bugzilla::Testopia::Util; + +use strict; + +use base qw(Exporter); +@Bugzilla::Testopia::Util::EXPORT = qw(get_field_id get_time_stamp + validate_test_id validate_selection + support_server_push + percentage); + +use Bugzilla; +use Bugzilla::Config; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Util; +use Bugzilla::Testopia::TestPlan; + +### Methods ### + +=head2 get_field_id + +Takes a field name and table and returns the fieldid from the +test_fielddefs table. + +=cut + +sub get_field_id { + my ($field, $table) = @_; + my $dbh = Bugzilla->dbh; + + my ($field_id) = $dbh->selectrow_array( + "SELECT fieldid + FROM test_fielddefs + WHERE name = ? AND table_name = ?", + undef, $field, $table); + return $field_id; +} + +=head2 get_time_stamp + +Returns an SQL timestamp + +=cut + +sub get_time_stamp { + my $dbh = Bugzilla->dbh; + my ($timestamp) = $dbh->selectrow_array("SELECT NOW()"); + return $timestamp; +} + +=head2 tc_alias_to_id + +Takes a test case alias and returns the corresponding ID + +=cut + +sub tc_alias_to_id { + my ($alias) = @_; + my $dbh = Bugzilla->dbh; + trick_taint($alias); + return $dbh->selectrow_array( + "SELECT case_id FROM test_cases WHERE alias = ?", undef, $alias); +} + +=head2 validate_test_id + +Takes an ID and a Testopia type and validates it against the database. +In the case of cases it will validate and return an ID from an alias. +Much of this was taken from Bugzilla. This function assumes all tables +in the database are named test_s + +=cut + +sub validate_test_id { + my $dbh = Bugzilla->dbh; + my ($id, $type) = @_; + $id = trim($id); + + # If the ID isn't a number, it might be an alias, so try to convert it. + my $alias = $id; + if (!detaint_natural($id) && $type eq 'case') { + $id = tc_alias_to_id($alias); + $id || ThrowUserError("testopia-invalid-test-id-or-alias", + {'case_id' => $alias}); + } + + # Modify the calling code's original variable to contain the trimmed, + # converted-from-alias ID. + $_[0] = $id; + + # First check that the object exists + my ($res) = $dbh->selectrow_array("SELECT ". $type. "_id FROM test_". $type."s + WHERE ". $type ."_id=?",undef, $id); + + $res + || ThrowUserError("invalid-test-id-non-existent", + {'id' => $alias, 'type' => $type}); + return $res; +} + +=head2 validate_selection + +Checks that the selected option is a valid one + +=cut + +sub validate_selection { + my $dbh = Bugzilla->dbh; + my ($id, $field, $table) = @_; + $id = trim($id); + + # First check that the object exists taint check should have been + # done before calling this function. + my ($res) = $dbh->selectrow_array( + "SELECT $field + FROM $table + WHERE $field = ?", + undef, $id); + + $res + || ThrowUserError("invalid-test-id-non-existent", + {'id' => $id, 'type' => $table}); + return $res; +} + +sub support_server_push { + my ($cgi) = @_; + my $serverpush = + exists $ENV{'HTTP_USER_AGENT'} + && $ENV{'HTTP_USER_AGENT'} =~ /Mozilla.[3-9]/ + && $ENV{'HTTP_USER_AGENT'} !~ /[Cc]ompatible/ + && $ENV{'HTTP_USER_AGENT'} !~ /WebKit/ + && !defined($cgi->param('serverpush')) + || $cgi->param('serverpush'); + + return $serverpush; +} + +sub percentage { + my ($total, $count) = (@_); + return $total == 0 ? 0 : int($count*100/$total); +} + +=head1 AUTHOR + +Greg Hendricks + +=cut + +1; diff --git a/Bugzilla/Testopia/Xml.pm b/Bugzilla/Testopia/Xml.pm new file mode 100644 index 0000000..cbb653d --- /dev/null +++ b/Bugzilla/Testopia/Xml.pm @@ -0,0 +1,676 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): David Koenig + +=head1 NAME + +Bugzilla::Testopia::Xml - Testopia Xml object + +=head1 DESCRIPTION + +This module parsers a XML representation of a Testopia Test Plans, +Test Cases, or Categories and stores them in Testopia if not errors +are detected. + +=head1 SYNOPSIS + +use Bugzilla::Testopia::Xml; + +=cut + +package Bugzilla::Testopia::Xml; +#use fields qw(testplans testcases tags categories builds); + +use strict; +#use base qw(Exporter); + +use Bugzilla::Config; +use Bugzilla::Product; +use Bugzilla::Testopia::Attachment; +use Bugzilla::Testopia::Build; +use Bugzilla::Testopia::Category; +use Bugzilla::Testopia::TestCase; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::TestTag; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::XmlTestCase; +use Bugzilla::User; +use Bugzilla::Util; + +############################### +#### Initialization #### +############################### + +=head1 CONSTANTS + +=over 4 + +=item STRIP_NONE - Do not strip white space from string. + +=item STRIP_LEFT - Strip white space from left side of string. + +=item STRIP_RIGHT - Strip white space from right side of string. + +=item STRIP_BOTH - Strinp white space from left and right side of string. + +=back + +=cut + +use constant AUTOMATIC => "AUTOMATIC"; +use constant BLOCKS => "blocks"; +our $DATABASE_DESCRIPTION = "Database_descripiton"; +our $DATABASE_ID = "Database_id"; +use constant IGNORECASE => 1; +use constant DEPENDSON => "dependson"; +use constant PCDATA => "#PCDATA"; +use constant REQUIRE => "REQUIRE"; +use constant STRIP_NONE => 0; +use constant STRIP_LEFT => 1; +use constant STRIP_RIGHT => 2; +use constant STRIP_BOTH => 3; +our $TESTOPIA_GT = "&testopia_gt;"; +our $TESTOPIA_LT = "&testopia_lt;"; +use constant TESTPLAN_REFERENCE => "testplan_reference"; +our $XML_DESCRIPTION = "Xml_description"; +our $XML_AMP = "&[Aa][Mm][Pp];"; +our $XML_APOS = "&[Aa][Pp][Oo][Ss];"; +our $XML_GT = "&[Gg][Tt];"; +our $XML_LT = "&[Ll][Tt];"; +our $XML_QUOT = "&[Qq][Uu][Oo][Tt];"; + +use constant XMLREFERENCES_FIELDS => "Database_descripiton Database_id Xml_description"; +@Bugzilla::Testopia::Xml::EXPORT = qw($DATABASE_DESCRIPTION $DATABASE_ID $XML_DESCRIPTION); + +use Class::Struct; +# +# The Xml structure is used to keep track of all new Testopia objects being created. +# +struct +( + 'Bugzilla::Testopia::Xml', + { + # Array of attachments read for xml source. + attachments => '@', +#TODO builds => '@', + # Array of categories read from xml source. Categories + categories => '@', + tags => '@', +#TODO testenvironments => '@', + # Array of testcases read from xml source. + testcases => '@', + # Hash of testcase aliases indexed by testcase summary. Used during verfication to + # insure that alias does not exist and that new aliases are used in only one testcase. + testcase_aliases => '%', + # Array of testplans read from xml source. + testplans => '@', + # If true indicates some type of error has occurred processing the XML. Used to prevent + # updating Testopia with contents of current XML. + parse_error => '$', + } +); + +#TODO: Add this to checksetup +use Text::Diff; + + +############################### +#### Methods #### +############################### + +=head1 METHODS + +=over 4 + +=item C + + Description: This method is called for any field that is stored in HTML format. The Testopia + entities are provided to allow users to pass HTML tags. For example, if you want to + store a < in Bold font, the following XML + &testopia_lt;B&testopia_gt;<&testopia_lt;/B&testopia_gt; + is passed to the HTML field as + < + Params: $string - String to convert. + Returns: converted string. + +=cut + +sub entity_replace_testopia +{ + my ($string) = @_; + + return undef if ( ! defined $string ); + + $string =~ s/$TESTOPIA_GT/>/g; + $string =~ s/$TESTOPIA_LT//g; + + return $string; +} + +=pod + +=item C + + Description: This method is called for any field that is not stored in HTML format. The source + is XML so any XML entity will be in the &; format. These entities need to be + converted back to their character representation. + Params: $string - String to convert. + $strip - STRIP_NONE, STRIP_LEFT, STRIP_RIGHT, or STRIP_BOTH. White space stripping + is included because MySQL 5.0.3 retains trailing spaces when values are + stored and retrieved while prior versions stripped the trailing spaces. + Any non HTML field should use STRIP_BOTH to prevent searching issues if the + database was orginally pre MySQL 5.0.3. + Returns: converted string. + +=back + +=cut + +sub entity_replace_xml +{ + my ($string,$strip) = @_; + + return undef if ( ! defined $string ); + + $string =~ s/^\s+// if ( $strip & STRIP_LEFT ); + $string =~ s/\s+$// if ( $strip & STRIP_RIGHT ); + $string =~ s/$XML_GT/>/g; + $string =~ s/$XML_LT/parse_error("TRUE"); +} + +sub parse() +{ + my ($self, $xml, $filename) = @_; + + my $twig = XML::Twig->new( load_DTD => 1, keep_encoding => 1 ); + + if ( defined($xml) ) + { + $twig->parse($xml); + } + elsif ( defined($filename) ) + { + $twig->parsefile($filename); + } + else + { + $self->error("Bugzilla::Testopia::Xml::parse has no XML input source") + } + + my $root = $twig->root; + + # Check for unimplemented tags. + my @twig_builds = $root->children('build'); + $self->error("Support for tags has not been implemented.") if ( $#twig_builds != -1 ); + my @twig_testenvironments = $root->children('testenvironment'); + $self->error("Support for tags has not been implemented.") if ( $#twig_testenvironments != -1 ); + my @twig_testruns = $root->children('testrun'); + $self->error("Support for tags has not been implemented.") if ( $#twig_testruns != -1 ); + my @twig_testrunlogs = $root->children('testrunlog'); + $self->error("Support for tags has not been implemented.") if ( $#twig_testrunlogs != -1 ); + + foreach my $twig_category ($root->children('category')) + { + my $category_name = entity_replace_xml($twig_category->field('name'),STRIP_BOTH); + my $product_name = entity_replace_xml($twig_category->att('product'),STRIP_BOTH); + my $description = entity_replace_xml($twig_category->field('description'),STRIP_BOTH); + if ( $category_name eq "" ) + { + $self->error("Category name cannot be empty, product='" . $product_name . "', description='" . $description . "'."); + next; + } + + $description = "FIX ME. Created during category import with no description supplied." if ( $description eq "" ); + + if ( $product_name eq REQUIRE ) + { + $self->error("Must supply a product for category '" . $category_name . "'." ); + next; + } + + my $product = new Bugzilla::Product({name => $product_name}); + if ( ! $product ) + { + $self->error("Cannot find product '" . $product_name . "' for category '" . $category_name . "'."); + $self->{"parser_error"} = 1; + next; + } + + my $category = new Bugzilla::Testopia::Category + ({ + name => $category_name, + product_id => $product->id(), + description => $description, + }); + + # Only create the category if it does not exist. + push @{$self->categories}, $category if ( ! $category->check_name($category_name) ); + } + + my $testplan = Bugzilla::Testopia::TestPlan->new({ 'name' => 'dummy' }); + my %plantype_ids; + my @temparray = @{$testplan->get_plan_types()}; + foreach my $arrayelement (@temparray) + { + my %temphash = %{$arrayelement}; + $plantype_ids{$temphash{"name"}} = $temphash{"id"}; + } + + foreach my $twig_testplan ($root->children('testplan')) + { + my $author = $twig_testplan->att('author'); + # Bugzilla::User::match returns a array with a user hash. Fields of the hash needed + # are 'id' and 'login'. + my $author_ref = Bugzilla::User::match($author, 1, 0); + my $author_id = -1; + if ( ! $author_ref->[0] ) + { + $self->error("Cannot find author '" . $author . "' in test plan '" . $twig_testplan->field('name') . "'."); + } + else + { + my $author_user = $author_ref->[0]; + bless($author_user,"Bugzilla::User"); + $author_id = $author_user->id(); + } + + my $product_id = Bugzilla::Testopia::TestPlan::lookup_product_by_name($twig_testplan->field('product')); + if ( ! defined($product_id) ) + { + $self->error("Cannot find product '" . $twig_testplan->field('product') . "' in test plan '" . $twig_testplan->field('name') . "'."); + } + + my $name = entity_replace_xml($twig_testplan->field('name'),STRIP_BOTH) || undef; + $self->error("Found empty Test Plan name.") if ( ! defined($name) ); + $self->error("Length of Test Plan name '" . $name . "' must be " . Bugzilla::Testopia::TestPlan->NAME_MAX_LENGTH . " characters or less.") if ( defined($name) && ( length($name) > Bugzilla::Testopia::TestPlan->NAME_MAX_LENGTH ) ); + + $testplan = Bugzilla::Testopia::TestPlan->new({ + 'name' => $name, + 'product_id' => $product_id, + 'default_product_version' => entity_replace_xml($twig_testplan->field('productversion'),STRIP_BOTH), + 'type_id' => $plantype_ids{$twig_testplan->att('type')}, + 'text' => entity_replace_testopia($twig_testplan->field('document')), + 'author_id' => $author_id, + 'isactive' => entity_replace_xml($twig_testplan->field('archive'),STRIP_BOTH), + 'creation_date' => entity_replace_xml($twig_testplan->field('created'),STRIP_BOTH) + }); + push @{$self->testplans}, $testplan; + + my @tags = $twig_testplan->children('tag'); + foreach my $twig_tag (@tags) + { + push @{$self->tags}, entity_replace_xml($twig_tag->text(),STRIP_BOTH); + } + + my @attachments = $twig_testplan->children('attachment'); + foreach my $twig_attachments (@attachments) + { + my $submitter = $twig_attachments->field('submitter'); + # Bugzilla::User::match returns a array with a user hash. Fields of the hash needed + # are 'id' and 'login'. + my $submitter_ref = Bugzilla::User::match($submitter, 1, 0); + my $submitter_id = -1; + if ( ! $submitter_ref->[0] ) + { + $self->error("Cannot find submitter '" . $submitter . "' in test plan '" . $twig_testplan->field('name') . "' attachment '" . $twig_attachments->field('description') . "'."); + } + else + { + my $submitter_user = $submitter_ref->[0]; + bless($submitter_user,"Bugzilla::User"); + $submitter_id = $submitter_user->id(); + } + my $attachment = Bugzilla::Testopia::Attachment->new({ + 'description' => entity_replace_xml($twig_attachments->field('description'),STRIP_BOTH), + 'filename' => entity_replace_xml($twig_attachments->field('filename'),STRIP_BOTH), + 'submitter_id' => $submitter_id, + 'mime_type' => entity_replace_xml($twig_attachments->field('mimetype'),STRIP_BOTH), + 'contents' => entity_replace_xml($twig_attachments->field('data'),STRIP_BOTH) + }); + push @{$self->attachments}, $attachment; + } + } + + my $testcase = Bugzilla::Testopia::TestCase->new({ 'name' => 'dummy' }); + my %priority_ids; + @temparray = @{$testcase->get_priority_list()}; + foreach my $arrayelement (@temparray) + { + my %temphash = %{$arrayelement}; + my $longname = $temphash{"name"}; + # The long name. "P1 - Urgent" + $priority_ids{$longname} = $temphash{"id"}; + # The short name. "P1" + my $shortname = $longname; + $shortname =~ s/ - .*//; + $priority_ids{$shortname} = $temphash{"id"} if ( $longname ne $shortname ); + } + foreach my $twig_testcase ($root->children('testcase')) + { + my $summary = entity_replace_xml($twig_testcase->field('summary'),STRIP_BOTH) || undef; + $self->error("Found empty Test Case summary.") if ( ! defined($summary) ); + $self->error("Length of summary '" . $summary . "' must be " . Bugzilla::Testopia::TestCase->SUMMARY_MAX_LENGTH . " characters or less.") if ( defined($summary) && ( length($summary) > Bugzilla::Testopia::TestCase->SUMMARY_MAX_LENGTH ) ); + my $author = $twig_testcase->att('author'); + # Bugzilla::User::match returns a array with a user hash. Fields of the hash needed + # are 'id' and 'login'. + my $author_ref = Bugzilla::User::match($author, 1, 0); + my $author_id = -1; + if ( ! $author_ref->[0] ) + { + $self->error("Cannot find author '" . $author . "' in test case '" . $summary . "'."); + } + else + { + my $author_user = $author_ref->[0]; + bless($author_user,"Bugzilla::User"); + $author_id = $author_user->id(); + } + my $tester = entity_replace_xml($twig_testcase->field('defaulttester'),STRIP_BOTH); + # Bugzilla::User::match returns a array with a user hash. Fields of the hash needed + # are 'id' and 'login'. + my $tester_ref = Bugzilla::User::match($tester, 1, 0); + my $tester_id = -1; + if ( ! $tester_ref->[0] ) + { + $self->error("Cannot find default tester '" . $tester . "' in test case '" . $summary . "'."); + } + else + { + my $tester_user = $tester_ref->[0]; + bless($tester_user,"Bugzilla::User"); + $tester_id = $tester_user->id(); + } + my $status_id = Bugzilla::Testopia::TestCase::lookup_status_by_name($twig_testcase->att('status')); + $self->error("Cannot find status '" . $twig_testcase->att('status') . "' in test case '" . $summary . "'.") if ( ! defined($status_id) ); + + my $xml_testcase = new Bugzilla::Testopia::XmlTestCase; + $xml_testcase->blocks(Bugzilla::Testopia::XmlReferences->new(IGNORECASE, XMLREFERENCES_FIELDS)); + $xml_testcase->dependson(Bugzilla::Testopia::XmlReferences->new(IGNORECASE, XMLREFERENCES_FIELDS)); + $xml_testcase->testplan(Bugzilla::Testopia::XmlReferences->new(IGNORECASE, XMLREFERENCES_FIELDS)); + push @{$self->testcases}, $xml_testcase; + my $alias = entity_replace_xml($twig_testcase->field('alias'),STRIP_BOTH) || undef; + $self->error("Length of alias '" . $alias . "' in test case '" . $summary . "' must be " . Bugzilla::Testopia::TestCase->ALIAS_MAX_LENGTH . " characters or less.") if ( defined($alias) && ( length($alias) > Bugzilla::Testopia::TestCase->ALIAS_MAX_LENGTH ) ); + my $requirement = entity_replace_xml($twig_testcase->field('requirement'),STRIP_BOTH) || undef; + $self->error("Length of requirement '" . $requirement . "' in test case '" . $summary . "' must be " . Bugzilla::Testopia::TestCase->REQUIREMENT_MAX_LENGTH . " characters or less.") if ( defined($requirement) && ( length($requirement) > Bugzilla::Testopia::TestCase->REQUIREMENT_MAX_LENGTH ) ); + + $xml_testcase->testcase(Bugzilla::Testopia::TestCase->new({ + 'action' => entity_replace_testopia($twig_testcase->field('action')), + 'alias' => $alias, + 'arguments' => entity_replace_xml($twig_testcase->field('arguments'),STRIP_NONE), + 'author_id' => $author_id, + 'blocks' => undef, + 'breakdown' => entity_replace_testopia($twig_testcase->field('breakdown')), + 'case_status_id' => $status_id, + 'category_id' => undef, + 'default_tester_id' => $tester_id, + 'dependson' => undef, + 'effect' => entity_replace_testopia($twig_testcase->field('expectedresults')), + 'isautomated' => ( uc $twig_testcase->att('automated') ) eq AUTOMATIC, + 'plans' => undef, + 'priority_id' => $priority_ids{$twig_testcase->att('priority')}, + 'requirement' => $requirement, + 'setup' => entity_replace_testopia($twig_testcase->field('setup')), + 'script' => entity_replace_xml($twig_testcase->field('script'),STRIP_NONE), + 'summary' => $summary, + })); + foreach my $twig_testplan_reference ( $twig_testcase->children(TESTPLAN_REFERENCE) ) + { + my $testplan_reference = $twig_testplan_reference->children_text(PCDATA); + if ( $testplan_reference eq "" ) + { + $self->error("No test plan included for type '" + . $twig_testplan_reference->att('type') + . "' in test case '" . $twig_testcase->field('summary') . "'." ); + } + elsif ( length($testplan_reference) > Bugzilla::Testopia::TestPlan->NAME_MAX_LENGTH ) + { + $self->error("Length of Test Plan name '" . $testplan_reference . "' for test case '" . $summary . "' must be " . Bugzilla::Testopia::TestCase->REQUIREMENT_MAX_LENGTH . " characters or less."); + } + elsif ( ! $xml_testcase->testplan->add($twig_testplan_reference->att('type'),entity_replace_xml($testplan_reference,STRIP_BOTH)) ) + { + $self->error("Do not know how to handle test plan of type '" + . $twig_testplan_reference->att('type') + . "' in test case '" . $twig_testcase->field('summary') . "'." + . "\nKnow types are: (" . uc XMLREFERENCES_FIELDS . ")."); + } + } + # Keep track of this testcase's alias. Used during verification to insure aliases are unique. + $self->testcase_aliases(entity_replace_xml($twig_testcase->field('summary'),STRIP_BOTH),$alias) if ( defined $alias ); + # Keep track of this testcase's category. To create a category at this time would require + # getting the product from the Test Plan that this Test Case is associated with. The category + # will created when each Test Case is stored. + my $categoryname = entity_replace_xml($twig_testcase->field('categoryname'),STRIP_BOTH); + if ( $categoryname ne "" ) + { + $xml_testcase->category($categoryname); + } + else + { + $self->error("Empty category name for test case '" . $summary . "'."); + } + + my @attachments = $twig_testcase->children('attachment'); + foreach my $twig_attachments (@attachments) + { + my $submitter = $twig_attachments->field('submitter'); + # Bugzilla::User::match returns a array with a user hash. Fields of the hash needed + # are 'id' and 'login'. + my $submitter_ref = Bugzilla::User::match($submitter, 1, 0); + my $submitter_id = -1; + if ( ! $submitter_ref->[0] ) + { + $self->error("Cannot find submitter '" . $submitter . "' in test case '" . $twig_testcase->field('summary') . "' attachment '" . $twig_attachments->field('description') . "'."); + } + else + { + my $submitter_user = $submitter_ref->[0]; + bless($submitter_user,"Bugzilla::User"); + $submitter_id = $submitter_user->id(); + } + my $attachment = Bugzilla::Testopia::Attachment->new({ + 'description' => entity_replace_xml($twig_attachments->field('description'),STRIP_BOTH), + 'filename' => entity_replace_xml($twig_attachments->field('filename'),STRIP_BOTH), + 'submitter_id' => $submitter_id, + 'mime_type' => entity_replace_xml($twig_attachments->field('mimetype'),STRIP_BOTH), + 'contents' => entity_replace_xml($twig_attachments->field('data'),STRIP_BOTH) + }); + $xml_testcase->add_attachment($attachment); + } + + my @tags = $twig_testcase->children('tag'); + foreach my $twig_tag ( @tags ) + { + my $tag = entity_replace_xml($twig_tag->text(),STRIP_BOTH); + $self->error("Length of tag '" . $tag . "' in test case '" . $summary . "' must be " . Bugzilla::Testopia::TestCase->TAG_MAX_LENGTH . " characters or less.") if ( defined($tag) && ( length($tag) > Bugzilla::Testopia::TestCase->TAG_MAX_LENGTH ) ); + $xml_testcase->add_tag($tag); + } + + my @components = $twig_testcase->children('component'); + foreach my $twig_component ( @components ) + { + my $results = $xml_testcase->add_component(entity_replace_xml($twig_component->children_text(PCDATA),STRIP_BOTH),$twig_component->att('product')); + $self->error($results) if ( $results ne "" ); + } + + foreach my $twig_blocks ( $twig_testcase->children(BLOCKS) ) + { + if ( ! $xml_testcase->blocks->add($twig_blocks->att('type'),entity_replace_xml($twig_blocks->children_text(PCDATA),STRIP_BOTH)) ) + { + $self->error("Do not know how to handle a blocking test case of type '" . $twig_blocks->att('type') . "' in test case '" . $xml_testcase->testcase->summary() . "'.") + } + } + + foreach my $twig_dependson ( $twig_testcase->children(DEPENDSON) ) + { + if ( ! $xml_testcase->dependson->add($twig_dependson->att('type'),entity_replace_xml($twig_dependson->children_text(PCDATA),STRIP_BOTH)) ) + { + $self->error("Do not know how to handle dependency of type '" . $twig_dependson->att('type') . "' in test case '" . entity_replace_xml($xml_testcase->testcase->summary(),STRIP_BOTH) . "'.") + } + } + } + + # + # Start of data integrity check. + # + # Run through the Test Plans and Test Cases looking for integrity errors. + # + + # Check for duplicate aliases. Loop though all testcases that have a alias. + my %used_alias; + my %duplicate_alias; + foreach my $summary ( keys %{$self->testcase_aliases} ) + { + # Get the alias. + my $alias = $self->testcase_aliases($summary); + # Is the alias used by a testcase in the database already? If so add it to the duplicate list + # and move onto next testcase. + my $alias_testcase_id = Bugzilla::Testopia::TestCase::class_check_alias($alias); + if ( $alias_testcase_id ) + { + $duplicate_alias{$alias} = $alias_testcase_id; + next; + } + # Is the alias in the used_alias array? + if ( defined( $used_alias{$alias} ) ) + { + # If so then another testcase being created also used the alias. Add the alias to the + # duplicate list. + $duplicate_alias{$alias} = "import"; + } + else + { + # Alias has not been seen yet. Add it to the used_alias list to keep track of it. + $used_alias{$alias} = ""; + } + } + # The @duplicate_alias list contains aliases used by more that one test case. Display them and set + # error condition + foreach my $summary ( keys %{$self->testcase_aliases} ) + { + my $alias = $self->testcase_aliases($summary); + if ( exists $duplicate_alias{$alias} ) + { + my $error_message = "Test Case '" . $summary . "' has a non-unique alias '" . $alias . "'."; + if ( $duplicate_alias{$alias} ne "import" ) + { + $error_message .= " Test Case " . $duplicate_alias{$alias} . " already uses the alias '" . $alias . "'."; + } + else + { + $error_message .= " Additional test cases being imported are using the alias '" . $alias . "'."; + } + $self->error($error_message); + } + } + + # + # Start of data store. + # + # No data has been written prior to this point. If parse_error has not been set the XML is valid + # and no integrity errors were found. It's time to start storing the Test Plans and Test Cases. + # + + if ( ! defined $self->parse_error ) + { + # Store new categories. + foreach my $category ( @{$self->categories} ) + { + # Make sure category still does not exist. We don't check for uniqueness above so + # the same category could be defined multiple times. + if ( ! $category->check_name($category->name()) ) + { + $category->store(); + my $product_name = Bugzilla::Testopia::Product->new($category->product_id())->name(); + print "Created category '" . $category->name() . "': " . $category->description() . " for product " . $product_name . ".\n"; + } + } + + # Store new testplans. + foreach my $testplan ( @{$self->testplans} ) + { + my $plan_id = $testplan->store(); + $testplan->{'plan_id'} = $plan_id; + foreach my $asciitag ( @{$self->tags} ) + { + my $classtag = Bugzilla::Testopia::TestTag->new({'tag_name' => $asciitag}); + my $tagid = $classtag->store; + $testplan->{'tag_id'} = $tagid; + $testplan->add_tag($tagid); + } + foreach my $attachment ( @{$self->attachments} ) + { + $attachment->{'plan_id'} = $plan_id; + $attachment->store(); + } + print "Created Test Plan $plan_id: " . $testplan->name() . "\n"; + } + + # Store new testcases. + foreach my $testcase ( @{$self->testcases} ) + { + bless($testcase,"Bugzilla::Testopia::XmlTestCase"); + my $result = $testcase->store(@{$self->testplans}); + if ( $result ne "" ) + { + $self->error($result); + } + else + { + print "Created Test Case " . $testcase->testcase->id() . ": " . $testcase->testcase->summary() . "\n"; + } + } + + # Now that each testcase has been stored we loop though them again and create + # relationships like blocks or dependson. + foreach my $testcase ( @{$self->testcases} ) + { + $testcase->store_relationships(@{$self->testcases}); + } + } + + $twig->purge; +} + +=head1 SEE ALSO + +Testopia::(TestPlan, TestCase, TestRun, Category, Build, Environment) + +=head1 AUTHOR + +David Koenig + +=cut + +1; diff --git a/Bugzilla/Testopia/XmlReferences.pm b/Bugzilla/Testopia/XmlReferences.pm new file mode 100644 index 0000000..006eee6 --- /dev/null +++ b/Bugzilla/Testopia/XmlReferences.pm @@ -0,0 +1,101 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): David Koenig + +=head1 NAME + +Bugzilla::Testopia::XmlReferences - Testopia XmlReferences object + +=head1 DESCRIPTION + +This module maintains references to objects while the XML data is +being imported. Test plans and Test cases can be referenced by +database id, database description or XML description. The references +are stored here and processed as needed. + +=head1 SYNOPSIS + +use Bugzilla::Testopia::XmlReferences; + + +=cut + +package Bugzilla::Testopia::XmlReferences; + +use constant IGNORECASE => "ignorecase"; + +#use strict; + +sub new +{ + my ($invocant,$ignorecase,$fields) = @_; + + my $class = ref($invocant) || $invocant; + my $self = {}; + bless($self, $class); + $self{IGNORECASE} = $ignorecase; + for my $field ( split(/ /, $fields) ) + { + $field = uc $field if ( $self{IGNORECASE} ); + $self->{$field} = []; + } + return $self; +} + +sub add +{ + my ($self, $type, $object) = @_; + + $type = uc $type if ( $self{IGNORECASE} ); + + return 0 if ( ! exists $self->{$type} ); + + push @{$self->{$type}}, $object; +} + +sub display +{ + my ($self) = @_; + + print "display() self=" . $self . "\n"; + foreach $key (keys %$self) + { + if ( defined $self->{$key} ) + { + print "display() key=$key value=" . $self->{$key} . "\n"; + } + else + { + print "display() key=$key value=undefined\n"; + } + } +} + +sub get +{ + my ($self, $type) = @_; + + $type = uc $type if ( $self{IGNORECASE} ); + + return 0 if ( ! exists $self->{$type} ); + + return $self->{$type}; +} + +1; diff --git a/Bugzilla/Testopia/XmlTestCase.pm b/Bugzilla/Testopia/XmlTestCase.pm new file mode 100644 index 0000000..81dc42f --- /dev/null +++ b/Bugzilla/Testopia/XmlTestCase.pm @@ -0,0 +1,409 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): David Koenig + +=head1 NAME + +Bugzilla::Testopia::XmlTestCase - Testopia XmlTestCase object + +=head1 DESCRIPTION + +This module parsers a XML representation of a Testopia test plan, +test case, test environment, category or build and returns Testopia +objects re + +=head1 SYNOPSIS + +use Bugzilla::Testopia::XmlTestCase; + +=cut + +package Bugzilla::Testopia::XmlTestCase; +#use fields qw(testplans testcases tags categories builds); + +use strict; + +use Bugzilla::Product; +use Bugzilla::Testopia::Attachment; +use Bugzilla::Testopia::Build; +use Bugzilla::Testopia::Category; +use Bugzilla::Testopia::TestCase; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::TestTag; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::XmlReferences; +use Bugzilla::Testopia::Product; +use Bugzilla::User; +use Bugzilla::Util; + +use Class::Struct; +# +# The XmlTestCase structure stores data for the verfication processing. The database is not updated +# until a verfication pass is made through the XML data. Some of the TestCase class references are +# database references that will not be valid until the class has been stored in the database. This +# structure stores these references to be used during verfication and writting to the database. +# +struct +( + 'Bugzilla::Testopia::XmlTestCase', + { + attachments => '@', + blocks => 'Bugzilla::Testopia::XmlReferences', + category => '$', + component_ids => '@', + dependson => 'Bugzilla::Testopia::XmlReferences', + tags => '@', + testcase => 'Bugzilla::Testopia::TestCase', + testplan => 'Bugzilla::Testopia::XmlReferences', + } +); + +sub add_attachment() +{ + my ($self,$tag) = @_; + + push @{$self->attachments}, $tag; +} + +sub add_tag() +{ + my ($self,$tag) = @_; + + push @{$self->tags}, $tag; +} + +=head2 get_available_products + +Returns a list of products. This is the same code as Bugzilla::Testopia::TestPlan->get_available_products +without view restrictions. + +=cut + +sub get_available_products { + my $dbh = Bugzilla->dbh; + + my $products = $dbh->selectall_arrayref( + "SELECT id, name + FROM products + ORDER BY name", + {"Slice"=>{}}); + return $products; +} + +sub add_component() +{ + my ($self,$component,$component_product) = @_; + my $component_id = ""; + my $product_id = ""; + + return "Component $component needs to provide a product." if ( $component_product eq "" ); + + # Find the product identifier. + my $products_ref = get_available_products(); + foreach my $product (@$products_ref) + { + if ( $component_product eq $product->{name} ) + { + $product_id = $product->{id}; + last; + } + } + return "Cannot find product $component_product for component $component." if ( $product_id eq "" ); + + # Find the component identifier for the product's componet + my $product = Bugzilla::Testopia::Product->new($product_id); + my $components_ref = $product->components; + foreach my $product_component ( @$components_ref ) + { + if ( $component eq $product_component->name ) + { + $component_id = $product_component->id; + last; + } + } + return "Product $component_product does not have a component named $component." if ( $component_id eq "" ); + + # Save the component identifier for this Test Case. + push @{$self->component_ids}, $component_id; + + return ""; +} + +sub debug_display() +{ + my ($self) = @_; + my $display_variable = ""; + + my %text = %{$self->testcase->text()} if ( defined $self->testcase->text() ); + print STDERR "Testcase: " . $self->testcase->summary() . "\n"; + my $testcase_id = "null"; + $testcase_id = $self->testcase->id() if ( $self->testcase->id() ); + print STDERR " ID " . $testcase_id . "\n"; + print STDERR " Action\n"; + if ( defined $text{'action'} ) + { + my @results = split(/\n/,$text{'action'}); + foreach my $result (@results) + { + print STDERR " $result\n"; + } + } + my $alias = "null"; + $alias = $self->testcase-alias() if ( $self->testcase->alias() ); + print STDERR " Alias " . $alias . "\n"; + my %author = %{$self->testcase->author()}; + my $author_id = $author{"id"}; + my $author_login = $author{"login"}; + print STDERR " Author " . $author_login . " (id=" . $author_id . ", hash=" . $self->testcase->author() . ")\n"; + print STDERR " Blocks " . $self->blocks->display() . "\n"; + print STDERR " Category " . $self->category . "\n"; + print STDERR " Depends On " . $self->dependson->display() . "\n"; + print STDERR " Expected Results\n"; + if ( defined $text{'effect'} ) + { + my @results = split(/\n/,$text{'effect'}); + foreach my $result (@results) + { + print STDERR " $result\n"; + } + } + print STDERR " Summary " . $self->testcase->summary() . "\n"; + #TODO:print STDERR " Default Product Version " . $self->testcase->product_version() . "\n"; + #TODO:print STDERR " Document " . $self->testcase->text() . "\n"; + my %tester = %{$self->testcase->default_tester()}; + my $tester_id = $tester{"id"}; + my $tester_login = $tester{"login"}; + print STDERR " Tester " . $tester_login . " (id=" . $tester_id . ", hash=" . $self->testcase->default_tester() . ")\n"; + print STDERR " Is Automated " . $self->testcase->isautomated() . "\n"; + #TODO:print STDERR " Plans " . $self->testcase->plans() . "\n"; + #TODO:print STDERR " Priority " . $self->testcase->priority_id() . "\n"; + #TODO:print STDERR " Product " . $self->testcase->product_id() . "\n"; + print STDERR " Requirement " . $self->testcase->requirement() . "\n"; + + print STDERR " Script " . $self->testcase->script() . "\n"; + print STDERR " Script Arguments " . $self->testcase->arguments() . "\n"; + print STDERR " Status " . $self->testcase->status() . "\n"; + + foreach my $tag (@{$self->tags}) + { + print STDERR " Tag " . $tag . "\n"; + } + + my @attachments = @{$self->testcase->attachments()}; + foreach my $attachment (@attachments) + { + my %submitter = %{$self->testcase->submitter()}; + $author_login = $author{"login"}; + print STDERR " Attachment " . $attachment->description() . "\n"; + print STDERR " Filename " . $attachment->filename() . "\n"; + print STDERR " Mime Type " . $attachment->mime_type(). "\n"; + print STDERR " Submitter " . $author_login . "\n"; + } +} + +sub get_testcase_ids() +{ + my ($self, $field, @new_testcases) = @_; + my $error_message = ""; + + my @testcase_id = @{$self->$field->get(uc $Bugzilla::Testopia::Xml::DATABASE_ID)}; + + foreach my $testcase_summary ( @{$self->$field->get(uc $Bugzilla::Testopia::Xml::XML_DESCRIPTION)} ) + { + foreach my $testcase (@new_testcases) + { + push @testcase_id, $testcase->testcase->id() if ( $testcase->testcase->summary() eq $testcase_summary ); + } + } + + #TODO Testplans using Database_Description + foreach my $testcase_summary ( @{$self->$field->get(uc $Bugzilla::Testopia::Xml::DATABASE_DESCRIPTION)} ) + { + $error_message .= "\n" if ( $error_message ne "" ); + $error_message .= "Have not implemented code for $Bugzilla::Testopia::Xml::DATABASE_DESCRIPTION lookup for blocking test case " . $testcase_summary . "' for Test Case '". $self->testcase->summary . "'."; + } + return $error_message if ( $error_message ne "" ); + + my @return_testcase_id; + foreach my $testcase_id (@testcase_id) + { + my $testcase = Bugzilla::Testopia::TestCase->new($testcase_id); + if ( ! defined($testcase) ) + { + $error_message .= "\n" if ( $error_message ne "" ); + $error_message .= "Could not find blocking Test Case '" . $testcase_id . "' for Test Case '". $self->testcase->summary . "'."; + } + else + { + push @return_testcase_id, $testcase->id(); + } + } + return $error_message if ( $error_message ne "" ); + + return @return_testcase_id; +} + +=head2 store + +Saves a imported Test Case. This method insures that all Test Case attributes not stored +in the Test Case object are created. The attributes include the Test Plan, tags, compoents, +attachments and categories. + +=cut + +sub store() +{ + my ($self, @new_testplans) = @_; + my $error_message = ""; + my @testplan_id = @{$self->testplan->get(uc $Bugzilla::Testopia::Xml::DATABASE_ID)}; + + # If we have any references to test plans from the XML data we need to search the @new_testplans + # array to find the actual test plan id. The new_testplans array contains all test plans created + # from the XML. + # Order of looping does not matter, number of test plans associated to each test case should be small. + foreach my $testplan_name ( @{$self->testplan->get(uc $Bugzilla::Testopia::Xml::XML_DESCRIPTION)} ) + { + foreach my $testplan (@new_testplans) + { + push @testplan_id, $testplan->id() if ( $testplan->name() eq $testplan_name ); + } + } + + #TODO Testplans using Database_Description + foreach my $testplan_name ( @{$self->testplan->get(uc $Bugzilla::Testopia::Xml::DATABASE_DESCRIPTION)} ) + { + $error_message .= "\n" if ( $error_message ne "" ); + $error_message .= "Have not implemented code for $Bugzilla::Testopia::Xml::DATABASE_DESCRIPTION lookup of test plan " . $testplan_name . "' for Test Case '". $self->testcase->summary . "'."; + } + return $error_message if ( $error_message ne "" ); + + # Have to have a testplan to determine valid categories for testcase. + return "Test Case '" . $self->testcase->summary . "' needs a Test Plan." if ( $#testplan_id == -1 ); + + # Verify that each testplan exists. + my @testplan; + foreach my $testplan_id (@testplan_id) + { + my $testplan = Bugzilla::Testopia::TestPlan->new($testplan_id); + if ( ! defined($testplan) ) + { + $error_message .= "\n" if ( $error_message ne "" ); + $error_message .= "Could not find Test Plan '" . $testplan_id . "' for Test Case '". $self->testcase->summary . "'."; + } + else + { + push @testplan, $testplan; + } + } + return $error_message if ( $error_message ne "" ); + + # Verify that each testplan has the testcase's category associated to it. If the category does not + # exist it will be created. + foreach my $testplan (@testplan) + { + my $category = $testplan->product->categories->[0]; + my $categoryid = $category->check_name($self->category) if ( defined($category) ); + if ( ! defined($categoryid) ) + { + my $new_category = Bugzilla::Testopia::Category->new({ + product_id => $testplan->product_id, + name => $self->category, + description => "FIX ME. Created during Test Plan import." + }); + $categoryid = $new_category->store(); + } + $self->testcase->{'category_id'} = $categoryid if ( ! defined($self->testcase->{'category_id'}) ); + } + my $case_id = $self->testcase->store(); + $self->testcase->{'case_id'} = $case_id; + foreach my $attachment ( @{$self->attachments} ) + { + $attachment->{'case_id'} = $case_id; + $attachment->store(); + } + foreach my $asciitag ( @{$self->tags} ) + { + my $classtag = Bugzilla::Testopia::TestTag->new({'tag_name' => $asciitag}); + my $tagid = $classtag->store; + $self->testcase->add_tag($tagid); + } + + # Link the testcase to each of it's testplans. + foreach my $testplan ( @testplan ) + { + $self->testcase->link_plan($testplan->id(),$case_id) + } + + # Code below requires the testplans to be linked into testcases before being run. + foreach my $component_id ( @{$self->component_ids} ) + { + $self->testcase->add_component($component_id); + } + + return $error_message; +} + +=head2 store_relationships + +Save the dependson and blocks relationships between Test Cases. This method can only be +called after the Test Cases being imported have been stored. The dependson and blocks +relationships use the Test Case identifier which is created only after the Test Case has +been stored. + +=cut + +sub store_relationships() +{ + my ($self, @new_testcases) = @_; + + # Hashes are used because the entires in blocks and dependson must be unique. + my %blocks = (); + foreach my $block ( $self->get_testcase_ids("blocks",@new_testcases) ) + { + $blocks{$block}++; + } + my $blocks_size = keys( %blocks ); + my %dependson = (); + foreach my $dependson ( $self->get_testcase_ids("dependson",@new_testcases) ) + { + $dependson{$dependson}++; + } + my $dependson_size = keys( %dependson ); + + + if ( ( $blocks_size > 0 ) || ( $dependson_size > 0 ) ) + { + # Need to add the current blocks and dependson from the Test Case; otherwise, they will + # be removed. + foreach my $block ( split(/ /,$self->testcase->blocked_list_uncached()) ) + { + $blocks{$block}++; + } + foreach my $dependson ( split(/ /,$self->testcase->dependson_list_uncached()) ) + { + $dependson{$dependson}++; + } + my @blocks = keys(%blocks); + my @dependson = keys(%dependson); + $self->testcase->update_deps( join(' ',@dependson ),join(' ',@blocks) ); + } +} + +1; diff --git a/Bugzilla/WebService.pm b/Bugzilla/WebService.pm new file mode 100644 index 0000000..e1b6398 --- /dev/null +++ b/Bugzilla/WebService.pm @@ -0,0 +1,98 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService; + +use strict; +use Bugzilla::Config; +use Bugzilla::WebService::Constants; + +sub fail_unimplemented +{ + my $this = shift; + + die SOAP::Fault + ->faultcode(ERROR_UNIMPLEMENTED) + ->faultstring('Service Unimplemented'); +} + +sub login +{ + my $self = shift; + + # Check for use of iChain first + if (Param('user_verify_class') ne 'iChain') + { + # + # Check for use of Basic Authorization + # + # WARNING - Your must modify your Apache server's configuration + # to allow the HTTP_AUTHORIZATION env parameter to be passed through! + # This requires using the rewrite module. + # + if (defined($ENV{'HTTP_AUTHORIZATION'})) + { + if ($ENV{'HTTP_AUTHORIZATION'} =~ /^Basic +(.*)$/os) + { + # HTTP Basic Authentication + my($login, $password) = split(/:/, MIME::Base64::decode_base64($1), 2); + + my $cgi = Bugzilla->cgi; + $cgi->param("Bugzilla_login", $login); + $cgi->param("Bugzilla_password", $password); + } + } + } + + Bugzilla->login; +} + +sub logout +{ + my $self = shift; + + Bugzilla->logout; +} + +package Bugzilla::WebService::XMLRPC::Transport::HTTP::CGI; + +use strict; +use Bugzilla::WebService::Constants; +eval 'use base qw(XMLRPC::Transport::HTTP::CGI)'; + +sub make_fault +{ + my $self = shift; + + # RPC Fault Code must be an integer + $self->SUPER::make_fault(ERROR_FAULT_SERVER, $_[1]); +} + +sub make_response +{ + my $self = shift; + + $self->SUPER::make_response(@_); + + # XMLRPC::Transport::HTTP::CGI doesn't know about Bugzilla carrying around + # its cookies in Bugzilla::CGI, so we need to copy them over. + foreach (@{Bugzilla->cgi->{'Bugzilla_cookie_list'}}) { + $self->response->headers->push_header('Set-Cookie', $_); + } +} + +1; \ No newline at end of file diff --git a/Bugzilla/WebService/Component.pm b/Bugzilla/WebService/Component.pm new file mode 100644 index 0000000..9082d37 --- /dev/null +++ b/Bugzilla/WebService/Component.pm @@ -0,0 +1,41 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService::Component; + +use strict; + +use Bugzilla; + +use base qw(Bugzilla::WebService); + +sub get +{ + my $self = shift; + my ($component_id) = @_; + + $self->login; + + my $component = new Bugzilla::Component($component_id); + + $self->logout; + + # Result is component hash map on success + return $component; +} + +1; \ No newline at end of file diff --git a/Bugzilla/WebService/Constants.pm b/Bugzilla/WebService/Constants.pm new file mode 100644 index 0000000..df86986 --- /dev/null +++ b/Bugzilla/WebService/Constants.pm @@ -0,0 +1,36 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann + +package Bugzilla::WebService::Constants; + +use strict; +use base qw(Exporter); + +@Bugzilla::WebService::Constants::EXPORT = qw( + ERROR_AUTH_NODATA + ERROR_UNIMPLEMENTED + ERROR_GENERAL + ERROR_FAULT_SERVER +); + +use constant ERROR_AUTH_NODATA => 410; +use constant ERROR_UNIMPLEMENTED => 910; +use constant ERROR_GENERAL => 999; + +# RPC Fault Code must be an integer +use constant ERROR_FAULT_SERVER => 998; + +1; \ No newline at end of file diff --git a/Bugzilla/WebService/Testopia/Build.pm b/Bugzilla/WebService/Testopia/Build.pm new file mode 100644 index 0000000..e9f66fd --- /dev/null +++ b/Bugzilla/WebService/Testopia/Build.pm @@ -0,0 +1,154 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService::Testopia::Build; + +use strict; + +use base qw(Bugzilla::WebService); + +use Bugzilla::Testopia::Build; + +sub get +{ + my $self = shift; + my ($build_id) = @_; + + $self->login; + + #Result is a test plan hash map + my $build = new Bugzilla::Testopia::Build($build_id); + + if (not defined $build) + { + $self->logout; + die "Build, " . $build_id . ", not found"; + } + + $self->logout; + + return $build; +} + +sub create +{ + my $self = shift; + my ($new_values) = @_; # Required: name, product_id + + $self->login; + + my $build = new Bugzilla::Testopia::Build($new_values); + + my $name = $$new_values{name}; + + if (defined($name) && $build->check_name($name)) + { + die "Build name, " . $name . ", already exists"; + } + + my $result = $build->store(); + + $self->logout; + + # Result is new build id + return $result; +} + +sub update +{ + my $self =shift; + my ($build_id, $new_values) = @_; # Modifiable: name, description, milestone + + $self->login; + + my $build = new Bugzilla::Testopia::Build($build_id); + + if (not defined $build) + { + $self->logout; + die "Build, " . $build_id . ", not found"; + } + + my $name = $$new_values{name}; + + if (defined($name) && $build->check_name($name)) + { + die "Build name, " . $name . ", already exists"; + } + + if (!defined($name)) + { + $name = $build->name(); + } + + my $description = (defined($$new_values{description}) ? $$new_values{description} : $build->description()); + + my $milestone = (defined($$new_values{milestone}) ? $$new_values{milestone} : $build->milestone()); + + my $result = $build->update($name, + $description, + $milestone); + + $build = new Bugzilla::Testopia::Build($build_id); + + $self->logout; + + # Result is modified build, otherwise an exception will be thrown + return $build; +} + +sub lookup_name_by_id +{ + my $self = shift; + my ($build_id) = @_; + + die "Invalid Build ID" + unless defined $build_id && length($build_id) > 0 && $build_id > 0; + + $self->login; + + my $build = new Bugzilla::Testopia::Build($build_id); + + my $result = defined $build ? $build->name : ''; + + $self->logout; + + # Result is build name string or empty string if failed + return $result; +} + +sub lookup_id_by_name +{ + my $self = shift; + my ($name) = @_; + + $self->login; + + my $result = Bugzilla::Testopia::Build->check_build_by_name($name); + + $self->logout; + + if (!defined $result) + { + $result = 0; + } + + # Result is build id or 0 if failed + return $result; +} + +1; \ No newline at end of file diff --git a/Bugzilla/WebService/Testopia/Environment.pm b/Bugzilla/WebService/Testopia/Environment.pm new file mode 100644 index 0000000..8bbcc08 --- /dev/null +++ b/Bugzilla/WebService/Testopia/Environment.pm @@ -0,0 +1,171 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService::Testopia::Environment; + +use strict; + +use base qw(Bugzilla::WebService); + +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; + +# Utility method called by the list method +sub _list +{ + my ($query) = @_; + + my $cgi = Bugzilla->cgi; + + $cgi->param("current_tab", "environment"); + + foreach (keys(%$query)) + { + $cgi->param($_, $$query{$_}); + } + + my $search = Bugzilla::Testopia::Search->new($cgi); + + # Result is an array of environment hash maps + return Bugzilla::Testopia::Table->new('environment', + 'tr_xmlrpc.cgi', + $cgi, + undef, + $search->query() + )->list(); +} + +sub get +{ + my $self = shift; + my ($environment_id) = @_; + + $self->login; + + #Result is a environment hash map + my $environment = new Bugzilla::Testopia::Environment($environment_id); + + if (not defined $environment) + { + $self->logout; + die "Environment, " . $environment_id . ", not found"; + } + + if (not $environment->canview) + { + $self->logout; + die "User Not Authorized"; + } + + $self->logout; + + return $environment; +} + +sub list +{ + my $self = shift; + my ($query) = @_; + + $self->login; + + my $list = _list($query); + + $self->logout; + + return $list; +} + +sub create +{ + my $self =shift; + my ($new_values) = @_; + + $self->login; + + my $environment = new Bugzilla::Testopia::Environment($new_values); + + my $result = $environment->store(); + + $self->logout; + + # Result is new environment id + return $result; +} + +sub update +{ + my $self =shift; + my ($environment_id, $new_values) = @_; + + $self->login; + + my $environment = new Bugzilla::Testopia::Environment($environment_id); + + if (not defined $environment) + { + $self->logout; + die "Environment, " . $environment_id . ", not found"; + } + + if (not $environment->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $environment->update($new_values); + + $environment = new Bugzilla::Testopia::Environment($environment_id); + + $self->logout; + + # Result is modified environment, otherwise an exception will be thrown + return $environment; +} + +sub get_runs +{ + my $self = shift; + my ($environment_id) = @_; + + $self->login; + + my $environment = new Bugzilla::Testopia::Environment($environment_id); + + if (not defined $environment) + { + $self->logout; + die "Environment, " . $environment_id . ", not found"; + } + + if (not $environment->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $environment->runs(); + + $self->logout; + + # Result is list of test runs for the given environment + return $result; +} + +1; \ No newline at end of file diff --git a/Bugzilla/WebService/Testopia/Product.pm b/Bugzilla/WebService/Testopia/Product.pm new file mode 100644 index 0000000..83afe98 --- /dev/null +++ b/Bugzilla/WebService/Testopia/Product.pm @@ -0,0 +1,83 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService::Testopia::Product; + +use strict; + +use base qw(Bugzilla::WebService); + +use Bugzilla::Testopia::Product; + +sub lookup_name_by_id +{ + my $self = shift; + my ($product_id) = @_; + + die "Invalid Product ID" + unless defined $product_id && length($product_id) > 0 && $product_id > 0; + + $self->login; + + my $product = new Bugzilla::Testopia::Product($product_id); + + my $result = defined $product ? $product->name : ''; + + $self->logout; + + # Result is product name string or empty string if failed + return $result; +} + +sub lookup_id_by_name +{ + my $self = shift; + my ($name) = @_; + + $self->login; + + my $result = Bugzilla::Testopia::Product->check_product_by_name($name); + + $self->logout; + + if (!defined $result) + { + $result = 0; + } + + # Result is product id or 0 if failed + return $result; +} + +#sub get_product +#{ +# my $self = shift; +# my ($product_id) = @_; +# +# Bugzilla->login; +# +# # We can detaint immediately if what we get passed is fully numeric. +# # We leave bug alias checks to Bugzilla::Testopia::TestPlan::new. +# +# if ($product_id =~ /^[0-9]+$/) { +# detaint_natural($product_id); +# } +# +# return new Bugzilla::Product($product_id); +#} + +1; \ No newline at end of file diff --git a/Bugzilla/WebService/Testopia/TestCase.pm b/Bugzilla/WebService/Testopia/TestCase.pm new file mode 100644 index 0000000..af58a9e --- /dev/null +++ b/Bugzilla/WebService/Testopia/TestCase.pm @@ -0,0 +1,617 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService::Testopia::TestCase; + +use strict; +use base qw(Bugzilla::WebService); +use Bugzilla::User; +use Bugzilla::Testopia::TestCase; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; + +# Utility method called by the list method +sub _list +{ + my ($query) = @_; + + my $cgi = Bugzilla->cgi; + + $cgi->param("current_tab", "case"); + + foreach (keys(%$query)) + { + $cgi->param($_, $$query{$_}); + } + + my $search = Bugzilla::Testopia::Search->new($cgi); + + # Result is an array of test plan hash maps + return Bugzilla::Testopia::Table->new('case', + 'tr_xmlrpc.cgi', + $cgi, + undef, + $search->query() + )->list(); +} + +sub get +{ + my $self = shift; + my ($test_case_id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canview) + { + $self->logout; + die "User Not Authorized"; + } + + $self->logout; + + #Result is a test case hash map + return $test_case; +} + +sub list +{ + my $self = shift; + my ($query) = @_; + + $self->login; + + my $list = _list($query); + + $self->logout; + + return $list; +} + +sub create +{ + my $self =shift; + my ($new_values) = @_; + + if (not defined $$new_values{plan_id}) + { + die "Plan ID Number (plan_id) Required When Creating A TestCase" + } + + # Plan id linked to new test case after store method is called + my $plan_id = $$new_values{plan_id}; + + # Remove plan id from new_values hash + delete $$new_values{plan_id}; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($new_values); + + # Result is test plan id + my $result = $test_case->store(); + + $test_case->link_plan($plan_id, $result); + + $self->logout; + + return $result +} + +sub update +{ + my $self =shift; + my ($test_case_id, $new_values) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + if (defined $$new_values{author_id}) + { + die "Update of TestCase's author_id is not allowed"; + } + + my $result = $test_case->update($new_values); + + $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + $self->logout; + + # Result is modified test case on success, otherwise an exception will be thrown + return $test_case; +} + +sub get_text +{ + my $self =shift; + my ($test_case_id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $doc = $test_case->text(); + + $self->logout; + + #Result is the latest test case doc hash map + return $doc; +} + +sub store_text +{ + my $self =shift; + my ($test_case_id, $author_id, $action, $effect, $setup, $breakdown) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $version = $test_case->store_text($test_case_id, $author_id, $action, $effect, $setup, $breakdown); + + $self->logout; + + # Result is new test case doc version on success, otherwise an exception will be thrown + return $version; +} + +sub get_plans +{ + my $self = shift; + my ($test_case_id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_case->plans(); + + $self->logout; + + # Result is list of test plans for the given test case + return $result; +} + +sub add_component +{ + my $self =shift; + my ($test_case_id, $component_id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_case->add_component($component_id); + + $self->logout; + + # Result 0 on success, otherwise an exception will be thrown + return 0; +} + +sub remove_component +{ + my $self =shift; + my ($test_case_id, $component_id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_case->remove_component($component_id); + + $self->logout; + + # Result 0 on success, otherwise an exception will be thrown + return 0; +} + +sub get_components +{ + my $self =shift; + my ($test_case_id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_case->components(); + + $self->logout; + + # Result list of components otherwise an exception will be thrown + return $result; +} + +sub add_tag +{ + my $self =shift; + my ($test_case_id, $tag_name) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + #Create new tag or retrieve id of existing tag + my $test_tag = new Bugzilla::Testopia::TestTag({tag_name=>$tag_name}); + my $tag_id = $test_tag->store; + + my $result = $test_case->add_tag($tag_id); + + if ($result == 1) + { + $self->logout; + die "Tag, " . $tag_name . ", already exists for Testcase, " . $test_case_id; + } + + $self->logout; + + # Result 0 on success, otherwise an exception will be thrown + return $result; +} + +sub remove_tag +{ + my $self =shift; + my ($test_case_id, $tag_name) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $test_tag = Bugzilla::Testopia::TestTag->check_name($tag_name); + if (not defined $test_tag) + { + $self->logout; + die "Tag, " . $tag_name . ", does not exist"; + } + + my $result = $test_case->remove_tag($test_tag->id); + + $self->logout; + + # Result 0 on success, otherwise an exception will be thrown + return 0; +} + +sub get_tags +{ + my $self =shift; + my ($test_case_id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_case->tags; + + $self->logout; + + # Result list of tags otherwise an exception will be thrown + return $result; +} + +sub lookup_status_id_by_name +{ + my $self =shift; + my ($name) = @_; + + $self->login; + + my $result = Bugzilla::Testopia::TestCase::lookup_status_by_name($name); + + $self->logout; + + # Result is test case status id for the given test case status name + return $result; +} + +sub lookup_status_name_by_id +{ + my $self =shift; + my ($id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase({}); + + my $result = $test_case->lookup_status($id); + + $self->logout; + + if (!defined $result) + { + $result = 0; + }; + + # Result is test case status name for the given test case status id + return $result; +} + +sub lookup_category_id_by_name +{ + my $self =shift; + my ($name) = @_; + + $self->login; + + my $result = Bugzilla::Testopia::TestCase::lookup_category_by_name($name); + + $self->logout; + + # Result is test case category id for the given test case category name + return $result; +} + +sub lookup_category_name_by_id +{ + my $self =shift; + my ($id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase({}); + + my $result = $test_case->lookup_category($id); + + $self->logout; + + if (!defined $result) + { + $result = 0; + }; + + # Result is test case category name for the given test case category id + return $result; +} + +sub lookup_priority_id_by_name +{ + my $self =shift; + my ($name) = @_; + + $self->login; + + my $result = Bugzilla::Testopia::TestCase::lookup_priority_by_value($name); + + $self->logout; + + # Result is test case priority id for the given test case priority name + return $result; +} + +sub lookup_priority_name_by_id +{ + my $self =shift; + my ($id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase({}); + + my $result = $test_case->lookup_priority($id); + + $self->logout; + + if (!defined $result) + { + $result = 0; + }; + + # Result is test case priority name for the given test case priority id + return $result; +} + +sub link_plan +{ + my $self =shift; + my ($test_case_id, $test_plan_id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + $test_case->link_plan($test_plan_id); + + my $result = $test_case->plans; + + $self->logout; + + # Result is list of plans for test case on success, otherwise an exception will be thrown + return $result; +} + +sub unlink_plan +{ + my $self =shift; + my ($test_case_id, $test_plan_id) = @_; + + $self->login; + + my $test_case = new Bugzilla::Testopia::TestCase($test_case_id); + + if (not defined $test_case) + { + $self->logout; + die "Testcase, " . $test_case_id . ", not found"; + } + + if (not $test_case->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $rtn_code = $test_case->unlink_plan($test_plan_id); + + if ($rtn_code == 0) + { + $self->logout; + die "User Can Not Unlink Plan, " . $test_plan_id; + } + + my $result = $test_case->plans; + + $self->logout; + + # Result is list of plans for test case on success, otherwise an exception will be thrown + return $result; +} + + +1; \ No newline at end of file diff --git a/Bugzilla/WebService/Testopia/TestCaseRun.pm b/Bugzilla/WebService/Testopia/TestCaseRun.pm new file mode 100644 index 0000000..71bb229 --- /dev/null +++ b/Bugzilla/WebService/Testopia/TestCaseRun.pm @@ -0,0 +1,226 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService::Testopia::TestCaseRun; + +use strict; + +use base qw(Bugzilla::WebService); + +use Bugzilla::User; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::TestCaseRun; + +# Utility method called by the list method +sub _list +{ + my ($query) = @_; + + my $cgi = Bugzilla->cgi; + + $cgi->param("current_tab", "case_run"); + + foreach (keys(%$query)) + { + $cgi->param($_, $$query{$_}); + } + + my $search = Bugzilla::Testopia::Search->new($cgi); + + # Result is an array of test case run hash maps + return Bugzilla::Testopia::Table->new('case_run', + 'tr_xmlrpc.cgi', + $cgi, + undef, + $search->query() + )->list(); +} + +sub get +{ + my $self = shift; + my ($test_case_run_id) = @_; + + $self->login; + + #Result is a test case run hash map + my $test_case_run = new Bugzilla::Testopia::TestCaseRun($test_case_run_id); + + if (not defined $test_case_run) + { + $self->logout; + die "TestcaseRun, " . $test_case_run_id . ", not found"; + } + + if (not $test_case_run->canview) + { + $self->logout; + die "User Not Authorized"; + } + + $self->logout; + + return $test_case_run; + +} + +sub list +{ + my $self = shift; + my ($query) = @_; + + $self->login; + + my $list = _list($query); + + $self->logout; + + return $list; +} + +sub create +{ + my $self =shift; + my ($new_values) = @_; + + $self->login; + + my $test_case_run = new Bugzilla::Testopia::TestCaseRun($new_values); + + my $result = $test_case_run->store(); + + $self->logout; + + # Result is new test case run id + return $result; +} + +sub update +{ + my $self =shift; + my ($run_id, $case_id, $build_id, $environment_id, $new_values) = @_; + + $self->login; + + my $test_case_run = new Bugzilla::Testopia::TestCaseRun($case_id, + $run_id, + $build_id, + $environment_id + ); + + if (not defined $test_case_run) + { + $self->logout; + die "TestCaseRun for build_id = " . $build_id . + ", case_id = " . $case_id . + ", environment_id = " . $environment_id . + ", run_id = " . $run_id . + ", not found"; + } + + if (not $test_case_run->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + # Check to see what has changed then use set methods + # The order is important. We need to check if the build or environment has + # Changed so that we can switch to the right record first. + if (defined($$new_values{build_id})) + { + $test_case_run = $test_case_run->switch($newvalues->{'build_id'}, $environment_id ,$run_id, $case_id); + } + + if (defined($$new_values{environment_id})) + { + $test_case_run = $test_case_run->switch($build_id, $newvalues->{'environment_id'} ,$run_id, $case_id); + } + + if (defined($$new_values{assignee})) + { + $test_case_run->set_assignee($$new_values{assignee}); + } + + if (defined($$new_values{case_run_status_id})) + { + $test_case_run->set_status($$new_values{case_run_status_id}, $new_values->{'update_bugs'}); + } + + if (defined($$new_values{notes})) + { + $test_case_run->append_note($$new_values{notes}); + } + + # Remove assignee user object and replace with just assignee id + if (ref($$test_case_run{assignee}) eq 'Bugzilla::User') + { + $$test_case_run{assignee} = $$test_case_run{assignee}->id(); + } + + $self->logout; + + #Remove attributes we do not want to publish + delete $$test_case_run{bugs}; + delete $$test_case_run{build}; + delete $$test_case_run{case}; + delete $$test_case_run{environment}; + delete $$test_case_run{run}; + + # Result is modified test case run on success, otherwise an exception will be thrown + return $test_case_run; +} + +sub lookup_status_id_by_name +{ + my $self =shift; + my ($name) = @_; + + $self->login; + + my $result = Bugzilla::Testopia::TestCaseRun::lookup_status_by_name($name); + + $self->logout; + + # Result is test case run status id for the given test case run status name + return $result; +} + +sub lookup_status_name_by_id +{ + my $self =shift; + my ($id) = @_; + + $self->login; + + my $test_case_run = new Bugzilla::Testopia::TestCaseRun({}); + + my $result = $test_case_run->lookup_status($id); + + $self->logout; + + if (!defined $result) + { + $result = 0; + }; + + # Result is test case run status name for the given test case run status id + return $result; +} + +1; diff --git a/Bugzilla/WebService/Testopia/TestPlan.pm b/Bugzilla/WebService/Testopia/TestPlan.pm new file mode 100644 index 0000000..f4ad852 --- /dev/null +++ b/Bugzilla/WebService/Testopia/TestPlan.pm @@ -0,0 +1,432 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService::Testopia::TestPlan; + +use strict; + +use base qw(Bugzilla::WebService); + +use Bugzilla::Constants; +use Bugzilla::User; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; + +# Utility method called by the list method +sub _list +{ + my ($query) = @_; + + my $cgi = Bugzilla->cgi; + + $cgi->param("current_tab", "plan"); + + foreach (keys(%$query)) + { + $cgi->param($_, $$query{$_}); + } + + my $search = Bugzilla::Testopia::Search->new($cgi); + + # Result is an array of test plan hash maps + return Bugzilla::Testopia::Table->new('plan', + 'tr_xmlrpc.cgi', + $cgi, + undef, + $search->query() + )->list(); +} + +sub get +{ + my $self = shift; + my ($test_plan_id) = @_; + + $self->login; + + #Result is a test plan hash map + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canview) + { + $self->logout; + die "User Not Authorized"; + } + + $self->logout; + + return $test_plan; +} + +sub list +{ + my $self = shift; + my ($query) = @_; + + $self->login; + + my $list = _list($query); + + $self->logout; + + return $list; +} + +sub create +{ + my $self =shift; + my ($new_values) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($new_values); + + my $result = $test_plan->store(); + + $self->logout; + + # Result is new test plan id + return $result; +} + +sub update +{ + my $self =shift; + my ($test_plan_id, $new_values) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_plan->update($new_values); + + $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + $self->logout; + + # Result is modified test plan, otherwise an exception will be thrown + return $test_plan; +} + +sub get_test_cases +{ + my $self =shift; + my ($test_plan_id) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_plan->test_cases(); + + $self->logout; + + # Result is list of test cases for the given test plan + return $result; +} + +sub get_test_runs +{ + my $self =shift; + my ($test_plan_id) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_plan->test_runs(); + + $self->logout; + + # Result is list of test runs for the given test plan + return $result; +} + +sub get_categories +{ + my $self =shift; + my ($test_plan_id) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_plan->product->categories(); + + $self->logout; + + # Result is list of categories for the given test plan + return $result; +} + +sub get_components +{ + my $self =shift; + my ($test_plan_id) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_plan->product->components; + + $self->logout; + + # Result is list of components for the given test plan + return $result; +} + +sub get_builds +{ + my $self =shift; + my ($test_plan_id) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_plan->product->builds(); + + $self->logout; + + # Result is list of builds for the given test plan + return $result; +} + +sub lookup_type_name_by_id +{ + my $self =shift; + my ($id) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan({}); + + my $result = $test_plan->lookup_type($id); + + $self->logout; + + # Result is test plan type name for the given test plan type id + return $result; +} + +sub lookup_type_id_by_name +{ + my $self =shift; + my ($name) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan({}); + + my $result = $test_plan->lookup_type_by_name($name); + + $self->logout; + + if (!defined $result) + { + $result = 0; + }; + + # Result is test plan type id for the given test plan type name + return $result; +} + +sub add_tag +{ + my $self =shift; + my ($test_plan_id, $tag_name) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + #Create new tag or retrieve id of existing tag + my $test_tag = new Bugzilla::Testopia::TestTag({tag_name=>$tag_name}); + my $tag_id = $test_tag->store; + + my $result = $test_plan->add_tag($tag_id); + + if ($result == 1) + { + $self->logout; + die "Tag, " . $tag_name . ", already exists for Testplan, " . $test_plan_id; + } + + $self->logout; + + # Result 0 on success, otherwise an exception will be thrown + return $result; +} + +sub remove_tag +{ + my $self =shift; + my ($test_plan_id, $tag_name) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $test_tag = Bugzilla::Testopia::TestTag->check_name($tag_name); + if (not defined $test_tag) + { + $self->logout; + die "Tag, " . $tag_name . ", does not exist"; + } + + my $result = $test_plan->remove_tag($test_tag->id); + + $self->logout; + + # Result 0 on success, otherwise an exception will be thrown + return 0; +} + +sub get_tags +{ + my $self =shift; + my ($test_plan_id) = @_; + + $self->login; + + my $test_plan = new Bugzilla::Testopia::TestPlan($test_plan_id); + + if (not defined $test_plan) + { + $self->logout; + die "Testplan, " . $test_plan_id . ", not found"; + } + + if (not $test_plan->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_plan->tags; + + $self->logout; + + # Result list of tags otherwise an exception will be thrown + return $result; +} + +1; \ No newline at end of file diff --git a/Bugzilla/WebService/Testopia/TestRun.pm b/Bugzilla/WebService/Testopia/TestRun.pm new file mode 100644 index 0000000..070fa93 --- /dev/null +++ b/Bugzilla/WebService/Testopia/TestRun.pm @@ -0,0 +1,372 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService::Testopia::TestRun; + +use strict; + +use base qw(Bugzilla::WebService); + +use Bugzilla::Product; +use Bugzilla::User; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; + +# Utility method called by the list method +sub _list +{ + my ($query) = @_; + + my $cgi = Bugzilla->cgi; + + $cgi->param("current_tab", "run"); + + foreach (keys(%$query)) + { + $cgi->param($_, $$query{$_}); + } + + my $search = Bugzilla::Testopia::Search->new($cgi); + + # Result is an array of test run hash maps + return Bugzilla::Testopia::Table->new('run', + 'tr_xmlrpc.cgi', + $cgi, + undef, + $search->query() + )->list(); +} + +sub get +{ + my $self = shift; + my ($test_run_id) = @_; + + $self->login; + + #Result is a test run hash map + my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); + + if (not defined $test_run) + { + $self->logout; + die "Testrun, " . $test_run_id . ", not found"; + } + + if (not $test_run->canview) + { + $self->logout; + die "User Not Authorized"; + } + + $self->logout; + + return $test_run; +} + +sub list +{ + my $self = shift; + my ($query) = @_; + + $self->login; + + my $list = _list($query); + + $self->logout; + + return $list; +} + +sub create +{ + my $self =shift; + my ($new_values) = @_; + + $self->login; + + my $test_run = new Bugzilla::Testopia::TestRun($new_values); + + my $result = $test_run->store(); + + $self->logout; + + # Result is new test run id + return $result +} + +sub update +{ + my $self =shift; + my ($test_run_id, $new_values) = @_; + + $self->login; + + my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); + + if (not defined $test_run) + { + $self->logout; + die "Testrun, " . $test_run_id . ", not found"; + } + + if (not $test_run->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_run->update($new_values); + + $test_run = new Bugzilla::Testopia::TestRun($test_run_id); + + $self->logout; + + # Result is modified test run on success, otherwise an exception will be thrown + return $test_run; +} + +sub get_test_cases +{ + my $self =shift; + my ($test_run_id) = @_; + + $self->login; + + my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); + + if (not defined $test_run) + { + $self->logout; + die "Testrun, " . $test_run_id . ", not found"; + } + + if (not $test_run->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_run->cases(); + + $self->logout; + + # Result is list of test cases for the given test run + return $result; +} + +sub get_test_case_runs +{ + my $self =shift; + my ($test_run_id) = @_; + + $self->login; + + my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); + + if (not defined $test_run) + { + $self->logout; + die "Testrun, " . $test_run_id . ", not found"; + } + + if (not $test_run->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_run->caseruns(); + + $self->logout; + + # Result is list of test case runs for the given test run + return $result; +} + +sub get_test_plan +{ + my $self =shift; + my ($test_run_id) = @_; + + $self->login; + + my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); + + if (not defined $test_run) + { + $self->logout; + die "Testrun, " . $test_run_id . ", not found"; + } + + if (not $test_run->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_run->plan(); + + $self->logout; + + # Result is test plan for the given test run + return $result; +} + +sub lookup_environment_id_by_name +{ + my $self =shift; + my ($name) = @_; + + $self->login; + + my $result = Bugzilla::Testopia::TestRun::lookup_environment_by_name($name); + + $self->logout; + + # Result is test run environment id for the given test run environment name + return $result; +} + +sub lookup_environment_name_by_id +{ + my $self =shift; + my ($id) = @_; + + $self->login; + + my $test_run = new Bugzilla::Testopia::TestRun({}); + + my $result = $test_run->lookup_environment($id); + + $self->logout; + + if (!defined $result) + { + $result = 0; + }; + + # Result is test run environment name for the given test run environment id + return $result; +} + +sub add_tag +{ + my $self =shift; + my ($test_run_id, $tag_name) = @_; + + $self->login; + + my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); + + if (not defined $test_run) + { + $self->logout; + die "Testrun, " . $test_run_id . ", not found"; + } + + if (not $test_run->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + #Create new tag or retrieve id of existing tag + my $test_tag = new Bugzilla::Testopia::TestTag({tag_name=>$tag_name}); + my $tag_id = $test_tag->store; + + my $result = $test_run->add_tag($tag_id); + + if ($result == 1) + { + $self->logout; + die "Tag, " . $tag_name . ", already exists for Testrun, " . $test_run_id; + } + + $self->logout; + + # Result 0 on success, otherwise an exception will be thrown + return $result; +} + +sub remove_tag +{ + my $self =shift; + my ($test_run_id, $tag_name) = @_; + + $self->login; + + my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); + + if (not defined $test_run) + { + $self->logout; + die "Testrun, " . $test_run_id . ", not found"; + } + + if (not $test_run->canedit) + { + $self->logout; + die "User Not Authorized"; + } + + my $test_tag = Bugzilla::Testopia::TestTag->check_name($tag_name); + if (not defined $test_tag) + { + $self->logout; + die "Tag, " . $tag_name . ", does not exist"; + } + + my $result = $test_run->remove_tag($test_tag->id); + + $self->logout; + + # Result 0 on success, otherwise an exception will be thrown + return 0; +} + +sub get_tags +{ + my $self =shift; + my ($test_run_id) = @_; + + $self->login; + + my $test_run = new Bugzilla::Testopia::TestRun($test_run_id); + + if (not defined $test_run) + { + $self->logout; + die "Testrun, " . $test_run_id . ", not found"; + } + + if (not $test_run->canview) + { + $self->logout; + die "User Not Authorized"; + } + + my $result = $test_run->tags; + + $self->logout; + + # Result list of tags otherwise an exception will be thrown + return $result; +} + +1; \ No newline at end of file diff --git a/Bugzilla/WebService/User.pm b/Bugzilla/WebService/User.pm new file mode 100644 index 0000000..59d616d --- /dev/null +++ b/Bugzilla/WebService/User.pm @@ -0,0 +1,58 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann +# Dallas Harken + +package Bugzilla::WebService::User; + +use strict; + +use Bugzilla; + +use base qw(Bugzilla::WebService); + +sub lookup_login_by_id +{ + my $self = shift; + my ($author_id) = @_; + + $self->login; + + my $user = new Bugzilla::User($author_id); + + my $result = defined $user ? $user->login : ''; + + $self->logout; + + # Result is user login string or empty string if failed + return $result; +} + +sub lookup_id_by_login +{ + my $self = shift; + my ($author) = @_; + + $self->login; + + my $result = Bugzilla::User::login_to_id($author); + + $self->logout; + + # Result is user id or 0 if failed + return $result; +} + +1; \ No newline at end of file diff --git a/template/en/default/admin/params/testopia.html.tmpl b/template/en/default/admin/params/testopia.html.tmpl new file mode 100644 index 0000000..59fc8cb --- /dev/null +++ b/template/en/default/admin/params/testopia.html.tmpl @@ -0,0 +1,81 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[% + title = "Testopia" + desc = "Set Testopia parameters" +%] + +[% param_descs = { + "private-cases-log" => "If this option is on, the tester cannot view other testers' cases", + + "allow-test-deletion" => "If this option is on, users can delete objects including plans and cases", + + "testopia-allow-group-member-deletes" => "If this option is on, members of the Testers group will be + allowed to delete test objects", + + "testopia-default-plan-testers-regexp" => "This is the default regular expression for granting + access to new test plans", + + "print-tag-in-case-log" => 'If this option is on, the entire tag text is printed in a test case ' _ + 'log entry. Otherwise, only an href to the tag is put there.', + + "new-case-action-template" => "This is the text to be put in a newly created test case \"action\" field", + + "new-case-results-template" => "This is the text to be put in a newly created test case \"expected results\" field", + + "bug-to-test-case-summary" => 'This is the default summary text used when generating a test case ' _ + 'out of a bug. The special symbol %id% is replaced with the bug id and ' _ + "%summary% is replaced with the bug's summary", + + "bug-to-test-case-action" => 'This is the default action text used when generating a test case ' _ + 'out of a bug. The special symbol %id% is replaced with a ' _ + "hyperlink to the bug's page. The special symbol \%description\% is " _ + "replaced with the bug's description", + + "bug-to-test-case-results" => 'This is the default results text used when generating a test case ' _ + 'out of a bug. The special symbol %id% is replaced with a ' _ + "hyperlink to the bug's page", + + "default-test-case-status" => 'Default status for newly created test cases.', + + "new-testrun-email-notif" => 'E-mail message sent to assigned testers when a new test run is started. ' _ + 'There are some special symbols replaced at run time:
' _ + '%to%: list of assigned testers email addresses
' _ + '%summary%: test run summary
' _ + '%plan%: plan\'s name
' _ + '%plan_id%: plan\'s id
' _ + '%product%: product\'s name
' _ + '%product_id%: product\'s id', + + "case-failed-email-notif" => 'E-mail message sent when a test case log is marked as \'failed\'. ' _ + 'There are some special symbols replaced at run time:
' _ + '%id%: test case log id
' _ + '%manager%: test run\'s manager
' _ + '%test_run%: test run\'s summary
' _ + '%tester%: tester
' _ + '%component%: component\'s name', + + "tester-completed-email-notif" => 'E-mail message sent when a tester has run every assigned test case.', + + "test-run-completed-email-notif" => 'E-mail message sent when every test case in a test run is completed.', } + +%] \ No newline at end of file diff --git a/template/en/default/hook/bug/create/create.html.tmpl/end/tr.html.tmpl b/template/en/default/hook/bug/create/create.html.tmpl/end/tr.html.tmpl new file mode 100644 index 0000000..b474bc8 --- /dev/null +++ b/template/en/default/hook/bug/create/create.html.tmpl/end/tr.html.tmpl @@ -0,0 +1,5 @@ +[%# 1.0@bugzilla.org %] + + [% IF caserun_id %] + Back to test case-run. + [% END %] diff --git a/template/en/default/hook/bug/create/create.html.tmpl/form/tr.html.tmpl b/template/en/default/hook/bug/create/create.html.tmpl/form/tr.html.tmpl new file mode 100644 index 0000000..bc841cf --- /dev/null +++ b/template/en/default/hook/bug/create/create.html.tmpl/form/tr.html.tmpl @@ -0,0 +1,5 @@ +[%# 1.0@bugzilla.org %] + + [% IF caserun_id %] + + [% END %] diff --git a/template/en/default/hook/bug/create/created.html.tmpl/message/tr.html.tmpl b/template/en/default/hook/bug/create/created.html.tmpl/message/tr.html.tmpl new file mode 100644 index 0000000..e6a3e36 --- /dev/null +++ b/template/en/default/hook/bug/create/created.html.tmpl/message/tr.html.tmpl @@ -0,0 +1,5 @@ +[%# 1.0@bugzilla.org %] + +[% IF caserun %] +

[% terms.Bug %] attached to Test case-run

+[% END %] diff --git a/template/en/default/hook/bug/knob.html.tmpl/links/tr.html.tmpl b/template/en/default/hook/bug/knob.html.tmpl/links/tr.html.tmpl new file mode 100644 index 0000000..5fde356 --- /dev/null +++ b/template/en/default/hook/bug/knob.html.tmpl/links/tr.html.tmpl @@ -0,0 +1,6 @@ +[%# 1.0@bugzilla.org %] + +   |   + View [% terms.Bug %] Test Cases +   |   + Create test case \ No newline at end of file diff --git a/template/en/default/hook/bug/process/results.html.tmpl/links/tr.html.tmpl b/template/en/default/hook/bug/process/results.html.tmpl/links/tr.html.tmpl new file mode 100644 index 0000000..1f794bf --- /dev/null +++ b/template/en/default/hook/bug/process/results.html.tmpl/links/tr.html.tmpl @@ -0,0 +1,6 @@ +[%# 1.0@bugzilla.org %] + +[% IF caserun_id %] +
+ Back to test case-run. +[% END %] diff --git a/template/en/default/hook/global/banner.html.tmpl/version/testopia.html.tmpl b/template/en/default/hook/global/banner.html.tmpl/version/testopia.html.tmpl new file mode 100644 index 0000000..6794ec9 --- /dev/null +++ b/template/en/default/hook/global/banner.html.tmpl/version/testopia.html.tmpl @@ -0,0 +1,2 @@ + Testopia + Version 1.0 BETA diff --git a/template/en/default/hook/global/useful-links.html.tmpl/end/tr.html.tmpl b/template/en/default/hook/global/useful-links.html.tmpl/end/tr.html.tmpl new file mode 100644 index 0000000..6de0281 --- /dev/null +++ b/template/en/default/hook/global/useful-links.html.tmpl/end/tr.html.tmpl @@ -0,0 +1,74 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% IF user.login %] + +[% IF plan_id %] + [% plan_id = plan_id %] +[% ELSIF plan %] + [% plan_id = plan.id %] +[% ELSIF case %] + [% plan_id = case.plan.0.id %] +[% ELSIF run %] + [% plan_id = run.plan_id %] +[% ELSIF caserun %] + [% plan_id = caserun.run.plan_id %] +[% END %] + + +[% END %] \ No newline at end of file diff --git a/template/en/default/hook/global/user-error.html.tmpl/errors/tr-user-error.html.tmpl b/template/en/default/hook/global/user-error.html.tmpl/errors/tr-user-error.html.tmpl new file mode 100644 index 0000000..ed82fd9 --- /dev/null +++ b/template/en/default/hook/global/user-error.html.tmpl/errors/tr-user-error.html.tmpl @@ -0,0 +1,137 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + [% IF error == "testopia-permission-denied" %] + [% title = "Insufficient Permissions" %] + You are not authorized to view [% object.type FILTER html %] [% object.id FILTER html %] + [% ELSIF error == "testopia-read-only" %] + [% title = "Insufficient Permissions" %] + You are not authorized to edit [% object.type FILTER html %] [% object.id FILTER html %] + [% ELSIF error == "testopia-no-delete" %] + [% title = "Insufficient Permissions" %] + You are not authorized to delete [% object.type FILTER html %] [% object.id FILTER html %] + [% IF UserInGroup('admin') %] + If you are the administrator, you can check that your installation + allows deletion of Testopia objects in the + paramaters . + [% END %] + [% ELSIF error == "testopia-create-denied" %] + [% title = "Cannot Create Object" %] + You do not have sufficient rights to create new [% object FILTER html %]s + [% IF plan %] for plan [% plan.id %][% END %]. + [% ELSIF error == "testopia-missing-parameter" %] + [% title = "Missing Parameter" %] + Missing required parameter [% param FILTER html %] + [% ELSIF error == "testopia-non-zero-case-count" %] + [% title = "Category Has Test Cases" %] + You have attempted to delete a category that still has test cases + associated with it. + Please move the test cases to another category first. + [% ELSIF error == "testopia-non-zero-run-count" %] + [% title = "$object Has Test Runs" %] + You have attempted to delete a [% object FILTER html %] that has test runs + associated with it. + [% ELSIF error == "testopia-non-zero-case-run-count" %] + [% title = "Build Has Case Runs" %] + You have attempted to delete a build that still has test case runs + associated with it. This is historical data and should not be removed. + [% ELSIF error == "testopia-missing-attachment-key" %] + [% title = "Missing Key" %] + You have requested to save an attachment, but I didn't see which test plan + or test case you had in mind to store it with. + [% ELSIF error == "testopia-invalid-test-id-or-alias" %] + [% title = "Invalid ID or Alias" %] + The test case you entered does not exist. + [% ELSIF error == "invalid-test-id-non-existent" %] + [% title = "Invalid ID" %] + [% IF type == 'case_run' %] + The specified case-run does not exist. + [% ELSE %] + Test [% type FILTER html %] [% id FILTER html %] does not exist. + [% END %] + [% ELSIF error == "testopia-name-not-unique" %] + [% title = "Name Must be Unique" %] + The name you chose, [% name FILTER html %], for this + [% object FILTER html %] must be unique. Another [% object FILTER html %] + of the same name already exists. Please choose a different one. + [% ELSIF error == 'testopia-create-category' %] + [% title = "No Categories Defined" %] + No categories have been created for this product yet. + [% IF plan %] + You can create categories + here. + [% END %] + [% ELSIF error == "testopia-create-build" %] + [% title = "No Builds Defined" %] + No builds have been created for this product yet. + [% IF plan %] + You can create builds + here. + [% END %] + [% ELSIF error == "testopia-create-environment" %] + [% title = "No Environments Defined" %] + No environments have been created yet. + You can create environments here. + [% ELSIF error == "testopia-missing-required-field" %] + [% title = "Missing Required Field" %] + It seems there was either no value entered for [% field FILTER none %], or the value entered + did not match any known values. + [% ELSIF error == "testopia-missing-plans-list" %] + [% title = "Plan list missing" %] + Somehow the list of plans associated with the test case to be cloned is missing. + Please try again. + [% ELSIF error == "testopia-unkown-object" %] + [% title = "Unkown Object" %] + Attempted to attach tags to something other than a Test Plan, Test Case or Test Run. + [% ELSIF error == "testiopia-alias-exists" %] + [% title = "Alias Unavailable" %] + The alias '[% alias FILTER html %]' is already in use by another test case, please + select another one. + [% ELSIF error == "testiopia-invalid-data" %] + [% title = "Invalid Option Selected" %] + The field [% field FILTER none %] has and invalid value of [% value FILTER html %] + [% ELSIF error == "testopia-none-selected" %] + [% title = "Nothing Selected" %] + You did not select any [% object FILTER none %]s to change. + [% ELSIF error == "testopia-query-too-large" %] + This query returns more than [% limit FILTER none %] rows.
+ Please do one of the following: +
    +
  1. Try to narrow your search.
  2. +
  3. Try using the pagesize and page URL paramaters to limit your results.
  4. +
  5. Use the XML-RPC Interface.
  6. +
+ [% ELSIF error == "missing-plans-list" %] + [% title = "No plans selected" %] + You did not select any plans to copy this case to. + [% ELSIF error == "testopia-tester-already-on-list" %] + [% title = "Selected user is already on the list" %] + The user [% login FILTER html %] is already a member of the ACL for this plan. + [% ELSIF error == "testopia-plan-acl-denied" %] + [% title = "Plan Administrator Privileges Required" %] + You must be an administrator of this test plan to modify the access control list. + [% ELSIF error == "testopia-no-admins" %] + [% title = "Plan Must Have at Least One Admin" %] + There do not seem to be any admins selected. You must select at least one admin for this test plan. + [% ELSIF error == "testopia-format-error" %] + [% title = "Field format error" %] + [% field %] is not formatted correctly. + [% END %] + diff --git a/template/en/default/hook/index.html.tmpl/links/tr.html.tmpl b/template/en/default/hook/index.html.tmpl/links/tr.html.tmpl new file mode 100644 index 0000000..bdb734b --- /dev/null +++ b/template/en/default/hook/index.html.tmpl/links/tr.html.tmpl @@ -0,0 +1,31 @@ +[%# 1.0@bugzilla.org %] + +
+ + + + + + + + + +
Testopia Version 1.2
+

Testopia
+

+
+

Testopia choices:

+ [% IF user.login %] +

+ Do some testing
+ Manage test plans
+ Search existing test cases
+ Manage run environments

+ [% ELSE %] + You must login to Bugzilla to see Testopia features + [% END %] +
+
+
\ No newline at end of file diff --git a/template/en/default/hook/list/list.html.tmpl/links/tr.html.tmpl b/template/en/default/hook/list/list.html.tmpl/links/tr.html.tmpl new file mode 100644 index 0000000..5418324 --- /dev/null +++ b/template/en/default/hook/list/list.html.tmpl/links/tr.html.tmpl @@ -0,0 +1,3 @@ +[%# 1.0@bugzilla.org %] + + diff --git a/template/en/default/testopia/admin/access-list.html.tmpl b/template/en/default/testopia/admin/access-list.html.tmpl new file mode 100644 index 0000000..a6bc764 --- /dev/null +++ b/template/en/default/testopia/admin/access-list.html.tmpl @@ -0,0 +1,130 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2006 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + +[% PROCESS global/header.html.tmpl %] + + + + + +

Access Control for Plan [% plan.id FILTER none %] - [% plan.name FILTER html %]

+

+This page allows plan managers to permit access to a test plan. By +default, members of the Testers group in Bugzilla have read +and write access. Beyond this, login names (email addresses) that +match a given regular expression are granted the level of permissions +specified. Lastly, individuals can be granted additional permissions +by adding them explicitly. (Note: you cannot remove permissions from a +user that has those rights by virtue of membership in the Testers group +or that matches the regular expression, although you can add additional +rights to that user.) +

+

+Delete and Admin rights are always handled by the access control list, +unless the testopia-allow-group-member-deletes parameter is set to +on. Doing so will grant delete rights to the Testers group. +

+ +[% PROCESS testopia/messages.html.tmpl %] +
+ +

Access Method

+ + + + + + + + + + + + + + + +
User Regular ExpressionReadWriteDeleteAdmin

+
+

Access Control List

+ + + + + + + + + [% FOREACH row = plan.access_list %] + + + + + + + + + [% END %] + + + + + + + + +
UserReadWriteDeleteAdmin
[%'*' IF row.user.id == plan.author.id %][% row.user.identity FILTER html %]Remove
+ +
+

+ +

+
+
Read
+
Allows viewing rights to the plan and all test cases, test runs, and test case-runs associated with it. + Test cases linked to more than one plan will not be visible unless the user has view rights on all plans linked
+
Write
+
Implies Read. Allows rights to modify the plan and associated cases, runs, and case-runs.
+
Delete
+
Implies Read and Write. Allows rights to delete the plan and associated cases, runs, and case-runs.
+
Admin
+
Implies Read, Write, and Delete. Allows rights to modify the plan's access controls (this page).
+
+* Plan author +

+Back to test plan +

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/admin/plantypes/add.html.tmpl b/template/en/default/testopia/admin/plantypes/add.html.tmpl new file mode 100644 index 0000000..e2b0d72 --- /dev/null +++ b/template/en/default/testopia/admin/plantypes/add.html.tmpl @@ -0,0 +1,41 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + [% PROCESS global/header.html.tmpl + title = "Add a New Test Plan Type" + %] + + + + + + + + + + + + + +
Type Name:
Description:
+ + + +[% PROCESS global/footer.html.tmpl %] \ No newline at end of file diff --git a/template/en/default/testopia/admin/plantypes/delete.html.tmpl b/template/en/default/testopia/admin/plantypes/delete.html.tmpl new file mode 100644 index 0000000..b22b908 --- /dev/null +++ b/template/en/default/testopia/admin/plantypes/delete.html.tmpl @@ -0,0 +1,23 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + [% PROCESS global/header.html.tmpl + title = "Test Plan Types" + %] \ No newline at end of file diff --git a/template/en/default/testopia/admin/plantypes/edit.html.tmpl b/template/en/default/testopia/admin/plantypes/edit.html.tmpl new file mode 100644 index 0000000..cf4d7c5 --- /dev/null +++ b/template/en/default/testopia/admin/plantypes/edit.html.tmpl @@ -0,0 +1,42 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + [% PROCESS global/header.html.tmpl + title = "Edit Test Plan Types" + %] + +
+ + + + + + + + + + + + +
Type Name:
Description:
+ +
+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/admin/plantypes/show.html.tmpl b/template/en/default/testopia/admin/plantypes/show.html.tmpl new file mode 100644 index 0000000..d13d874 --- /dev/null +++ b/template/en/default/testopia/admin/plantypes/show.html.tmpl @@ -0,0 +1,41 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + [% PROCESS global/header.html.tmpl + title = "Test Plan Types" + %] + + + + + + + [% FOREACH type = plan.get_plan_types %] + + + + + [% END %] + + + +
NameActions
[% type.name FILTER html %]Edit
Add
+ +[% PROCESS global/footer.html.tmpl %] \ No newline at end of file diff --git a/template/en/default/testopia/admin/show.html.tmpl b/template/en/default/testopia/admin/show.html.tmpl new file mode 100644 index 0000000..b460dc1 --- /dev/null +++ b/template/en/default/testopia/admin/show.html.tmpl @@ -0,0 +1,44 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Admin Settings for Testopia" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] + +Plan Types + +[% PROCESS global/footer.html.tmpl %] \ No newline at end of file diff --git a/template/en/default/testopia/attachment/choose.html.tmpl b/template/en/default/testopia/attachment/choose.html.tmpl new file mode 100644 index 0000000..8a17fb9 --- /dev/null +++ b/template/en/default/testopia/attachment/choose.html.tmpl @@ -0,0 +1,38 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Greg Hendricks + #%] + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Search by Attachment Number" + %] + +
+

+ You may find an attachment by entering its id here: + + + +

+
+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/attachment/delete.html.tmpl b/template/en/default/testopia/attachment/delete.html.tmpl new file mode 100644 index 0000000..5ea991a --- /dev/null +++ b/template/en/default/testopia/attachment/delete.html.tmpl @@ -0,0 +1,63 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% IF deleted %] + [% title = "Attachment Deleted" %] + [% PROCESS global/header.html.tmpl %] + [% PROCESS testopia/messages.html.tmpl %] +[% ELSIF removed %] + [% title = "Attachment Removed from $obj.type $obj.id" %] + [% PROCESS global/header.html.tmpl %] + [% PROCESS testopia/messages.html.tmpl %] +[% ELSE %] + [% title = "Delete Attachment '$attachment.description'" %] + [% PROCESS global/header.html.tmpl %] + +[% IF action == 'do_delete' %] +You are about to permanantly delete this attachment. +

This attachment is found in [% attachment.cases.size FILTER none %] cases and [% attachment.plans.size FILTER none %] plans.

+[% ELSE %] +You are about to remove this attachment from this [% obj.type %] +[% END %] +

Warning: This action cannot be undone

+
+ + + + +
+view attachment +[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/attachment/show.html.tmpl b/template/en/default/testopia/attachment/show.html.tmpl new file mode 100644 index 0000000..e6dea84 --- /dev/null +++ b/template/en/default/testopia/attachment/show.html.tmpl @@ -0,0 +1,114 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Edit Attachment '$attachment.description' for $obj.type $obj.id" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + +[% IF attachment.cases.size > 0 %] +Cases: + [% FOREACH c = attachment.cases %] + [% c.id FILTER none %] + [% END %] +
+[% END %] + +[% IF attachment.plans.size > 0 %] +Plans: + [% FOREACH p = attachment.plans %] + [% p.id FILTER none %] + [% END %] +
+[% END %] + +
+ + + + + + + + + + + + + + + + + + +[% IF isviewable %] + + [% END %] + +
Description:
Filename:Mime Type:
+ + + + + + + + + + + +
SubmitterCreatedSize
[% attachment.submitter.identity FILTER html %][% attachment.creation_ts FILTER time %][% attachment.datasize FILTER unitconvert %]
+
+ + [% ELSE %] + +
+ This attachment is not viewable in your browser because its MIME type + ([% attachment.mime_type FILTER html %]) + is not one that your browser is able to display. +

+ You can however, download the attachment. +

+
+
+ +
+[% IF attachment.candelete %] +

Delete Attachment

+[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/attachment/table.html.tmpl b/template/en/default/testopia/attachment/table.html.tmpl new file mode 100644 index 0000000..b8feed8 --- /dev/null +++ b/template/en/default/testopia/attachment/table.html.tmpl @@ -0,0 +1,63 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + + + + + + + + + [% IF item.canedit %] + + [% END %] + +[% FOREACH a = item.attachments %] + + + + + + + [% IF item.canedit %] + + [% END %] + +[% END %] + +[% IF item.canedit %] + +
AttachmentSubmitterTypeCreatedSizeActions
[% a.description FILTER html %][% a.submitter.login FILTER html %][% a.mime_type FILTER html %][% a.creation_ts FILTER time %][% a.datasize FILTER unitconvert %]Edit + [% IF Param("allow-test-deletion") %]Remove[% END %]
+ + + + + +
File + Description: + +
+[% END %] + diff --git a/template/en/default/testopia/blocks.html.tmpl b/template/en/default/testopia/blocks.html.tmpl new file mode 100644 index 0000000..abc0f61 --- /dev/null +++ b/template/en/default/testopia/blocks.html.tmpl @@ -0,0 +1,148 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + # Karla Hendricks + #%] + +[%############################################################################%] +[%# Block for SELECT fields #%] +[%############################################################################%] + +[% BLOCK select %] + + + +[% END %] + +[% BLOCK navigation %] +[% SET MAX_LIMIT = 10000 %] +[% IF ajax %] + [% url = "javascript:page(" %] + [% pc = ")" %] +[% ELSE %] + [% url = "$table.get_page_url&page="%] + [%# url = "$table.url_loc?direction=$direction&getlist=1&page="%] +[% END %] +[% pagesizelist = [{name => 25, id => 25}, + {name => 50, id => 50}, + {name => 100, id => 100}, + {name => 500, id => 500}]%] + + + + + + [% IF table.page != 0 %] + + + [% ELSE %] + + + [% END %] + + [% IF table.page < table.page_count - 1 %] + + + [% ELSE %] + + + [% END %] + + + + + + +
<< First< Previous<< First< Previous + [% SET framewidth = 10 %] + [% IF (table.page_count - 1) < framewidth %] + [% SET p = 0 %] + [% SET frame_end = table.page_count - 1 %] + [% ELSIF (table.page_count - table.page) < (framewidth / 2) %] + [% SET p = table.page_count - framewidth %] + [% SET frame_end = table.page_count - 1 %] + [% SET start_mark = '...' %] + [% ELSIF table.page < (framewidth / 2) %] + [% SET p = 0 %] + [% SET frame_end = framewidth %] + [% SET end_mark = '...' %] + [% ELSE %] + [% SET p = table.page - (framewidth / 2) %] + [% SET frame_end = table.page + (framewidth / 2) %] + [% SET start_mark = '...' %] + [% SET end_mark = '...' %] + [% END %] +       + [% start_mark %] + [% WHILE p <= frame_end %] + [% IF p != table.page %] + [% p + 1 %]  + [% ELSE %] + [% p + 1 %] + [% END %] + [% p = p + 1 %] + [% END %] + [% end_mark %] +       + Next >Last >>Next >Last >>
+ + +  Out of [% table.page_count %] pages +     + View [% PROCESS select sel = {list => pagesizelist, + default => table.page_size, + events => 'onchange="adjustPageSize(this.value)"' }%] + records at a time +     + [% IF ajax %] + View All  + [% ELSE %] + [% IF table.list_count < MAX_LIMIT %] + View All  + [% ELSE %] + View All + [% END %] + [% END %] +
[% table.list_count %] records found [% '(filtered)' IF filtered %]
+[% END %] diff --git a/template/en/default/testopia/build/delete.html.tmpl b/template/en/default/testopia/build/delete.html.tmpl new file mode 100644 index 0000000..e69de29 diff --git a/template/en/default/testopia/build/form.html.tmpl b/template/en/default/testopia/build/form.html.tmpl new file mode 100644 index 0000000..67988e0 --- /dev/null +++ b/template/en/default/testopia/build/form.html.tmpl @@ -0,0 +1,63 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2006 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% IF action == 'do_add' %] + [% title = "Create a New Build for $product.name" %] +[% ELSE %] + [% title = "Edit Build $build.name for $product.name" %] +[% END %] + +[% PROCESS global/header.html.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] + +
+ + + + + + + + + + + + + + + + + + +
Build Name:
Milestone: [% PROCESS select sel = { name => 'milestone', + accesskey => 'm', + list => product.milestones + default => build.milestone } %]Active: +
Build Description:
+ +
+

+[% IF plan_id %] +Back to test plan or +[% END %] +edit builds +

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/build/list.html.tmpl b/template/en/default/testopia/build/list.html.tmpl new file mode 100644 index 0000000..a6582b1 --- /dev/null +++ b/template/en/default/testopia/build/list.html.tmpl @@ -0,0 +1,56 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2006 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% PROCESS global/header.html.tmpl + title = "Product Builds for $product.name" +%] + + + + + + + + + + +[% FOREACH b = product.builds %] + + + + + + + +[% END %] +
NameMilestoneDescriptionVisibleActions
[% b.name FILTER html %][% b.milestone FILTER html %][% b.description FILTER html %][% b.isactive ? "Yes" : "No" %] + Edit + [% b.isactive ? "Hide" : "Unhide" %] +
+
+ [% IF user.in_group('Testers') %] + Add new + [% END %] +[% IF plan_id %] +

+Back to test plan +

+[% END %] +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/add.html.tmpl b/template/en/default/testopia/case/add.html.tmpl new file mode 100644 index 0000000..3110678 --- /dev/null +++ b/template/en/default/testopia/case/add.html.tmpl @@ -0,0 +1,107 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% title = "Create a New Test Case" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style +%] + + + + + +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] +
+

Link to Selected Plans

+ +[% FOREACH plan = case.plans %] + + + + +[% END %] +
[% plan.name FILTER html %]
+
+

Attributes

+[% PROCESS testopia/case/form.html.tmpl %] +
+[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/buglist-to-case-add.html.tmpl b/template/en/default/testopia/case/buglist-to-case-add.html.tmpl new file mode 100644 index 0000000..75c489c --- /dev/null +++ b/template/en/default/testopia/case/buglist-to-case-add.html.tmpl @@ -0,0 +1,56 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + style = style +%] + +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] + +

The following special symbols are available: +

  • %id% gets replaced by the bug's id.
  • +
  • %description% gets replaced by the bug's description.
  • +

+
+ +[% PROCESS testopia/case/form.html.tmpl %] +

+Back to [% terms.bug %] list +or select another plan +

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/buglist-to-case-entry.html.tmpl b/template/en/default/testopia/case/buglist-to-case-entry.html.tmpl new file mode 100644 index 0000000..a4ca9c0 --- /dev/null +++ b/template/en/default/testopia/case/buglist-to-case-entry.html.tmpl @@ -0,0 +1,66 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style +%] + +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] + +[% UNLESS tr_error %] +
+ + +

Select a test plan:   + +

+

+
+[% END %] +

+[% IF $run_id %] + Back to test run regression test cases +[% ELSE %] + Back to [% terms.bug %] list +[% END %] +

+[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/bugs.html.tmpl b/template/en/default/testopia/case/bugs.html.tmpl new file mode 100644 index 0000000..b40bd1f --- /dev/null +++ b/template/en/default/testopia/case/bugs.html.tmpl @@ -0,0 +1,48 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + + + + + + [% IF item.canedit %][% END %] + +[% FOREACH bug = item.bugs %] + + + + [% IF item.canedit %] + +[% END %] +
[% terms.Bugs %]
IDSummaryRemove
[% bug.bug_id FILTER bug_link(bug.bug_id) %] [% bug.short_desc FILTER html %]detach bug + [% END %] +
+[% IF item.canedit %] + + + + + +
Attach [% terms.Bugs %]
+

+ +

+[% END %] \ No newline at end of file diff --git a/template/en/default/testopia/case/choose.html.tmpl b/template/en/default/testopia/case/choose.html.tmpl new file mode 100644 index 0000000..2efa560 --- /dev/null +++ b/template/en/default/testopia/case/choose.html.tmpl @@ -0,0 +1,37 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Greg Hendricks + #%] + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Search by Test Case Number" + %] + +
+

+ You may find a test case by entering its id here: + + +

+
+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/clone.html.tmpl b/template/en/default/testopia/case/clone.html.tmpl new file mode 100644 index 0000000..4300fac --- /dev/null +++ b/template/en/default/testopia/case/clone.html.tmpl @@ -0,0 +1,123 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% SET title = "Clone Test Case: $case.summary" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +
+ + + + + + + + + + + + + + + + + + + + +
Select Clone Options
Create a Copy +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Copy to Existing Plans
Copy to Additional Plans
+ (comma-separated list of plan IDs)
Maintain Case Author:Yes No, make me the author of the new case.
Copy DocumentYes No
Copy AttachmentsYes No
Copy TagsYes No
Copy ComponentsYes No
+
Create a Link +
+ + + + + + + + +
Link to Plans
+ (comma-separated list of plan IDs)
+
+ +
+

+Back to test case +

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/delete-list.html.tmpl b/template/en/default/testopia/case/delete-list.html.tmpl new file mode 100644 index 0000000..2923cfe --- /dev/null +++ b/template/en/default/testopia/case/delete-list.html.tmpl @@ -0,0 +1,60 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2007 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = "Deleting Multiple Test Cases" +%] + +[% IF unable_list.size > 0 %] + You do not have sufficient permissions to delete the following test cases:
+ [% FOREACH case = unable_list %] + [% case.id FILTER none %] + [% END %] +

These will be ignored

+[% END %] +You are about to delete [% delete_list.size %] test cases with all of their history
+ +
+Warning: This action cannot be undone +
+
+
+ + + +
+ +Go back to search page + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/delete.html.tmpl b/template/en/default/testopia/case/delete.html.tmpl new file mode 100644 index 0000000..5c4b395 --- /dev/null +++ b/template/en/default/testopia/case/delete.html.tmpl @@ -0,0 +1,68 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% IF deleted %] + [% title = "Case Deleted" %] +[% ELSE %] + [% title = "Delete Test Case: $case.id - $case.summary" %] +[% END %] +[% PROCESS global/header.html.tmpl %] + +[% IF NOT deleted %] +You are about to permanently delete this test case with all its history. +
+This test case is used in [% runcount FILTER none %] run(s) +in [% plancount FILTER none %] plan(s)
+[% IF bugcount %] +This case has [% bugcount FILTER none %] [% terms.bugs %] linked to it.
+[% END %] +Warning: This action cannot be undone +
+
+
+ + + +
+ +Go back + +[% ELSE %] + +Test case deleted. + +[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/filter.html.tmpl b/template/en/default/testopia/case/filter.html.tmpl new file mode 100644 index 0000000..436e335 --- /dev/null +++ b/template/en/default/testopia/case/filter.html.tmpl @@ -0,0 +1,91 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +

Filter

+
+ + + + + + + + + + + + + + + + + + +
CategoryPriorityComponentsAutomatic
+ [% PROCESS select sel = { name => 'category_id', + accesskey => 't', + list => plan.product.categories, + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'priority_id', + accesskey => 'p', + list => case.get_priority_list + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'component_id', + accesskey => 'm', + list => plan.product.components + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'isautomated', + accesskey => 'a', + list => + [ { id => "0", name => "Manual" }, + { id => "1", name => "Automatic" } ] + elements => 5, + mult => 1 } %] + + + + + + + + + + + + + + +
Summary Contains: +
Tags: +
Default Tester Contains: +
+
+
diff --git a/template/en/default/testopia/case/form.html.tmpl b/template/en/default/testopia/case/form.html.tmpl new file mode 100644 index 0000000..0e703bd --- /dev/null +++ b/template/en/default/testopia/case/form.html.tmpl @@ -0,0 +1,233 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + # Tyler Peterson + #%] + +[%# INTERFACE: + # ... + #%] + + + + + + + + +[% IF action == "Add" %] + + +[% END %] + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Summary +
Default Tester + + + Add Tags +
Alias + Requirement: +
Status + + [% IF action == 'Add' %] + [% status_default = Param('default-test-case-status') %] + [% ELSE %] + [% status_default = case.status %] + [% END %] + [% PROCESS select sel = { name => 'status', + accesskey => 's', + list => case.get_status_list + default => status_default + events => 'onChange="checkAddruns(this.value)"'} %] + Automatic + +
Priority + + [% PROCESS select sel = { name => 'priority', + accesskey => 'p', + list => case.get_priority_list + default => case.priority ? case.priority : Param('defaultpriority')} %] + Script +
Category + + [% PROCESS select sel = { name => 'category', + accesskey => 'c', + list => case.get_category_list + default => case.category.name } %] + Arguments: +
Estimated Time:
(HH:MM:SS)
Add to Runs
+
+ + + + + + + + +
Select Components From
+ [% PROCESS select sel = { name => 'prod_pick', + list => user.get_selectable_products, + default => case.get_product_ids.0, + events => 'onChange="getProdComps(this.value)"', + accesskey => 'p' } %] +
+ [% comps = [] %] + [% FOREACH c = case.components %] + [% comps.push(c.id) %] + [% END %] + + [% PROCESS select sel = { name => 'components', + accesskey => 'c', + list => case.get_selectable_components(1) + default => comps + mult => 1 + deflist => 1 + elements => 7 + events => "onChange=\"chgTester(this)\""} %] + +
+
+

+ +

+ +

+

Dependencies

+ + + + + + + + + + + + + + + + + +
Depends on Blocks
+ [% FOREACH dep = case.dependson %] + [% dep.id FILTER none %] + [% END %] + + [% FOREACH dep = case.blocked %] + [% dep.id FILTER none %] + [% END %] +
+ + + +
+

+ +

+ +[%# action, effect %] +

Set Up

+
[% case.text.setup FILTER xss %]
+

Break Down

+
[% case.text.breakdown FILTER xss %]
+

Action

+
[% case.text.action FILTER xss %]
+

Expected Results

+
[% case.text.effect FILTER xss %]
diff --git a/template/en/default/testopia/case/history.html.tmpl b/template/en/default/testopia/case/history.html.tmpl new file mode 100644 index 0000000..d604bf2 --- /dev/null +++ b/template/en/default/testopia/case/history.html.tmpl @@ -0,0 +1,128 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Case History for Case $case.id: $case.summary" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + + + + + + + + + +[% FOREACH row = case.history %] + + + + + + + +[% END %] +
WhoWhenWhatOld ValueNew Value
[% row.who FILTER html %][% row.changed FILTER time %][% row.what FILTER html %][% row.oldvalue FILTER html %][% row.newvalue FILTER html %]
+

+

Diff Case Document

+
+ + + + + + + + + + + + + + +
Diff Versions
Version: + + Version: + +
+ +
+
SETUP
+
+
+    [% diff.setup FILTER html %]
+  
+
+
BREAKDOWN
+
+
+    [% diff.breakdown FILTER html %]
+  
+
+
ACTION
+
+
+    [% diff.action FILTER html %]
+  
+
+
EFFECT
+
+
+    [% diff.effect FILTER html %]
+  
+
+
+

+Back to case +

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/list.csv.tmpl b/template/en/default/testopia/case/list.csv.tmpl new file mode 100644 index 0000000..4a61c51 --- /dev/null +++ b/template/en/default/testopia/case/list.csv.tmpl @@ -0,0 +1,33 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # David Koenig + #%] + +[%# Testopia Test Case list CSV export template #%] + +[% PROCESS global/variables.none.tmpl %] + +[% colsepchar = user.settings.csv_colsepchar.value %] + +[% PROCESS testopia/export/csv.caseheader.tmpl %] + +[% FOREACH test_case = table.list %] + [% PROCESS testopia/export/csv.case.tmpl case=test_case %] + +[% END %] \ No newline at end of file diff --git a/template/en/default/testopia/case/list.html.tmpl b/template/en/default/testopia/case/list.html.tmpl new file mode 100644 index 0000000..0f0f26e --- /dev/null +++ b/template/en/default/testopia/case/list.html.tmpl @@ -0,0 +1,227 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Cases" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + + + + +[% PROCESS testopia/case/filter.html.tmpl IF addrun %] + + + +[% PROCESS testopia/case/table.html.tmpl %] + +

+[% IF table.list_count == 0 %] +No test cases +[% ELSE %] + [% IF table.list_count == 1 %] + One test case + [% ELSE %] + [% table.list_count FILTER none %] total test cases + [% END %] +[% END %] +found. +

+[% IF candelete %] +

+[% END %] +[% IF dotweak AND table.list_count %] +

Update Selected Test Cases

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + [% IF NOT multiprod AND NOT addrun %] + + + [% ELSE %] + + [% END %] + + + + + + + + + + + + + + + + +
RequirementAdd Tags + + + + + + + + +
Add Components From
+ [% PROCESS select sel = { name => 'prod_pick', + list => user.get_selectable_products, + default => case.get_product_ids.0, + events => 'onChange="getProdComps(this.value)"', + accesskey => 'p' } %] +
+ + [% PROCESS select sel = { name => 'components', + accesskey => 'c', + mult => 1 + elements => 7 }%] + +
+
Status + [% PROCESS select sel = { name => 'status', + accesskey => 's', + list => status_list + default => "--Do Not Change--" } %] + Automatic + +
Priority + [% PROCESS select sel = { name => 'priority', + accesskey => 'p', + list => priority_list + default => "--Do Not Change--" } %] + Script
Category + [% PROCESS select sel = { name => 'category', + accesskey => 'c', + list => category_list + default => "--Do Not Change--" } %] + Arguments:
Default Tester
Add selected cases to the following runs (only CONFIRMED cases will be added):(comma-separated list of ids)
Clone selected cases to the following plans + (comma-separated list of ids): + Copy + Link
+ Make me the author of copied cases.
+ +

+ + +

+ + +[% END %] + + +[% IF table.list_count >0 %] +
+ +
+ +[% END %] +[% PROCESS "testopia/saved-search.html.tmpl" %] +[%############################################################################%] +[%# Page Footer #%] +[%############################################################################%] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/list.xml.tmpl b/template/en/default/testopia/case/list.xml.tmpl new file mode 100644 index 0000000..f63423c --- /dev/null +++ b/template/en/default/testopia/case/list.xml.tmpl @@ -0,0 +1,29 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): David Koenig + #%] + +[%# Testopia Show Test Case XML export template #%] + +[% PROCESS testopia/export/xml.header.tmpl -%] + +[% FOREACH test_case = table.list %] + [%+ PROCESS testopia/export/xml.case.tmpl case=test_case %] +[% END %] + +[%- PROCESS testopia/export/xml.footer.tmpl %] \ No newline at end of file diff --git a/template/en/default/testopia/case/navigate.html.tmpl b/template/en/default/testopia/case/navigate.html.tmpl new file mode 100644 index 0000000..1552092 --- /dev/null +++ b/template/en/default/testopia/case/navigate.html.tmpl @@ -0,0 +1,67 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Greg Hendricks + #%] + +[% list = table.get_saved_list('case') %] +Case List: +[% IF table && list > 0 %] +[% curr = lsearch(list, case.id) %] +[% IF curr != -1 && (curr > 0) %] + << First +[% ELSE %] + <<First +[% END %] + + [% IF case %] + [% IF curr != -1 %] + [% IF curr > 0 %] + [% prev = curr - 1 %] + < Prev + [% ELSE %] + Prev + [% END %] + + [% IF curr != -1 %] +   ([% curr + 1 %] of [% list.size %])   + [% END %] + + [% IF curr + 1 < list.size %] + [% next = curr + 1 %] + Next > + [% ELSE %] + Next + [% END %] + [% END %] + [% ELSE %] +    + [% END %] + +[% IF curr != -1 && (curr + 1 < list.size) %] + Last >> +[% ELSE %] + Last>> +[% END %] + +[% ELSE %] + [%# With no list, don't show link to search results %] +    + No search results available +[% END %] diff --git a/template/en/default/testopia/case/show.csv.tmpl b/template/en/default/testopia/case/show.csv.tmpl new file mode 100644 index 0000000..d0823a4 --- /dev/null +++ b/template/en/default/testopia/case/show.csv.tmpl @@ -0,0 +1,32 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # David Koenig + #%] + +[%# Testopia Test Case CSV export template #%] + +[% PROCESS global/variables.none.tmpl %] + +[% USE date %] + +[% colsepchar = user.settings.csv_colsepchar.value %] + +[% PROCESS testopia/export/csv.caseheader.tmpl %] + +[% PROCESS testopia/export/csv.case.tmpl %] \ No newline at end of file diff --git a/template/en/default/testopia/case/show.html.tmpl b/template/en/default/testopia/case/show.html.tmpl new file mode 100644 index 0000000..5cd476c --- /dev/null +++ b/template/en/default/testopia/case/show.html.tmpl @@ -0,0 +1,343 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% SET title = "Test Case $case.id: $case.summary" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] + + + + + + + +[% PROCESS testopia/messages.html.tmpl %] + +[% PROCESS testopia/case/navigate.html.tmpl %] + +[% requirement = case.requirement FILTER html %] + +[%##### Overview #####%] +[% IF copied %] +

Case copied from test case [% copied.id FILTER none %]

+Back to case [% copied.id FILTER none %] +
+[% END %] +
+
+

Overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AliasRequirementCreated
[% case.alias FILTER html %][% requirement FILTER quoteUrls %][% case.creation_date FILTER time %]
AuthorCase VersionCategory
Author [% case.author.identity FILTER html %]
+ Default Tester [% case.default_tester.identity FILTER html %]
[% case.version FILTER html %][% case.category.name FILTER html %]
PriorityStatusAutomated
[% case.priority FILTER html %][% case.status FILTER html %][% case.isautomated ? "YES" : "NO" FILTER html %]
Used in Plans[% terms.Bugs %] DetectedFound in Runs (total)
+ [% FOREACH plan = case.plans %] + [% plan.id FILTER none %][% IF plan.canview %]: [% plan.name FILTER html %][% END %] + [% IF case.can_unlink_plan(plan.id) %] + Unlink Test Plan + [% END %] +
+ [% END %] +
+ [% FOREACH bug_id = case.bugs %] + [% bug.id FILTER none %] + [% END %] + [% case.run_count FILTER none %]
+ [% IF case.canedit %] + Edit Case Attributes + + [% END %] + + + + [% IF case.candelete %] + + [% END %] +
+
+ +[%##### Components and Tags #####%] +

Components and Tags

+
+ +[% IF case.canedit %] + + + + + + + + +
ComponentsTags
+ + + + + + + + +[% END %] + + + +
Product + [% PROCESS select sel = { name => 'prod_pick', + list => user.get_selectable_products, + default => case.get_product_ids.0, + events => 'onChange="getProdComps(this.value)"', + accesskey => 'p' } %] +
Component + [% PROCESS select sel = { name => 'comp_pick', + list => case.get_selectable_components + accesskey => 'p' } %] + +
  + [% SET components = case.components %] + + [% PROCESS select sel = { name => 'components', + list => components + accesskey => 'c' + elements => 7 } %] +
+ [% IF case.canedit %] + + [% END %] +
+
+
+ [% PROCESS testopia/tag/table.html.tmpl + item = case + type = 'case' + %] +
+
+
+ +[%##### Test Case Runs #####%] +

+

Test Case Run History

+
+[% PROCESS 'testopia/caserun/case-history.html.tmpl' + testcaseruns = case.caseruns %] +
+[%##### Reports #####%] +

+

Reports

+ + + + +
+ + + + + + + + + + + +
Tabular ReportsTime Reports
General Reports + Estimated Time
+ [% case.estimated_time FILTER html %]

+ Actual Average Time
+ [% case.calculate_average_time FILTER html %] +
+
+[%##### Attachments #####%] +

+

Attachments

+
+[% PROCESS testopia/attachment/table.html.tmpl + item = case +%] +
+[% #### Bugs ####%] +

+

Bugs

+
+[% PROCESS testopia/case/bugs.html.tmpl + item = case +%] +
+[%##### Edit Case #####%] +

+[% IF case.canedit %] +

Attributes

+
+ [% PROCESS testopia/case/form.html.tmpl %] +
+[% ELSE %] +[%##### Case Document #####%] +

+

Setup

+
+ [% case.text.setup FILTER quoteUrls %] +

+

Breakdown

+ [% case.text.breakdown FILTER quoteUrls %] +

+

Action

+ [% case.text.action FILTER quoteUrls %] +

+

Expected Results

+ [% case.text.effect FILTER quoteUrls %] +
+ +[% END %] +
+ +
+ +
+ +[%##### Footer #####%] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/case/show.print.tmpl b/template/en/default/testopia/case/show.print.tmpl new file mode 100644 index 0000000..7d165df --- /dev/null +++ b/template/en/default/testopia/case/show.print.tmpl @@ -0,0 +1,97 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2006 Novell. + # All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + + + Test Case [% case.id FILTER html %] - [% case.summary FILTER html %] + + + +

Test Case [% case.id FILTER html %] - [% case.summary FILTER html %]

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
ComponentsTags
+ [% FOREACH component = case.components %] + [% component.name FILTER html %]
+ [% END %] +
+ [% FOREACH tag = case.tags %] + [% tag.tag_name FILTER html %]
+ [% END %] +
+ + + + + + + +[% FOREACH bug = case.bugs %] + + + + +[% END %] +
[% terms.Bugs %]
IDSummary
[% bug.bug_id FILTER bug_link(bug.bug_id) %] [% bug.short_desc FILTER html %]
+
+

Statistics

+ +
+

Setup

+[% case.text.setup FILTER xss %] +

Action

+[% case.text.action FILTER xss %] +

Expected Results

+[% case.text.effect FILTER xss %] +

Breakdown

+[% case.text.breakdown FILTER xss %] diff --git a/template/en/default/testopia/case/show.xml.tmpl b/template/en/default/testopia/case/show.xml.tmpl new file mode 100644 index 0000000..d3a7cb0 --- /dev/null +++ b/template/en/default/testopia/case/show.xml.tmpl @@ -0,0 +1,26 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): David Koenig + #%] + +[%# Testopia Show Test Case XML export template #%] + +[% PROCESS testopia/export/xml.header.tmpl %] + [%+ PROCESS testopia/export/xml.case.tmpl %] + +[% PROCESS testopia/export/xml.footer.tmpl %] \ No newline at end of file diff --git a/template/en/default/testopia/case/table.html.tmpl b/template/en/default/testopia/case/table.html.tmpl new file mode 100644 index 0000000..989b57b --- /dev/null +++ b/template/en/default/testopia/case/table.html.tmpl @@ -0,0 +1,144 @@ +[%# 1.0@bugzilla.org %][%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# We need to do this again since this may be called from ajax %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] + +[% IF table.list_count > 0 %] +[%# More than this will cause your browser to get really slow + # So we won't show the action and effects %] +[% SET MAX_LIMIT = 1000 %] + +[% IF table.view_count >= MAX_LIMIT %] +

This list is too big to display quickly. Action and Effect will not be included.

+[% END %] +Collapse All +Expand All +[% IF dotweak %] +Select: +All, +None + [% END %] + [% SET nav = { curr => page, + last => pagecount } + %] + + [% IF table.ajax %] + [% link = "javascript:updateCaseList(\'" %] + [% paren = "\', $table.direction)" %] + [% ELSE %] + [% link = "${table.get_order_url}&order=" %] + [%# link = "${table.url_loc}?reverse=${table.reverse_sort}&getlist=1&viewall=${table.viewall}&order=" %] + [% END %] + [% DECORATIVE_BORDER_100_BEGIN %] + + + + + + + + + + + + + + +[% FOREACH case = table.list %] + [% index = loop.count %] + + + + + + + + + + + + + + + [% IF loop.size < MAX_LIMIT %] + + + + + [% END %] +[% END %] +
+ ID[% table.arrow IF table.last_sort == 'case_id' %]Alias[% table.arrow IF table.last_sort == 'alias' %]Summary[% table.arrow IF table.last_sort == 'summary' %]Requirement[% table.arrow IF table.last_sort == 'requirement' %]Author[% table.arrow IF table.last_sort == 'author' %]Default Tester[% table.arrow IF table.last_sort == 'tester' %]Created[% table.arrow IF table.last_sort == 'author' %]Category[% table.arrow IF table.last_sort == 'category' %]Priority[% table.arrow IF table.last_sort == 'priority' %]Status[% table.arrow IF table.last_sort == 'status' %]
+ + + + + +
[% IF dotweak %][% END %][% IF loop.size < MAX_LIMIT %][% END %]
+
[% case.id FILTER none %][% case.alias FILTER html %][% case.summary FILTER html %][% case.requirement FILTER html %][% case.author.login FILTER html %][% case.default_tester.login FILTER html %][% case.creation_date FILTER time %][% case.category.name FILTER html %][% case.priority FILTER html %][% case.status FILTER html %]
+
+ + + + + + + + + + + +
Summary: [% case.summary FILTER html %]
Action:
+ [% case.text.action %]
+
Expected Results:
+ [% case.text.effect %]
+ +
+
+ Found in Plans: + [% FOREACH p = case.plans %] + [% p.id FILTER none %] + [% END %] +
+
+ [% IF case.can_unlink_plan(p.id) %] + Unlink + [% END %] + [% IF plan.candelete %] + Delete + [% END %] + +
+
+
+ [% IF NOT table.viewall %] + [% PROCESS navigation %] + [% END %] + [% DECORATIVE_BORDER_END %] + +[%# No else clause required here -- see list.html.tmpl just below + # PROCESS testopia/case/table.html.tmpl + #%] + +[% END %] diff --git a/template/en/default/testopia/case/unlink.html.tmpl b/template/en/default/testopia/case/unlink.html.tmpl new file mode 100644 index 0000000..628d6f6 --- /dev/null +++ b/template/en/default/testopia/case/unlink.html.tmpl @@ -0,0 +1,48 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2007 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Unlink Test Case: $case.id - $case.summary" +%] + +You are about to permanently unlink this test case from test plan
+[% plan.id FILTER none %] - [% plan.name FILTER html %]. +

+This will remove all history of this case from this plan. +
+Warning: This action cannot be undone +
+
+

+ + + + +
+ +Go back + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/caserun/case-history.html.tmpl b/template/en/default/testopia/caserun/case-history.html.tmpl new file mode 100644 index 0000000..0168130 --- /dev/null +++ b/template/en/default/testopia/caserun/case-history.html.tmpl @@ -0,0 +1,88 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WIthOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] +[% IF table.list_count %] + [% IF dotweak %] +Select: +All, +None + [% END %] + +[% DECORATIVE_BORDER_100_BEGIN %] +[% link = "${table.get_order_url}&order=" %] + + + [% IF dotweak %][% END %] + [% IF dotweak %] + + [% END %] + + + + + + + + + + + +[% FOREACH caserun = table.list %] + + [% IF dotweak %] [% END %] + [% IF dotweak %] + + [% END %] + + + + + + + + + + + +[% END %] +[% IF NOT table.viewall %] + [% PROCESS navigation %] +[% END %] +
CaseCase SummaryRunBuildEnvironmentAssignedTested byClose dateStatusPriorityCategoryBugs
[% caserun.case.id FILTER html %][% caserun.case.summary FILTER html %][% caserun.run.id FILTER html %][% caserun.build.name FILTER html %][% caserun.environment.name FILTER html %][% caserun.assignee.login FILTER html %][% caserun.testedby.login FILTER html %][% caserun.close_date FILTER html %] + + [% caserun.status FILTER none %][% caserun.case.priority FILTER html %][% caserun.case.category.name FILTER html %] + [% IF caserun.bug_count %] + [% caserun.bug_count FILTER html %] + [% ELSE %] + 0 + [% END %] +
+[% DECORATIVE_BORDER_END %] +[% ELSE %] +No Runs Found +[% END %] diff --git a/template/en/default/testopia/caserun/delete.html.tmpl b/template/en/default/testopia/caserun/delete.html.tmpl new file mode 100644 index 0000000..eec6631 --- /dev/null +++ b/template/en/default/testopia/caserun/delete.html.tmpl @@ -0,0 +1,74 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% IF NOT deleted %] +[% IF caseruns %] + You are about to permanently remove [% caseruncount %] case(s) from this test run. +[% ELSE %] + You are about to permanently remove this test case from this run with all its history. +[% END %] +
+[% IF bugcount %] +This case has [% bugcount FILTER none %] [% terms.bugs %] linked to it.
+[% END %] +Warning: This action cannot be undone! +
+
+
+ + + [% IF caseruns %] + [% FOREACH c = caseruns %] + + [% END %] + [% ELSE %] + + [% END %] + +
+ +Cancel + +[% ELSE %] + +Test case(s) removed. + [% IF run_id %] + Go back to test run [% run_id FILTER none %] + [% END %] +[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/caserun/filter.html.tmpl b/template/en/default/testopia/caserun/filter.html.tmpl new file mode 100644 index 0000000..7643968 --- /dev/null +++ b/template/en/default/testopia/caserun/filter.html.tmpl @@ -0,0 +1,169 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2006 Novell. + # All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +
+ + + +[% query = table.get_query_part %] +[% IF table.url_loc == 'tr_show_run.cgi' %] + +
+ + Reports +
+
+[% PROCESS "testopia/search/report-matrix.html.tmpl" + obj = table.list.0 +%] +This report does not include historical data. For a more comprehensive report on case-runs use the Generic Reports +

+ +

+
+[% END %] +
+ + Filter +
+
+ + + + + + + + + + + + + + + + + + + +
StatusCategoryBuildPriorityComponentAutomatic + + + + + + + + + + + + + + + + + + + + + + + + + +
Assignee Contains + +
Tested By Contains + +
Summary Contains + +
Requirement + +
Environment + +
Case Tags + +
+
+ [% PROCESS select sel = { name => "case_run_status_id", + list => caserun.get_status_list, + elements => 6, + mult => 1, } + %] + + [% PROCESS select sel = { name => "category", + list => run.filter_case_categories, + byname => 1, + elements => 6, + mult => 1, } + + %] + + [% PROCESS select sel = { name => "build", + list => run.filter_builds, + byname => 1, + elements => 6, + mult => 1, } + %] + + [% PROCESS select sel = { name => "priority_id", + list => case.get_priority_list, + elements => 6, + mult => 1, } + %] + + [% PROCESS select sel = { name => "component", + list => run.filter_components, + byname => 1, + elements => 6, + mult => 1, } + %] + + [% PROCESS select sel = { name => 'isautomated', + accesskey => 'a', + list => + [ { id => "0", name => "Manual" }, + { id => "1", name => "Automatic" } ] + elements => 5, + mult => 1 } %] + +
+
+[% IF filtered %] +
+Results have been filtered. Click 'Clear' to see the full list. +[% END %] +
+
\ No newline at end of file diff --git a/template/en/default/testopia/caserun/form.html.tmpl b/template/en/default/testopia/caserun/form.html.tmpl new file mode 100644 index 0000000..51d26e5 --- /dev/null +++ b/template/en/default/testopia/caserun/form.html.tmpl @@ -0,0 +1,185 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + + +[% IF single %] + [% build_list = caserun.run.plan.product.builds(1) %] + [% default_build = caserun.build.id %] +[% ELSE %] + [% default_build = "--Do Not Change--" %] +[% END %] + + + + [% IF NOT dotweak %] + + + [% END %] + + +
+ [% IF caserun.bugs.size > 0 %] + + + + + + + + [% FOREACH bug = caserun.bugs %] + + + + + [% END %] +
[% terms.Bugs %]
IDSummaryRemove
[% bug.bug_id FILTER bug_link(bug.bug_id) %] [% bug.short_desc FILTER html %]detach bug +
+ [% END %] +
+ [% IF caserun.case.bugs.size > 0 %] + + + + + + + + [% FOREACH bug = caserun.case.bugs %] + + + + + [% END %] +
[% terms.Bugs %] in all runs
IDSummary
[% bug.bug_id FILTER bug_link(bug.bug_id) %] [% bug.short_desc FILTER html %]
+ [% END %] +
+ + +[% IF run %] + + + + + + + [% ELSE %] + + + + +[% END %] + + + + + + +
Build + [% PROCESS select sel = { name => "caserun_build", + list => build_list, + default => default_build } + %] + Environment +
Assignee + Attach [% terms.Bugs %] Log a New Bug +
Update [% terms.bug %] status
+ + + + + + + + +
+ + + + + [% FOREACH status = caserun.get_status_list %] + + + + + + [% END %] + [% IF dotweak %] + + + + + + [% END %] +
Status
 
+
+ + [% IF single %] + + + + + + + [% END %] + + + + + + +
Notes
[% caserun.notes FILTER html %]
Append a New Note
+
+ + +
+ diff --git a/template/en/default/testopia/caserun/list.html.tmpl b/template/en/default/testopia/caserun/list.html.tmpl new file mode 100644 index 0000000..65f91b2 --- /dev/null +++ b/template/en/default/testopia/caserun/list.html.tmpl @@ -0,0 +1,87 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Case Runs" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + + + +[% IF table.list_count && run %] +[% PROCESS "testopia/caserun/filter.html.tmpl" %] +[% END %] +
+
+[% IF table.list_count %] + [% PROCESS "testopia/caserun/case-history.html.tmpl" %] + [% IF candelete %] +

+ [% END %] +[% END %] +

+[% IF table.list_count == 0 %] +No test case runs +[% ELSE %] + [% IF table.list_count == 1 %] + One test caserun + [% ELSE %] + [% table.list_count %] test case runs + [% END %] +[% END %] +found. +

+ +[% IF dotweak AND table.list_count %] +

Update Selected Test Case-Runs

+ +[% PROCESS testopia/caserun/form.html.tmpl %] + +[% END %] + +
+[%############################################################################%] +[%# Page Footer #%] +[%############################################################################%] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/caserun/navigate.html.tmpl b/template/en/default/testopia/caserun/navigate.html.tmpl new file mode 100644 index 0000000..9881047 --- /dev/null +++ b/template/en/default/testopia/caserun/navigate.html.tmpl @@ -0,0 +1,67 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Greg Hendricks + #%] + +[% list = table.get_saved_list %] +Case-Run List: +[% IF table && list > 0 %] +[% curr = lsearch(list, caserun.id) %] +[% IF curr != -1 && (curr > 0) %] + << First +[% ELSE %] + <<First +[% END %] + + [% IF caserun %] + [% IF curr != -1 %] + [% IF curr > 0 %] + [% prev = curr - 1 %] + < Prev + [% ELSE %] + Prev + [% END %] + + [% IF curr != -1 %] +   ([% curr + 1 %] of [% table.get_saved_list.size %])   + [% END %] + + [% IF curr + 1 < list.size %] + [% next = curr + 1 %] + Next > + [% ELSE %] + Next + [% END %] + [% END %] + [% ELSE %] +    + [% END %] + +[% IF curr != -1 && (curr + 1 < list.size) %] + Last >> +[% ELSE %] + Last>> +[% END %] + +[% ELSE %] + [%# With no list, don't show link to search results %] +    + No search results available +[% END %] diff --git a/template/en/default/testopia/caserun/short-form-header.html.tmpl b/template/en/default/testopia/caserun/short-form-header.html.tmpl new file mode 100644 index 0000000..bc8e16f --- /dev/null +++ b/template/en/default/testopia/caserun/short-form-header.html.tmpl @@ -0,0 +1,87 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[% PROCESS testopia/blocks.html.tmpl %] + + + + + [% IF !caserun.canedit %] + + [% END %] + + + +
+ locked + + click to expand +
+ + [% caserun.case.id FILTER html %] + + [% IF caserun.canedit %] + + [% END %] + + [% IF caserun.canedit %] + [% PROCESS select sel = { name => "caserun_build", + list => caserun.run.plan.product.builds(1), + default => caserun.build.name + events => "onChange='chBld($index, this.value, \"$caserun.status\", $caserun.id)'"} + %] + [% ELSE %] + [% caserun.build.name FILTER html %] + [% END %] + + + [% caserun.environment.name FILTER html %] + [% IF caserun.canedit %] + + [% END %] + + + [% caserun.assignee.login %] + [% caserun.testedby.login %] + + [% caserun.close_date FILTER time %] + + + + + [% caserun.status FILTER none %] + + + [% caserun.case.priority FILTER html %] + [% caserun.case.category.name FILTER html %] + [% caserun.case.components.0.name FILTER html %][% '...' IF caserun.case.components.size > 1 %] + + [% FOREACH bug = caserun.bugs %] + [% bug.bug_id FILTER bug_link(bug.bug_id) %] + [% END %] diff --git a/template/en/default/testopia/caserun/short-form.html.tmpl b/template/en/default/testopia/caserun/short-form.html.tmpl new file mode 100644 index 0000000..20bed38 --- /dev/null +++ b/template/en/default/testopia/caserun/short-form.html.tmpl @@ -0,0 +1,143 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%##### BEGIN Hidden Pane #####%] +[% PROCESS global/variables.none.tmpl %] + + +
+ + [%##### Action, Expected Results #####%] + + + + + + + + + + [% IF caserun.case.script OR caserun.case.arguments %] + + + + + [% END %] +
+
+ Setup:
[% caserun.case.text.setup %] +
+
+
+ Break Down:
[% caserun.case.text.breakdown %] +
+
+
+ Action:
[% caserun.case.text.action %] +
+
+
+ Expected Results:
[% caserun.case.text.effect %] +
+
Script:[% caserun.case.script FILTER html %] + Arguments:[% caserun.case.arguments FILTER html %]
+ + + + +
+ [%##### Status #####%] + + + + + + + + + + +
+
+ Status: +
+ [% FOREACH status = caserun.get_status_list %] +
+ [% IF NOT caserun.canedit %] + + [% status.name FILTER none %] (disabled) + [% ELSE %] + + [% status.name FILTER none %] + [% END %] +
+ [% END %] +
+ [%##### Notes #####%] +
Notes: Zoom
+
+
[% caserun.notes FILTER html %]
+
+
Components:
+ [% FOREACH comp = caserun.case.components %] + [% comp.name FILTER html %]
+ [% END %] +
+
Add Note:
+ + +
+ +
+ + [%##### Bugs #####%] +
+
+ Update [% terms.bug %] status +
[% terms.Bugs %] detected (all runs):
+
+ [ + [% FOREACH bug = caserun.case.bugs %] + [% bug.bug_id FILTER bug_link(bug.bug_id) %]  + [% END %] + ] +
+
+ Log a New Bug  +
+
+
+ [%##### Assignee #####%] +
+
+
+ Classic interface... + [% IF caserun.candelete %] +    Delete + [% END %] +
+
+
+
+
+ + diff --git a/template/en/default/testopia/caserun/show.html.tmpl b/template/en/default/testopia/caserun/show.html.tmpl new file mode 100644 index 0000000..173815d --- /dev/null +++ b/template/en/default/testopia/caserun/show.html.tmpl @@ -0,0 +1,160 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% title = "Test Case Run Log For Test Case: $caserun.case.summary" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] +[% PROCESS testopia/caserun/navigate.html.tmpl %] + + + + + +[%##### Overview #####%] + +
+

Overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test CaseTest RunTest Plan
[% caserun.case.id FILTER html %]: [% caserun.case.summary FILTER html %][% caserun.run.id FILTER html %]: [% caserun.run.summary FILTER html %][% caserun.run.plan.id FILTER html %]: [% caserun.run.plan.name %]
Test Case VersionProductStop Date
[% caserun.case.version FILTER html %][% caserun.run.plan.product.name FILTER html %][% caserun.close_date FILTER html %]
AssigneeStatusTested By
[% caserun.assignee.identity FILTER html %][% caserun.status FILTER html %][% caserun.testedby.identity FILTER html %]
+
+[% IF caserun.candelete %] +

+ Delete +

+[% END %] +

+[%##### Case Action & Expected Results #####%] +

Case Action & Expected Results

+
+ + + + + + + + + + + + + + + + + + + + + + +[% IF caserun.case.script OR caserun.case.arguments %] + + + + +[% END %] +
Setup
[% caserun.case.text.setup FILTER none %]
ActionExpected Results
[% caserun.case.text.action FILTER none %]
[% caserun.case.text.effect FILTER none %]
Breakdown
[% caserun.case.text.berakdown FILTER none %]
Script:[% caserun.case.script FILTER html %]Arguments:[% caserun.case.arguments FILTER html %]
+

Attachments

+
+[% PROCESS testopia/attachment/table.html.tmpl + item = caserun.case +%] +

+[% IF caserun.canedit %] +

Attributes

+ [% PROCESS testopia/caserun/form.html.tmpl %] +[% ELSE %] + [% IF caserun.case.bugs.size > 0 %] +

Bugs

+
+ [% PROCESS testopia/case/bugs.html.tmpl + item = caserun + %] + [% END %] +

Attributes

+ + + + + + + +
Notes
[% caserun.notes FILTER html %]
+[% END %] + +[% PROCESS global/footer.html.tmpl %] + diff --git a/template/en/default/testopia/caserun/table.html.tmpl b/template/en/default/testopia/caserun/table.html.tmpl new file mode 100644 index 0000000..5b7c8ee --- /dev/null +++ b/template/en/default/testopia/caserun/table.html.tmpl @@ -0,0 +1,80 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[% show_order = 0 %] + + + +

+Collapse All +Expand All +

+
+[% DECORATIVE_BORDER_100_BEGIN %] + +[%##### TABLE HEADER #####%] + [% link = "${table.get_order_url}&order=" %] + + + + + + + + + + + + + + + + + +[%##### Loop start #####%] +[% FOREACH caserun = table.list %] + [% index = loop.count %] + + + + + [% PROCESS "testopia/caserun/short-form-header.html.tmpl" %] + + + + + [% PROCESS "testopia/caserun/short-form.html.tmpl" %] + +[% END %] + +[% IF NOT table.viewall %] + [% PROCESS navigation %] +[% END %] +
+ Case IDIndexBuildEnvironmentAssignedTested byClose dateStatusPriorityCategoryComponentBugs
Summary:  + [% caserun.case.summary FILTER html %]
+ +[% DECORATIVE_BORDER_END %] +
diff --git a/template/en/default/testopia/category/delete.html.tmpl b/template/en/default/testopia/category/delete.html.tmpl new file mode 100644 index 0000000..c9712e3 --- /dev/null +++ b/template/en/default/testopia/category/delete.html.tmpl @@ -0,0 +1,43 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2006 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% PROCESS global/header.html.tmpl + title = "Delete Category $category.name From Product $product.name" +%] + +
+ + + + + +You are about to delete category '[% category.name FILTER html %]' from product + [% product.name FILTER html %].
+

Are you sure?

+ +
+

+[% IF plan_id %] +Back to test plan or +[% END %] +edit categories +

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/category/form.html.tmpl b/template/en/default/testopia/category/form.html.tmpl new file mode 100644 index 0000000..da66db5 --- /dev/null +++ b/template/en/default/testopia/category/form.html.tmpl @@ -0,0 +1,53 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2006 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% IF action == 'do_add' %] + [% title = "Create a New Category for $product.name" %] +[% ELSE %] + [% title = "Edit Category $category.name for $product.name" %] +[% END %] + +[% PROCESS global/header.html.tmpl %] + +
+ + + + + + + + + + + + + +
Category Name:
Category Description:
+ +
+

+[% IF plan_id %] +Back to test plan or +[% END %] +edit categories +

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/category/list.html.tmpl b/template/en/default/testopia/category/list.html.tmpl new file mode 100644 index 0000000..66619da --- /dev/null +++ b/template/en/default/testopia/category/list.html.tmpl @@ -0,0 +1,52 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2006 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% PROCESS global/header.html.tmpl + title = "Test Categories for $product.name" +%] + + + + + + +[% FOREACH cat = product.categories %] + + + + + +[% END %] +
NameDescriptionActions
[% cat.name FILTER html %][% cat.description FILTER html %] + Edit +[%- IF cat.candelete -%] + | Delete +[%- END %] +
+
+ [% IF user.in_group('Testers') %] + Add new + [% END %] +[% IF plan_id %] +

+Back to test plan +

+[% END %] +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/environment/add.html.tmpl b/template/en/default/testopia/environment/add.html.tmpl new file mode 100644 index 0000000..abe7ab3 --- /dev/null +++ b/template/en/default/testopia/environment/add.html.tmpl @@ -0,0 +1,86 @@ +[%# 1.0@bugzilla.org %][%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Create New Test Run Environment" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + +
+ +[%############################################################################%] +[%# New Environment #%] +[%############################################################################%] +

New Environment

+ + + + + + + + + +
Name:
Product:[% PROCESS select sel = { + name => 'product', + accesskey => 'p', + list => products, + } %] +
+ +
+ + +
+
+
+ +[%############################################################################%] +[%# Upload XML #%] +[%############################################################################%] +
+

OR Upload XML

+ + +
+ + Help
+

+ +

+
+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/environment/admin/category.html.tmpl b/template/en/default/testopia/environment/admin/category.html.tmpl new file mode 100644 index 0000000..a21a3d0 --- /dev/null +++ b/template/en/default/testopia/environment/admin/category.html.tmpl @@ -0,0 +1,50 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + # Michael Hight + #%] + +[%# INTERFACE: + # ... + #%] + +
+

Category Administration

+ + + + + + + + +
Parent Product: + +
Category Name:
+ +
+ + +
diff --git a/template/en/default/testopia/environment/admin/element.html.tmpl b/template/en/default/testopia/environment/admin/element.html.tmpl new file mode 100644 index 0000000..5033008 --- /dev/null +++ b/template/en/default/testopia/environment/admin/element.html.tmpl @@ -0,0 +1,122 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + # Brian Kramer + # Michael Hight + #%] + +[%# INTERFACE: + # ... + #%] + +
+

Element Administration

+ + + + + + + + + + + + + + + + + + + + +
Change Element Parent
+ + + + + + +
Product + + +[%### Product ###################################################################################### %] + +
+
+ + + + + +
Category +[%### Category ###################################################################################### %] + +
+
+ + + + + +
Parent +[%### Element ###################################################################################### %] + +
+
+
Element Name
+ + + + + +
Name:
+
+
+ +
\ No newline at end of file diff --git a/template/en/default/testopia/environment/admin/property.html.tmpl b/template/en/default/testopia/environment/admin/property.html.tmpl new file mode 100644 index 0000000..0788ac7 --- /dev/null +++ b/template/en/default/testopia/environment/admin/property.html.tmpl @@ -0,0 +1,51 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + # Michael Hight + # Scott Sudweeks + #%] + +[%# INTERFACE: + # ... + #%] + +
+

Property Administration

+ + + + + + + + + +
Assigned to Element: + +
Property Name:
+ +
+ + diff --git a/template/en/default/testopia/environment/admin/show.html.tmpl b/template/en/default/testopia/environment/admin/show.html.tmpl new file mode 100644 index 0000000..40b96b4 --- /dev/null +++ b/template/en/default/testopia/environment/admin/show.html.tmpl @@ -0,0 +1,74 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Environment Variable Administration" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +
+ + + + + +
+

This is the environment admin tool. +You can create, edit, and remove environment elements by right clicking on a node in the +tree. Changes are applied immediately unless prompted.

+

Elements in the --ANY PRODUCT-- product are those that can be considered product agnostic.

+
+ + + + + + + + + + + + + +
Legend
Environment Category
Environment Element
Element Property
+
+ +
+
[% PROCESS testopia/messages.html.tmpl %]
+ +[% PROCESS testopia/environment/admin/tree.html.tmpl %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/environment/admin/tree.html.tmpl b/template/en/default/testopia/environment/admin/tree.html.tmpl new file mode 100644 index 0000000..a3087ca --- /dev/null +++ b/template/en/default/testopia/environment/admin/tree.html.tmpl @@ -0,0 +1,464 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + # Brian Kramer + # Michael Hight + #%] + +[%# INTERFACE: + # ... + #%] + + + + + + + +
+
+
+
+
+
+
+
+ + + + + + + + + +

Environment Variables

+
+ +
+ +
+ [% IF type == 'classification' %] +
+ [% END %] + [% FOREACH item = toplevel %] +
0) %] >
+ [% END %] +
+
+
diff --git a/template/en/default/testopia/environment/admin/valid_exp.html.tmpl b/template/en/default/testopia/environment/admin/valid_exp.html.tmpl new file mode 100644 index 0000000..4bf5d04 --- /dev/null +++ b/template/en/default/testopia/environment/admin/valid_exp.html.tmpl @@ -0,0 +1,69 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + # Michael Hight + # Scott Sudweeks + #%] + +[%# INTERFACE: + # ... + #%] + + +

Property Value Administration

+ + + + + + + + + + + + + + + +
Values For:
[% property.name %]
+ + + +
+ +
+ Value: + + +
+ +
+ + +

You must click Save Changes for your changes to take effect

+ diff --git a/template/en/default/testopia/environment/choose.html.tmpl b/template/en/default/testopia/environment/choose.html.tmpl new file mode 100644 index 0000000..bb8e3cf --- /dev/null +++ b/template/en/default/testopia/environment/choose.html.tmpl @@ -0,0 +1,38 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Greg Hendricks + #%] + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Search by Test Run Environment Number" + %] + +
+

+ You may find a test environment by entering its id here: + + +

+ Or you can search for environments Here. +
+ +[% PROCESS global/footer.html.tmpl %] \ No newline at end of file diff --git a/template/en/default/testopia/environment/delete.html.tmpl b/template/en/default/testopia/environment/delete.html.tmpl new file mode 100644 index 0000000..4f54a9e --- /dev/null +++ b/template/en/default/testopia/environment/delete.html.tmpl @@ -0,0 +1,60 @@ +[%# 1.0@bugzilla.org %][%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Delete Environment $environment.name" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% IF deleted %] +Environment Deleted +[% ELSE %] +

You are about to permanantly delete this environment.

+ +[% IF environment.get_run_count OR environment.case_run_count %] + +This environment is being used by [% environment.get_run_count FILTER none %] +test runs and [% environment.case_run_count FILTER none %] case-runs. + +These will also be deleted. +[% END %] +

Warning: This action cannot be undone

+ +
+
+ + + +
+Back to Envrionment - [% environment.name FILTER html %] +[% END %] +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/environment/export.xml.tmpl b/template/en/default/testopia/environment/export.xml.tmpl new file mode 100644 index 0000000..8bf97bc --- /dev/null +++ b/template/en/default/testopia/environment/export.xml.tmpl @@ -0,0 +1,45 @@ +[%# 1.0@bugzilla.org %][%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Garrett Braden + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Export Environment XML" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + +

Environment XML

+ + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/environment/form.html.tmpl b/template/en/default/testopia/environment/form.html.tmpl new file mode 100644 index 0000000..7a1a0be --- /dev/null +++ b/template/en/default/testopia/environment/form.html.tmpl @@ -0,0 +1,96 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + + +
+ + + + + +
+This is the environment editor. +To add elements to your environment drag them from the available items on the tree to your right and +drop them on the environment tree on your left. Once you have chosen your elements, be sure to select +values for each of the properties. + + + + + + + + + + + + + + + + + +
Legend
Environment Category
Environment Element
Element Property
Selected Property Value
+
+ +
+ + + + + + [% END %] + + + + + + [% END %] + + + +[% IF environment.candelete %] + +[% END %] + +[% IF environment.canedit %] + + + +[% END %] +
Name + [% IF user.in_group('Testers') %] + Create a New Environment
Product + [% IF environment.canedit %] + [% PROCESS select sel = { + name => 'product_id', + list => user.get_selectable_products, + default => environment.product_id, + accesskey => 'p'} %] + [% ELSE %] + [% environment.product.name FILTER html %] + [% END %] + + [% IF user.in_group('Testers') %] + Edit Environment Variables
ArchiveDelete this Environment
\ No newline at end of file diff --git a/template/en/default/testopia/environment/import.xml.tmpl b/template/en/default/testopia/environment/import.xml.tmpl new file mode 100644 index 0000000..5a95351 --- /dev/null +++ b/template/en/default/testopia/environment/import.xml.tmpl @@ -0,0 +1,57 @@ +[%# 1.0@bugzilla.org %][%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Garrett Braden + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Import XML Environment" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + +[% IF action == "admin" %] +
+

Add the above new data?

+ + + +
+[% ELSE %] +
+

Upload XML Environment:

+ +

+
+[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/environment/list.html.tmpl b/template/en/default/testopia/environment/list.html.tmpl new file mode 100644 index 0000000..81de640 --- /dev/null +++ b/template/en/default/testopia/environment/list.html.tmpl @@ -0,0 +1,49 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Environments" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + +[% IF table.list.size > 0 %] + [% PROCESS testopia/environment/table.html.tmpl %] +[% ELSE %] + No environments found. +[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/environment/show.html.tmpl b/template/en/default/testopia/environment/show.html.tmpl new file mode 100644 index 0000000..f8832ab --- /dev/null +++ b/template/en/default/testopia/environment/show.html.tmpl @@ -0,0 +1,243 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + # Scott Sudweeks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Environment Editor" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] + + + + +
+
+
+ + +[% PROCESS testopia/messages.html.tmpl %] +[% PROCESS testopia/environment/form.html.tmpl %] + +
+ + + +[% IF environment.canedit %] + +[% END %] + +
+ + + + +

Environment: [% environment.name %]

+
+ +
+ +
+ +
+
+
+
+ + + + +

Environment Items

+
+ +
+ +
+ [% IF type == 'classification' %] +
+ [% END %] + [% FOREACH item = toplevel %] +
0) %] >
+ [% END %] +
+
+
+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/environment/table.html.tmpl b/template/en/default/testopia/environment/table.html.tmpl new file mode 100644 index 0000000..621fbe4 --- /dev/null +++ b/template/en/default/testopia/environment/table.html.tmpl @@ -0,0 +1,57 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[% link = "${table.get_order_url}&order=" %] + +[% DECORATIVE_BORDER_BEGIN %] + + + + + + + + [% FOREACH env = table.list %] + + + + + + [% END %] +
IDNameProductActions
[% env.id FILTER none %][% env.name FILTER none %][% env.product.name FILTER none %] + [% IF env.edit %] + [% env.isactive ? 'Archive' : 'Unarchive' %] + [% END %] + [% IF env.candelete %] +  |  + Delete + [% END %] +
+ [% IF NOT table.viewall %] + [% PROCESS navigation %] + [% END %] +[% DECORATIVE_BORDER_END %] + +
+Create a New Environment \ No newline at end of file diff --git a/template/en/default/testopia/export/csv.case.tmpl b/template/en/default/testopia/export/csv.case.tmpl new file mode 100644 index 0000000..d64370b --- /dev/null +++ b/template/en/default/testopia/export/csv.case.tmpl @@ -0,0 +1,87 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # David Koenig + #%] + +[%# Testopia Test Case CSV row export template #%] + +[% PROCESS global/variables.none.tmpl %] + +[% colsepchar = user.settings.csv_colsepchar.value %] + +[% FOREACH column = displaycolumns %] + [% SWITCH column %] + [% CASE 'action' %] + [% case.text.action FILTER csv %] + [% CASE 'author_id' %] + [% case.author.email FILTER csv %] + [% CASE 'blocks' %] + [% case.blocked_list FILTER csv %] + [% CASE 'break_down' %] + [% case.text.breakdown FILTER csv %] + [% CASE 'case_status_id' %] + [% case.status FILTER csv %] + [% CASE 'category_id' %] + [% case.category.name FILTER csv %] + [% CASE 'components' %] + [% FILTER csv %] + [% FOREACH component = case.components %] + [% component.name %](product=[% component.product_name %]) + [% IF component != case.components.last %] + [% colsepchar %] + [% END %] + [% END %] + [% END %] + [% CASE 'default_tester_id' %] + [% case.default_tester.email FILTER csv %] + [% CASE 'depends_on' %] + [% case.dependson_list FILTER csv %] + [% CASE 'expected_results' %] + [% case.text.effect FILTER csv %] + [% CASE 'isautomated' %] + [% case.isautomated ? "YES" : "NO" FILTER csv %] + [% CASE 'plans' %] + [% FILTER csv %] + [% FOREACH plan = case.plans %] + [% plan.id %] + [% IF plan != case.plans.last %] + [% colsepchar %] + [% END %] + [% END %] + [% END %] + [% CASE 'priority_id' %] + [% case.priority FILTER csv %] + [% CASE 'set_up' %] + [% case.text.setup FILTER csv %] + [% CASE 'tags' %] + [% FILTER csv %] + [% FOREACH tag = case.tags %] + [% tag.name %] + [% IF tag != case.tags.last %] + [% colsepchar %] + [% END %] + [% END %] + [% END %] + [% CASE DEFAULT %] + [% case.$column FILTER csv %] + [% END %] + [% IF column != displaycolumns.last %] + [% colsepchar %] + [% END %] +[% END %] \ No newline at end of file diff --git a/template/en/default/testopia/export/csv.caseheader.tmpl b/template/en/default/testopia/export/csv.caseheader.tmpl new file mode 100644 index 0000000..df82ff7 --- /dev/null +++ b/template/en/default/testopia/export/csv.caseheader.tmpl @@ -0,0 +1,37 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # David Koenig + #%] + +[%# Testopia Test Case CSV column header export template #%] + +[% PROCESS global/variables.none.tmpl %] + +[% colsepchar = user.settings.csv_colsepchar.value %] + +[% FOREACH column = displaycolumns %] + [% IF column == 'case_id' %] + [% column FILTER csv %] + [% ELSE %] + [% column FILTER remove('_id') FILTER csv %] + [% END %] + [% IF column != displaycolumns.last %] + [% colsepchar %] + [% END %] +[% END %] \ No newline at end of file diff --git a/template/en/default/testopia/export/xml.case.tmpl b/template/en/default/testopia/export/xml.case.tmpl new file mode 100644 index 0000000..22086ac --- /dev/null +++ b/template/en/default/testopia/export/xml.case.tmpl @@ -0,0 +1,77 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): David Koenig + #%] + +[%# Testopia Test Case XML export template #%] + +[% PROCESS global/variables.none.tmpl %] + + +[% IF case.text.action %] + [% case.text.action FILTER replace('<','&testopia_lt;') FILTER replace('>','&testopia_gt;') %] +[% END %] +[% IF case.alias %] + [% case.alias FILTER xml %] +[% END %] +[% IF case.arguments %] + [% case.arguments FILTER xml %] +[% END %] +[% FOREACH blocked_test_case = case.blocked %] + [% blocked_test_case.summary FILTER xml %] +[% END %] +[% IF case.text.breakdown %] + [% case.text.breakdown FILTER replace('<','&testopia_lt;') FILTER replace('>','&testopia_gt;') %] +[% END %] +[% IF case.category.name %] + [% case.category.name FILTER xml %] +[% END %] +[% FOREACH component = case.components %] + [% component.name FILTER xml %] +[% END %] +[% IF case.default_tester.email %] + [% case.default_tester.email FILTER xml %] +[% END %] + +[% FOREACH dependson_test_case = case.dependson %] + [% dependson_test_case.summary FILTER xml %] +[% END %] + +[% IF case.text.effect %] + [% case.text.effect FILTER replace('<','&testopia_lt;') FILTER replace('>','&testopia_gt;') %] +[% END %] +[% IF case.requirement %] + [% case.requirement FILTER xml %] +[% END %] +[% IF case.script %] + +[% END %] +[% IF case.text.setup %] + [% case.text.setup FILTER replace('<','&testopia_lt;') FILTER replace('>','&testopia_gt;') %] +[% END %] +[% IF case.summary %] + [% case.summary FILTER xml %] +[% END %] +[% FOREACH tag = case.tags %] + [% tag.name FILTER xml %] +[% END %] +[% FOREACH test_plan = case.plans %] + [% test_plan.name FILTER xml %] +[% END %] + + \ No newline at end of file diff --git a/template/en/default/testopia/export/xml.footer.tmpl b/template/en/default/testopia/export/xml.footer.tmpl new file mode 100644 index 0000000..d961014 --- /dev/null +++ b/template/en/default/testopia/export/xml.footer.tmpl @@ -0,0 +1,23 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): David Koenig + #%] + +[%# Testopia XML export footer template #%] + + \ No newline at end of file diff --git a/template/en/default/testopia/export/xml.header.tmpl b/template/en/default/testopia/export/xml.header.tmpl new file mode 100644 index 0000000..8a1bc58 --- /dev/null +++ b/template/en/default/testopia/export/xml.header.tmpl @@ -0,0 +1,28 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): David Koenig + #%] + +[%# Testopia XML export header template #%] + + + +"> +]> + \ No newline at end of file diff --git a/template/en/default/testopia/messages.html.tmpl b/template/en/default/testopia/messages.html.tmpl new file mode 100644 index 0000000..1812e6b --- /dev/null +++ b/template/en/default/testopia/messages.html.tmpl @@ -0,0 +1,50 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +[% goback=BLOCK %] +
+ Back to [% backlink.type FILTER none %] [% backlink.id FILTER none %] +[% END %] + +[% IF tr_message %] +

+
+ [% tr_message %] + [% IF backlink %] + [% goback %] + [% END %] +
+

+[% END %] + +[% IF tr_error %] +

+
+ [% tr_error %] + [% IF backlink %] + [% goback %] + [% END %] +
+

+[% END %] diff --git a/template/en/default/testopia/percent_bar.html.tmpl b/template/en/default/testopia/percent_bar.html.tmpl new file mode 100644 index 0000000..1052028 --- /dev/null +++ b/template/en/default/testopia/percent_bar.html.tmpl @@ -0,0 +1,44 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +
+ + + [%# IFs needed for Opera browser #%] + + + + + + +
[% run.percent_complete %]%
+
+ \ No newline at end of file diff --git a/template/en/default/testopia/plan/add.html.tmpl b/template/en/default/testopia/plan/add.html.tmpl new file mode 100644 index 0000000..6d92680 --- /dev/null +++ b/template/en/default/testopia/plan/add.html.tmpl @@ -0,0 +1,53 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% title = "Create a New Test Plan" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style +%] + + + + +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] +
+[% PROCESS testopia/plan/form.html.tmpl %] +
+[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/plan/choose.html.tmpl b/template/en/default/testopia/plan/choose.html.tmpl new file mode 100644 index 0000000..36eefef --- /dev/null +++ b/template/en/default/testopia/plan/choose.html.tmpl @@ -0,0 +1,51 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Greg Hendricks + #%] + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Choose a Test Plan" + %] + +
+

+ [% IF form_action == 'tr_new_run.cgi' %] + + [% END %] + [% IF type %] + + [% END %] + [% IF product %] + + [% PROCESS testopia/blocks.html.tmpl %] + [% PROCESS select sel = { name => 'plan_id', + list => product.plans, + accesskey => 'p' }%] + [% ELSE %] + Please enter a plan id: + + [% END %] + +

+
+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/plan/clone.html.tmpl b/template/en/default/testopia/plan/clone.html.tmpl new file mode 100644 index 0000000..b6734b8 --- /dev/null +++ b/template/en/default/testopia/plan/clone.html.tmpl @@ -0,0 +1,149 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = "Clone Test Plan: $plan.name" + style = style +%] + + + + + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Select Clone Options
New plan name:
Clone to product: + [% PROCESS select sel = { name => 'product_id', + list => user.get_selectable_products + accesskey => 'p' + default => plan.product_id + events => "onChange='getProdVers(this.value)'"} + %] +
Product version:[% PROCESS select sel = { name => 'prod_version', + list => plan.product.versions + accesskey => 'v' + default => plan.product_version } + %] +
Copy plan attachments:Yes No
Copy plan document:Yes No
Copy tags:Yes No
Copy permissions:Yes No
Maintain Plan and Case Authors:Yes No, make me the author of the new cases.
Copy/Link test cases: + Copy + Link + No
Copy/Link test cases from selected + categories only: + [% PROCESS select sel = { name => 'clone_categories', + list => plan.get_used_categories + accesskey => 'c' + mult => 1 + elements => 5 + default => 'all'} + %] +
+ +
+

Back +to test plan

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/plan/delete.html.tmpl b/template/en/default/testopia/plan/delete.html.tmpl new file mode 100644 index 0000000..6092704 --- /dev/null +++ b/template/en/default/testopia/plan/delete.html.tmpl @@ -0,0 +1,63 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = "Delete Test plan $plan.name" +%] + +[% IF NOT deleted %] +You are about to permanently delete this test plan with all its history. +
+This test plan is used by [% plan.test_run_count FILTER none %] run(s) which will also be deleted.
+There are [% plan.test_case_count FILTER none %] cases(s) in this plan. +Any test case that is not linked to another test plan will also be deleted!
+Warning: This action cannot be undone +
+
+
+ + + +
+ +Go back + +[% ELSE %] + +Test plan deleted. + +[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/plan/form.html.tmpl b/template/en/default/testopia/plan/form.html.tmpl new file mode 100644 index 0000000..a1068bb --- /dev/null +++ b/template/en/default/testopia/plan/form.html.tmpl @@ -0,0 +1,88 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + # Tyler Peterson + #%] + + + + + + + +[% IF form_action == "tr_show_plan.cgi" %] + [% versions = plan.product.versions %] +[% END %] + + + + + + + [% END %] + + + + + + + + + +
NameProduct[% IF plan.test_case_count OR plan.test_run_count %] + + [% plan.product.name FILTER html %] + [% ELSE %] + [% PROCESS select sel = { name => 'product_id', + list => user.get_selectable_products, + accesskey => 'p' + default => plan.product_id + events => "onChange='getProdVers(this.value)'"} %]
+ [% IF UserInGroup('admin') %] + Type + [% ELSE %] + Type + [% END %] + [% PROCESS select sel = { name => 'type', + list => plan.get_plan_types, + accesskey => 't' + default => plan.plan_type } %]Product Version[% PROCESS select sel = { name => 'prod_version', + list => versions, + accesskey => 'v' + default => plan.product_version } %]
+[% UNLESS plan.test_case_count OR plan.test_run_count %] + +[% END %] +

+ +

+

Plan Document

+
[% plan.text FILTER xss %]
+ + diff --git a/template/en/default/testopia/plan/history.html.tmpl b/template/en/default/testopia/plan/history.html.tmpl new file mode 100644 index 0000000..b7b665c --- /dev/null +++ b/template/en/default/testopia/plan/history.html.tmpl @@ -0,0 +1,115 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Plan History for Plan $plan.id: $plan.name" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + + + + + + + + + +[% FOREACH row = plan.history %] + + + + + + + +[% END %] +
WhoWhenWhatOld ValueNew Value
[% row.who FILTER html %][% row.changed FILTER time %][% row.what FILTER html %][% row.oldvalue FILTER html %][% row.newvalue FILTER html %]
+

+

Diff Plan Document

+
+ + + + + + + + + + + + + + +
Diff Versions
Version: + + Version: + +
+ +
+
+  [% diff FILTER html %]
+
+
+

+Back to plan +

+[% PROCESS global/footer.html.tmpl %] + +[% BLOCK version %] + [% i = 1 %] + [% WHILE i <= plan.version %] + + [% i = i +1 %] + [% END %] +[% END %] diff --git a/template/en/default/testopia/plan/list-product.html.tmpl b/template/en/default/testopia/plan/list-product.html.tmpl new file mode 100644 index 0000000..f1da252 --- /dev/null +++ b/template/en/default/testopia/plan/list-product.html.tmpl @@ -0,0 +1,76 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[%# PROCESS global/variables.none.tmpl %] + +[% title = "Test Plans by Product" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style +%] + +[% PROCESS testopia/style.none.tmpl %] + +

Please select a product from the list to view its list of test plans:

+ +[% IF classifications %] + [% FOREACH c = classifications %] +

[% c.name FILTER html %]

+
+ [% PROCESS table products = c.viewable_products %] +
+
+ [% END %] +[% ELSE %] + [% PROCESS table %] +[% END %] +[% PROCESS global/footer.html.tmpl %] + +[% BLOCK table %] + + + + + + + + [% FOREACH prod = products %] + + + + + + [% END %] +
ProductDescriptionPlans
[% prod.name %][% prod.description%][% prod.test_plan_count %]
+ +[% END %] diff --git a/template/en/default/testopia/plan/list.html.tmpl b/template/en/default/testopia/plan/list.html.tmpl new file mode 100644 index 0000000..e5cd251 --- /dev/null +++ b/template/en/default/testopia/plan/list.html.tmpl @@ -0,0 +1,123 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Plans" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + + + + + + + +[% PROCESS testopia/plan/table.html.tmpl %] + +

+[% IF table.list_count == 0 %] +No test plans +[% ELSE %] + [% IF table.list_count == 1 %] + One test plan + [% ELSE %] + [% table.list_count %] test plans + [% END %] +[% END %] +found. +

+ +[% IF dotweak AND table.list_count %] +

Update Selected Test Plans

+ + + + + + + + + + + + + + + + + + + + +
Type + [% PROCESS select sel = { name => 'plan_type', + accesskey => 't', + list => type_list + default => "--Do Not Change--" } %] + Product + [% PROCESS select sel = { name => 'product_id', + accesskey => 'p', + list => product_list + default => "--Do Not Change--" + events => "onChange='getProdVers(this.value, $plan.id)'"} %] + Product Version + [% PROCESS select sel = { name => 'prod_version', + accesskey => 'p', + list => prodver_list + default => "--Do Not Change--" } %] +
Archive/UnarchiveAdd Tags
+Create a new test case linked to plans listed here +

+ +

+ +[% END %] + +[% PROCESS "testopia/saved-search.html.tmpl" %] +[%############################################################################%] +[%# Page Footer #%] +[%############################################################################%] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/plan/navigate.html.tmpl b/template/en/default/testopia/plan/navigate.html.tmpl new file mode 100644 index 0000000..6815c52 --- /dev/null +++ b/template/en/default/testopia/plan/navigate.html.tmpl @@ -0,0 +1,67 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Greg Hendricks + #%] + +[% list = case_table.get_saved_list('plan') %] +Plan List: +[% IF list > 0 %] +[% curr = lsearch(list, plan.id) %] +[% IF curr != -1 && (curr > 0) %] + << First +[% ELSE %] + <<First +[% END %] + + [% IF plan %] + [% IF curr != -1 %] + [% IF curr > 0 %] + [% prev = curr - 1 %] + < Prev + [% ELSE %] + Prev + [% END %] + + [% IF curr != -1 %] +   ([% curr + 1 %] of [% list.size %])   + [% END %] + + [% IF curr + 1 < list.size %] + [% next = curr + 1 %] + Next > + [% ELSE %] + Next + [% END %] + [% END %] + [% ELSE %] +    + [% END %] + +[% IF curr != -1 && (curr + 1 < list.size) %] + Last >> +[% ELSE %] + Last>> +[% END %] + +[% ELSE %] + [%# With no list, don't show link to search results %] +    + No search results available +[% END %] diff --git a/template/en/default/testopia/plan/show.csv.tmpl b/template/en/default/testopia/plan/show.csv.tmpl new file mode 100644 index 0000000..33eff14 --- /dev/null +++ b/template/en/default/testopia/plan/show.csv.tmpl @@ -0,0 +1,33 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # David Koenig + #%] + +[%# Testopia Test Case list CSV export template #%] + +[% PROCESS global/variables.none.tmpl %] + +[% colsepchar = user.settings.csv_colsepchar.value %] + +[% PROCESS testopia/export/csv.caseheader.tmpl %] + +[% FOREACH test_case = case_table.list %] + [% PROCESS testopia/export/csv.case.tmpl case=test_case %] + +[% END %] \ No newline at end of file diff --git a/template/en/default/testopia/plan/show.html.tmpl b/template/en/default/testopia/plan/show.html.tmpl new file mode 100644 index 0000000..1390b3f --- /dev/null +++ b/template/en/default/testopia/plan/show.html.tmpl @@ -0,0 +1,287 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% SET title = "Test Plan $plan.id: $plan.name" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style +%] + +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] + + + + + + + + + + +[% PROCESS testopia/plan/navigate.html.tmpl %] + +[%##### Overview #####%] + +
+
+

Overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
ProductProduct Version Created
[% plan.product.name FILTER html %][% plan.product_version FILTER html %][% plan.creation_date FILTER time %]
AuthorPlan VersionType
[% plan.author.identity FILTER html %][% plan.version FILTER html %][% plan.plan_type FILTER html %]
+ + [% IF plan.canedit %] + Edit Plan Attributes + [% END %] + [% IF plan.canadmin %] +  | Edit Access Controls + [% END %] + +
+ + [% IF plan.canedit %] + + + [% END %] + + [% IF user.in_group('Testers'); %] + + [% END %] + + [% IF plan.candelete %] + + [% END %] +
+
+ +[%##### Categories and Tags #####%] +

Categories and Tags

+
+ + + + + + + + + + + + +[% IF user.in_group('Testers') %] + + + + +[% END %] +
CategoriesTagsBuilds
+ [% PROCESS select sel = { list => plan.product.categories + accesskey => 'c' + elements => 7 } %] +
+
+ +
+ [% PROCESS testopia/tag/table.html.tmpl + item = plan + type = 'plan' + %] +
+
+ [% PROCESS select sel = { list => plan.product.builds + accesskey => 'b' + elements => 7 } %] +
+
Add

Add

+
+ +[%##### Test Cases #####%] +

+

Test Cases

+
+[% IF case_table.list_count > 0 AND plan.canedit %] + Create a New Test Case +[% END %] +[% PROCESS testopia/case/table.html.tmpl + table = case_table %] +[% IF plan.canedit %] + Create a New Test Case |  +[% END %] + List Cases +
+ +[%##### Test Runs #####%] +

+

Test Runs

+
+[% IF run_table.list_count > 0 AND plan.canedit %] +Create a New Test Run
+[% END %] +[% PROCESS testopia/run/table.html.tmpl + table = run_table %] +[% IF plan.canedit %] + Create a New Test Run |  +[% END %] + List Runs +
+[%##### Attachments #####%] +

+

Attachments

+
+[% PROCESS testopia/attachment/table.html.tmpl + item = plan +%] +
+[%### Reports ###%] +

+

Reports

+Build Coverage
+General Reports
+Printable Percentage Report
+[% IF plan.bugs %] +Top Bugs
+Bugs Found in this Plan
+[% END %] +[%##### Edit Plan #####%] +
+[% IF plan.canedit %] +

Attributes

+
+ [% PROCESS testopia/plan/form.html.tmpl %] +
+[% ELSE %] +[%##### Plan Document #####%] +

Plan Document

+
+ [% plan.text %] +
+ +[% END %] +
+ +[% IF case_table.list_count >0 %] +
+ +
+[% END %] + +[%##### Footer #####%] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/plan/show.print.tmpl b/template/en/default/testopia/plan/show.print.tmpl new file mode 100644 index 0000000..8e35c8a --- /dev/null +++ b/template/en/default/testopia/plan/show.print.tmpl @@ -0,0 +1,145 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2006 Novell. + # All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + + + Test Plan [% plan.id FILTER html %] - [% plan.name FILTER html %] + + + +

Test Plan [% plan.id FILTER html %] - [% plan.name FILTER html %]

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
Tags
+ [% FOREACH tag = plan.tags %] + [% tag.tag_name FILTER html %]
+ [% END %] +
+[% IF plan.test_runs AND NOT printdoc %] +
+

Pass/Fail Rundown By Build

+ + + + [% FOREACH status = plan.test_runs.0.caseruns.0.get_status_list %] + + [% END %] + +[% FOREACH build = plan.builds_seen %] + + + [% FOREACH status = plan.test_runs.0.caseruns.0.get_status_list %] + + [% END %] + +[% END %] +
 
+ +
+

Pass/Fail Rundown By Environment

+ + + + [% FOREACH status = plan.test_runs.0.caseruns.0.get_status_list %] + + [% END %] + +[% FOREACH environment = plan.environments_seen %] + + + [% FOREACH status = plan.test_runs.0.caseruns.0.get_status_list %] + + [% END %] + +[% END %] +
 
+ +
+

Pass/Fail Rundown By Run

+ + + + [% FOREACH status = plan.test_runs.0.caseruns.0.get_status_list %] + + [% END %] + +[% FOREACH run = plan.test_runs %] + + + [% FOREACH status = plan.test_runs.0.caseruns.0.get_status_list %] + + [% END %] + +[% END %] +
 
+
+

Pass/Fail Totals

+ + + + [% FOREACH status = plan.test_runs.0.caseruns.0.get_status_list %] + + [% END %] + + + + [% FOREACH status = plan.test_runs.0.caseruns.0.get_status_list %] + + [% END %] + +
 
+[% END %] +[% IF printdoc %] +
+

Plan Document

+[% plan.text FILTER xss %] +[% END %] \ No newline at end of file diff --git a/template/en/default/testopia/plan/show.xml.tmpl b/template/en/default/testopia/plan/show.xml.tmpl new file mode 100644 index 0000000..38a2d9f --- /dev/null +++ b/template/en/default/testopia/plan/show.xml.tmpl @@ -0,0 +1,31 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): David Koenig + #%] + +[%# Testopia Test Case list XML export template #%] + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS testopia/export/xml.header.tmpl -%] + +[% FOREACH test_case = case_table.list %] + [%+ PROCESS testopia/export/xml.case.tmpl case=test_case %] +[% END %] + +[%- PROCESS testopia/export/xml.footer.tmpl %] \ No newline at end of file diff --git a/template/en/default/testopia/plan/table.html.tmpl b/template/en/default/testopia/plan/table.html.tmpl new file mode 100644 index 0000000..4afbe61 --- /dev/null +++ b/template/en/default/testopia/plan/table.html.tmpl @@ -0,0 +1,80 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[% PROCESS testopia/blocks.html.tmpl %] +[% IF table.list_count %] + [% IF dotweak %] +Select: +All, +None + [% END %] + +[% link = "${table.get_order_url}&order=" %] +[% DECORATIVE_BORDER_100_BEGIN %] + + + + [% IF dotweak %][% END %] + + + + + + + + + + + + +[% FOREACH plan = table.list %] + + + [% IF dotweak %] + + + + + + + + + + + + +[% END %] + + +
ID[% table.arrow IF table.last_sort == 'alias' %]Name[% table.arrow IF table.last_sort == 'alias' %]Author[% table.arrow IF table.last_sort == 'alias' %]Created[% table.arrow IF table.last_sort == 'alias' %]Product[% table.arrow IF table.last_sort == 'alias' %]Product Version[% table.arrow IF table.last_sort == 'alias' %]Type[% table.arrow IF table.last_sort == 'alias' %]CasesRunsArchived[% table.arrow IF table.last_sort == 'alias' %]
[% END %] + + [% plan.id FILTER html %][% plan.name FILTER html %][% plan.author.login FILTER html %][% plan.creation_date FILTER time %][% plan.product.name FILTER html %][% plan.product_version FILTER html %][% plan.plan_type FILTER html %] + [% plan.test_case_count FILTER html %] + + [% plan.test_run_count FILTER html %] + + [% plan.isactive ? 'No' : 'Yes' %] +
+[% IF NOT table.viewall %] +[% PROCESS navigation %] +[% END %] +[% DECORATIVE_BORDER_END %] +[% END %] diff --git a/template/en/default/testopia/progress.html.tmpl b/template/en/default/testopia/progress.html.tmpl new file mode 100644 index 0000000..ef76fa3 --- /dev/null +++ b/template/en/default/testopia/progress.html.tmpl @@ -0,0 +1,45 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # complete: The number processed up till now + # total: The total number to process + #%] + +[% SET percent = ((complete / total) * 100) %] + + + + Processing + + +

Processing...

+

[% process FILTER html %]

+ +
+ + + + + +
+ + \ No newline at end of file diff --git a/template/en/default/testopia/quicksearch.html.tmpl b/template/en/default/testopia/quicksearch.html.tmpl new file mode 100644 index 0000000..11eac23 --- /dev/null +++ b/template/en/default/testopia/quicksearch.html.tmpl @@ -0,0 +1,122 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% PROCESS global/header.html.tmpl %] + +
Testopia Quick Search:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ObjectPrefix
+

TEST CASE +

(Optional for cases) +
    +
  • case
  • +
  • TC
  • +
  • c
  • +
+
+

TEST PLAN +

+
    +
  • plan
  • +
  • TP
  • +
  • p
  • +
+
+

TEST RUN +

+
    +
  • run
  • +
  • TR
  • +
  • r
  • +
+
+

TEST RUN ENVIRONMENT +

+
    +
  • env
  • +
  • TE
  • +
  • e
  • +
+
+

TEST CASE-RUN +

+
    +
  • caserun
  • +
  • TCR
  • +
  • cr
  • +
+
+

TAGS +

+
    +
  • tag
  • +
+
+
+
+ +Examples:
+To find test run #45 you could enter +run: 45 or, tr-45, or simply r 45. The delimiters (: and -) +are optional but a space is required if they are not used. +

To find environments with the word +'linux' in the name, you could enter e:linux

+

Quick search searches for the object +by ID number or by searching the summary or name for the search terms +provided.

+

Leaving off the prefix will search +for Test Cases.

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/reports/bug-count.html.tmpl b/template/en/default/testopia/reports/bug-count.html.tmpl new file mode 100644 index 0000000..1393261 --- /dev/null +++ b/template/en/default/testopia/reports/bug-count.html.tmpl @@ -0,0 +1,47 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[% title = "Bug Impact Report for Plan $plan.id - $plan.name" %] +[% PROCESS global/header.html.tmpl %] + +

This report details the bugs detected in this test plan and the number of test cases that each bug is attached to. +Those bugs impacting the most test cases appear at the top. +Click the link under Test Cases to be taken to a list of those cases. +

+ + + + + +[% FOREACH row = bug_table %] + + + + +[% END %] +
# of Test CasesBug
[% row.casecount FILTER html %][% row.bug_id FILTER bug_link(row.bug_id) %]
+

+Back to plan. +

+[% PROCESS global/footer.html.tmpl %] \ No newline at end of file diff --git a/template/en/default/testopia/reports/bug-severity-status-form.html.tmpl b/template/en/default/testopia/reports/bug-severity-status-form.html.tmpl new file mode 100644 index 0000000..fcbf63d --- /dev/null +++ b/template/en/default/testopia/reports/bug-severity-status-form.html.tmpl @@ -0,0 +1,126 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test run report - Bugs severity status" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style +%] + +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] + +[% PROCESS testopia/navlinks.html.tmpl + request = "BackToTestRun" +%] + +
+ +[% PROCESS testopia/run/edit.html.tmpl + canmanage = 0 +%] +
+
+ + + + + + + [% PROCESS select sel = { name => "output", + list => types + default => version } %] + + + + + [% PROCESS select sel = { name => "severity", + list => bug_severity + mult => 1 } %] + + + + + [% PROCESS select sel = { name => "testers", + list => testers + mult => 1 } %] + + + + + + + + + + + + + + + + +
Output type:
[% terms.Bug %] severity:
Who detected:
Totals Only:
Links to [% terms.Bugs %]:
+
+ +

+[% PROCESS testopia/navlinks.html.tmpl + request = "BackToTestRun" +%] +

+ +[% PROCESS global/footer.html.tmpl %] + +[%############################################################################%] +[%# Block for SELECT fields #%] +[%############################################################################%] + +[% BLOCK select %] + + + +[% END %] diff --git a/template/en/default/testopia/reports/bug-stats-form.html.tmpl b/template/en/default/testopia/reports/bug-stats-form.html.tmpl new file mode 100644 index 0000000..e39da63 --- /dev/null +++ b/template/en/default/testopia/reports/bug-stats-form.html.tmpl @@ -0,0 +1,134 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test run report - Bugs detected" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style +%] + +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] + +[% PROCESS testopia/navlinks.html.tmpl + request = "BackToTestRun" +%] + +
+ +[% PROCESS testopia/run/edit.html.tmpl + canmanage = 0 +%] +
+
+ + + + + + + [% PROCESS select sel = { name => "output", + list => types + default => version } %] + + + + + [% PROCESS select sel = { name => "status", + list => stats + mult => 1 } %] + + + + + [% PROCESS select sel = { name => "resolution", + list => res + mult => 1 } %] + + + + + + [% PROCESS select sel = { name => "testers", + list => testers + mult => 1 } %] + + + + + + + + + + + + + + + + +
Output type:
[% terms.Bug %] status:
[% terms.Bug %] resolution:
Who detected:
Totals Only:
Links to [% terms.Bugs %]:
+
+ +

+[% PROCESS testopia/navlinks.html.tmpl + request = "BackToTestRun" +%] +

+ +[% PROCESS global/footer.html.tmpl %] + +[%############################################################################%] +[%# Block for SELECT fields #%] +[%############################################################################%] + +[% BLOCK select %] + + + +[% END %] diff --git a/template/en/default/testopia/reports/build-coverage.html.tmpl b/template/en/default/testopia/reports/build-coverage.html.tmpl new file mode 100644 index 0000000..ca40edb --- /dev/null +++ b/template/en/default/testopia/reports/build-coverage.html.tmpl @@ -0,0 +1,103 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Build Coverage Report for Plan $plan.id: $plan.name" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +

Summary of all runs

+ + + +[% FOREACH b = report.build_ids %] + +[% END %] + +[% FOREACH case = report.keys %] + [% IF case == 'builds' OR case == 'build_ids' %] + [% NEXT %] + [% END %] + + + [% FOREACH bid = report.builds.keys %] + + [% END %] + +[% END %] +
 
[% report.$case.name %] + [% IF report.$case.$bid.status %] + + [% report.$case.$bid.status %] + [% ELSE %] +   + [% END %] +
+ +

+

Individual Runs

+[% FOREACH run = run_reports.keys %] + Test Run [% run %]: [% run_reports.$run.name %] + + + + [% FOREACH rb = report.build_ids %] + + [% END %] + + [% FOREACH case = run_reports.$run.keys %] + [% IF case == 'name' %] + [% NEXT %] + [% END %] + + + [% FOREACH bid = report.builds.keys %] + + [% END %] + + [% END %] +
 
[% run_reports.$run.$case.name %] + [% IF run_reports.$run.$case.$bid.status %] + + [% run_reports.$run.$case.$bid.status %] + [% ELSE %] +   + [% END %] +
+

+[% END %] +

+Back to plan +

+[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/reports/header.html.tmpl b/template/en/default/testopia/reports/header.html.tmpl new file mode 100644 index 0000000..e9f3b7c --- /dev/null +++ b/template/en/default/testopia/reports/header.html.tmpl @@ -0,0 +1,68 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Product:[% product %]Product version:[% product_version %]
Plan:[% plan_name %]Plan version:[% plan_version %]
Platform:[% rep_platform %]OS:[% op_sys %]
Summary:[% test_run_summary %]
Notes:
[% test_run_notes %]
Start date:[% start_date %]Stop date: +[% IF test_run_status == 'running' %] +<running> +[% ELSE %] +[% stop_date %] +[% END %] +
+
diff --git a/template/en/default/testopia/reports/incident.html.tmpl b/template/en/default/testopia/reports/incident.html.tmpl new file mode 100644 index 0000000..456ea4d --- /dev/null +++ b/template/en/default/testopia/reports/incident.html.tmpl @@ -0,0 +1,124 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Incident Report" %] + +[%############################################################################%] +[%# Page #%] +[%############################################################################%] + + + + + +[% title %] + + + + + +

[% title %]

+ +[% PROCESS testopia/reports/header.html.tmpl %] + +

Failed test cases:

+ +[% IF caseslogs.size > 0 %] + + + + + + + + + + + +[% FOREACH log = caseslogs %] +[% IF log.notes %] + [% td_class = '' %] +[% ELSE %] + [% td_class = 'class="sep"' %] +[% END %] + + + + + + + + + + +[% IF log.notes %] + + + + +[% END %] +[% END %] +
Closed atIDSummaryCase IDTested byComponentGroupReported
[% terms.bug %] IDs
[% log.closed_date %][% log.id FILTER none %][% log.summary %][% log.case_id FILTER none %][% log.testedby %][% log.component %][% log.group %] + [% i = 1 %] + [% FOREACH bug = log.bug_list %][% bug %][% IF i < log.bug_list.size %], [% END %][% i=i+1 %][% END %] +
Notes:[% log.notes %]
+[% END %] + +

Total: [% caseslogs.size %]

+ +

Reported [% terms.bugs %]:

+ +[% IF bugs.size > 0 %] + + + + + + + + + +[% FOREACH bug = bugs %] + + + + + + + + +[% END %] +
IDSummarySeverityStatusProductComponent
[% bug.id FILTER none %][% bug.short_desc %][% bug.severity %][% bug.status %][% bug.product_name %][% bug.component_name %]
+[% END %] + +

Total: [% bugs.size %]

+ + + diff --git a/template/en/default/testopia/reports/log.html.tmpl b/template/en/default/testopia/reports/log.html.tmpl new file mode 100644 index 0000000..7ddc9bf --- /dev/null +++ b/template/en/default/testopia/reports/log.html.tmpl @@ -0,0 +1,121 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Log Report" %] + +[%############################################################################%] +[%# Page #%] +[%############################################################################%] + + + + + +[% title %] + + + + + +

[% title %]

+ +[% PROCESS testopia/reports/header.html.tmpl %] + +

Run test cases:

+ +[% IF caseslogs.size > 0 %] + + + + + + + + + + + +[% FOREACH log = caseslogs %] +[% IF log.notes %] + [% td_class = '' %] +[% ELSE %] + [% td_class = 'class="sep"' %] +[% END %] + + + + + + + + + + +[% IF log.notes %] + + + + +[% END %] +[% END %] +
Closed atIDSummaryCase IDTested byComponentGroupStatus
[% log.closed_date %][% log.id FILTER none %][% log.summary %][% log.case_id FILTER none %][% log.testedby %][% log.component %][% log.group %][% log.status %]
Notes:[% log.notes %]
+[% END %] + +

Total: [% caseslogs.size %]

+ + +

Pending test cases:

+ +[% IF idlecaseslogs.size > 0 %] + + + + + + + + +[% FOREACH log = idlecaseslogs %] + + + + + + + +[% END %] +
IDSummaryCase IDComponentGroup
[% log.id FILTER none %][% log.summary %][% log.case_id FILTER none %][% log.component %][% log.group %]
+[% END %] + +

Total: [% idlecaseslogs.size %]

+ +

Test run completed: [% completed %] %

+ + diff --git a/template/en/default/testopia/reports/report-bar.png.tmpl b/template/en/default/testopia/reports/report-bar.png.tmpl new file mode 100644 index 0000000..4f21c94 --- /dev/null +++ b/template/en/default/testopia/reports/report-bar.png.tmpl @@ -0,0 +1,58 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + #%] + +[% PROCESS global/variables.none.tmpl %] + +[% y_label = report.type %] + +[% PROCESS "global/field-descs.none.tmpl" %] + +[% col_field_disp = field_descs.$col_field || col_field %] + + +[% FILTER null; + USE graph = GD.Graph.bars(report.width, report.height); + + graph.set(x_label => col_field_disp, + y_label => y_label, + y_tick_number => 8, + y_number_format => "%d", + x_label_position => 0.5, + x_labels_vertical => x_labels_vertical, + bar_spacing => 8, + shadow_depth => 4, + shadowclr => 'dred', + show_values => 1, + legend_placement => "RT"); + + graph.set(cumulate => "true", + show_values => 0) IF cumulate; + + # Workaround for the fact that set_legend won't take report.row_names directly, + # because report.row_names is an array reference rather than an array. + graph.set_legend(report.row_names.0, report.row_names.1, report.row_names.2, report.row_names.3, + report.row_names.4, report.row_names.5, report.row_names.6, report.row_names.7, + report.row_names.8, report.row_names.9, report.row_names.10, report.row_names.11, + report.row_names.12, report.row_names.13, report.row_names.14, report.row_names.15); + + graph.plot(data.0).png | stdout(1); + END; +-%] diff --git a/template/en/default/testopia/reports/report-line.png.tmpl b/template/en/default/testopia/reports/report-line.png.tmpl new file mode 100644 index 0000000..3b1555e --- /dev/null +++ b/template/en/default/testopia/reports/report-line.png.tmpl @@ -0,0 +1,52 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + #%] + +[% IF cumulate %] + [% USE graph = GD.Graph.area(report.width, report.height) %] + [% graph.set(cumulate => "true") %] +[% ELSE %] + [% USE graph = GD.Graph.lines(report.width, report.height) %] +[% END %] + +[% FILTER null; + graph.set(x_label => report.col_field, + y_label => report.type, + y_tick_number => 8, + x_label_position => 0.5, + x_labels_vertical => x_labels_vertical, + legend_placement => "RT", + line_width => 2, + dclrs => ["lred", "lgreen", "lblue", "lyellow", + "lpurple", "lorange", "black", "green", + "blue", "dpink", "lbrown", "gray", + "red", "dpurple", "gold", "marine"]); + + # Workaround for the fact that set_legend won't take report.row_names directly, + # because report.row_names is an array reference rather than an array. + graph.set_legend(report.row_names.0, report.row_names.1, report.row_names.2, report.row_names.3, + report.row_names.4, report.row_names.5, report.row_names.6, report.row_names.7, + report.row_names.8, report.row_names.9, report.row_names.10, report.row_names.11, + report.row_names.12, report.row_names.13, report.row_names.14, report.row_names.15); + + graph.plot(data.0).png | stdout(1); + END; +-%] + diff --git a/template/en/default/testopia/reports/report-pie.png.tmpl b/template/en/default/testopia/reports/report-pie.png.tmpl new file mode 100644 index 0000000..68a9e48 --- /dev/null +++ b/template/en/default/testopia/reports/report-pie.png.tmpl @@ -0,0 +1,34 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[% FILTER null; + USE graph = GD.Graph.pie(width, height); + graph.set(title => chart_title, + pie_height => 10, + dclrs => colors, + ); + + graph.plot(data).png | stdout(1); + END; +-%] diff --git a/template/en/default/testopia/reports/report-table.html.tmpl b/template/en/default/testopia/reports/report-table.html.tmpl new file mode 100644 index 0000000..21980e5 --- /dev/null +++ b/template/en/default/testopia/reports/report-table.html.tmpl @@ -0,0 +1,161 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # + #%] + +[%# INTERFACE: + # report.listbase: The base query for this table, in URL form + # report.col_field: string. Name of the field being plotted as columns. + # report.row_field: string. Name of the field being plotted as rows. + # report.tbl_field: string. Name of the field being plotted as tables. + # report.col_names: array. List of values for the field being plotted as columns. + # report.row_names: array. List of values for the field being plotted as rows. + # report.data: . Data to plot. Only data.$tbl is accessed. + # tbl: Name of a hash in data which is the table to be plotted. + #%] + +[% PROCESS "global/field-descs.none.tmpl" %] + +[% col_field_disp = field_descs.$col_field || report.col_field %] +[% row_field_disp = field_descs.$row_field || report.row_field %] + +[% IF tbl == "-total-" %] + [% urlbase = BLOCK %]buglist.cgi?[% report.listbase %] + [% "&$tbl_vals" IF tbl_vals %][% END %] +[% ELSE %] + [% urlbase = BLOCK %][% report.url_loc FILTER url_quote %]?[% report.listbase %]& + [% report.tbl_field FILTER url_quote %]=[% tbl FILTER url_quote %][% END %] +[% END %] + + + [% IF report.tbl_field %] + + + + + [% END %] + + + + + + + + + +
+ +

[% tbl_disp FILTER html %]

+
+ + [% col_field_disp FILTER html %] +
+ [% row_field_disp FILTER html %] + + + +[% classes = [ [ "t1", "t2" ] , [ "t3", "t4" ] ] %] +[% col_idx = 0 %] +[% row_idx = 0 %] +[% grand_total = 0 %] + + + [% IF report.col_field %] + + + [% FOREACH col = report.col_names %] + [% col_totals.$col = 0 %] + [% NEXT IF col == "" %] + + [% col_idx = 1 - col_idx %] + + [% END %] + + + [% END %] + + [% FOREACH row = report.row_names %] + [% row_total = 0 %] + + [% row_idx = 1 - row_idx %] + + + [% FOREACH col = report.col_names %] + [% row_total = row_total + report.data.$tbl.$col.$row %] + [% NEXT IF col == "" %] + [% col_totals.$col = col_totals.$col + report.data.$tbl.$col.$row %] + + [% col_idx = 1 - col_idx %] + + [% END %] + + + [% END %] + + + [% row_idx = 1 - row_idx %] + + [% FOREACH col = report.col_names %] + [% NEXT IF col == "" %] + + + [% END %] + + +
+ + [% col FILTER html FILTER replace('^ $',' ') %] + + Total +
+ [% row FILTER html FILTER replace('^ $',' ') %] + + [% IF report.data.$tbl.$col.$row AND report.data.$tbl.$col.$row > 0 %] + + [% report.data.$tbl.$col.$row %] + [% ELSE %] + . + [% END %] + + + [% row_total %] + [% grand_total = grand_total + row_total %] +
+ Total + + + [% col_totals.$col %] + + + + [% grand_total %] + +
+ + +
diff --git a/template/en/default/testopia/reports/report.csv.tmpl b/template/en/default/testopia/reports/report.csv.tmpl new file mode 100644 index 0000000..e694ed0 --- /dev/null +++ b/template/en/default/testopia/reports/report.csv.tmpl @@ -0,0 +1,90 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + #%] +[%# INTERFACE: + # See report-table.html.tmpl. + #%] +[% PROCESS global/variables.none.tmpl %] + +[% colsepchar = user.settings.csv_colsepchar.value %] +[% num_bugs = BLOCK %]Number of [% terms.bugs %][% END %] +[% tbl_field_disp = field_descs.$tbl_field || report.tbl_field %] +[% col_field_disp = field_descs.$col_field || report.col_field %] +[% row_field_disp = field_descs.$row_field || report.row_field %] +[% grand_total = 0 %] + +[% IF report.tbl_field %] + [% tbl_field_disp FILTER csv %]: [% tbl FILTER csv %] +[% END %] +[% IF report.row_field %] + [% row_field_disp FILTER csv %] +[% END %] +[% " / " IF report.col_field AND report.row_field %] +[% col_field_disp FILTER csv %] +[% IF report.col_field -%] + [% FOREACH col = report.col_names -%] + [% col_totals.$col = 0 %] + [% colsepchar %] + [% IF report.col_field == 'bug_status' %] + [% status_descs.$col FILTER csv -%] + [% ELSIF col_field == 'resolution' %] + [% resolution_descs.$col FILTER csv -%] + [% ELSE %] + [% col FILTER csv -%] + [% END %] + [% END -%] + [% colsepchar %] + [% 'Total' FILTER csv%] +[% ELSE -%] + [% colsepchar %][% num_bugs FILTER csv %] +[% END %] + +[% FOREACH row = report.row_names %] + [% row_total = 0 %] + [% IF report.row_field == 'bug_status' %] + [% status_descs.$row FILTER csv -%] + [% ELSIF report.row_field == 'resolution' %] + [% resolution_descs.$row FILTER csv -%] + [% ELSE %] + [% row FILTER csv -%] + [% END %] + [% FOREACH col = report.col_names %] + [% row_total = row_total + data.$tbl.$col.$row %] + [% colsepchar %] + [% IF report.data.$tbl AND report.data.$tbl.$col AND report.data.$tbl.$col.$row %] + [% col_totals.$col = col_totals.$col + report.data.$tbl.$col.$row %] + [% report.data.$tbl.$col.$row %] + [% ELSE %] + [% -%]0 + [% END %] + [% END %] + [% colsepchar %] + [% row_total %] + [% "\n" %] + [% grand_total = grand_total + row_total %] +[% END %] +[% 'Total' FILTER csv %] + [% FOREACH col = col_names %] + [% NEXT IF col == "" %] + [% colsepchar %] + [% col_totals.$col %] + [% END %] + [% colsepchar %] +[% grand_total %] \ No newline at end of file diff --git a/template/en/default/testopia/reports/report.html.tmpl b/template/en/default/testopia/reports/report.html.tmpl new file mode 100644 index 0000000..54d486b --- /dev/null +++ b/template/en/default/testopia/reports/report.html.tmpl @@ -0,0 +1,177 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + #%] + +[%# INTERFACE: + # report.col_field: string. Name of the field being plotted as columns. + # report.row_field: string. Name of the field being plotted as rows. + # report.tbl_field: string. Name of the field being plotted as tables. + # report.tbl_names: array. List of values for the field being plotted as tables. + # time: integer. Seconds since the epoch. + # report.data: . Data to plot. + # report.format: string. Format of the individual reports. + # report.width: integer. For image charts, height of the image. + # report.height: integer. For image charts, width of the image. + # switchbase: string. Base URL for format switching. + # cumulate: boolean. For bar/line charts, whether to cumulate data sets. + #%] + +[% DEFAULT width = 600 + height = 350 +%] + +[% IF report.min_width AND report.width < report.min_width %] + [% width = report.min_width %] +[% END %] + +[%# We ignore report.row_field for pie charts %] +[% IF report.format == "pie" %] + [% report.row_field = "" %] +[% END %] + +[% PROCESS "global/field-descs.none.tmpl" %] + +[% tbl_field_disp = field_descs.$report.tbl_field || report.tbl_field %] +[% col_field_disp = field_descs.$report.col_field || report.col_field %] +[% row_field_disp = field_descs.$report.row_field || report.row_field %] + +[% title = BLOCK %] + Report: + [% IF report.tbl_field %] + [% tbl_field_disp FILTER html %] + [% END %] + [% " / " IF report.tbl_field AND (report.col_field OR report.row_field) %] + [% IF report.row_field %] + [% row_field_disp FILTER html %] + [% END %] + [% " / " IF report.col_field AND report.row_field %] + [% col_field_disp FILTER html %] +[% END %] + +[% PROCESS global/header.html.tmpl + style = " + .t1 { background-color: #ffffff } /* white */ + .t2 { background-color: #dfefff } /* light blue */ + .t3 { background-color: #dddddd } /* grey */ + .t4 { background-color: #c3d3ed } /* darker blue */ + .ttotal { background-color: #cfffdf } /* light green */ + " + h3 = time2str("%Y-%m-%d %H:%M:%S", time) +%] + +[% IF debug %] +

[% query FILTER html %]

+[% END %] + +
+ + [% FOREACH tbl = report.tbl_names %] + [% IF tbl == "-total-" %] + [% tbl_disp = "Total" %] + [% ELSE %] + [% tbl_disp = tbl %] + [% END %] + + [% IF report.format == "table" %] + [% PROCESS "testopia/reports/report-table.html.tmpl" %] + [% ELSE %] + [% IF tbl %] +

[% tbl_disp FILTER html %]

+ [% END %] + + [% imageurl = BLOCK %][% report.report_loc %]?[% report.imagebase %]&format= + [% report.format FILTER url_quote %]&ctype=png&report_action=plot& + [% IF report.tbl_field %] + [% IF tbl != "-total-" %] + [% report.tbl_field FILTER url_quote %]=[% tbl FILTER url_quote %]& + [% ELSE %] + [% FOREACH tblname = report.tbl_names %] + [% IF tblname != "-total-" %] + [% report.tbl_field FILTER url_quote %]=[% tblname FILTER url_quote %]& + [% END %] + [% END %] + [% END %] + [% END %]width=[% width %]&height=[% height %] + [% END %] + + Graphical report results + [% END %] +
+ [% END %] + + + + + + [% IF format != "table" %] + + + [% sizeurl = BLOCK %]report.cgi? + [% report.switchbase %]&report_action=data&format= + [% format FILTER html %][% END %] + + [% END %] + +
+ [% formats = [ { name => "pie", description => "Pie" }, + { name => "bar", description => "Bar" }, + { name => "line", description => "Line" }, + { name => "table", description => "Table" } ] %] + + [% formaturl = "$report.report_loc?$report.switchbase&width=$width&height=$height" _ + "&report_action=data" %] + [% FOREACH other_format = formats %] + [% NEXT IF other_format.name == "pie" AND report.row_field AND report.col_field %] + [% UNLESS other_format.name == format %] + + [% END %] + [% other_format.description FILTER html %] + [% "" UNLESS other_format.name == format %] | + [% END %] + CSV + +        + + Taller
+ Thinner * + Fatter    
+ Shorter
+
+ +
+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/reports/test-burnout-form.html.tmpl b/template/en/default/testopia/reports/test-burnout-form.html.tmpl new file mode 100644 index 0000000..e880972 --- /dev/null +++ b/template/en/default/testopia/reports/test-burnout-form.html.tmpl @@ -0,0 +1,125 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test run report - Test burnout chart" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style +%] + +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] + +[% PROCESS testopia/navlinks.html.tmpl + request = "BackToTestRun" +%] + +
+ +[% PROCESS testopia/run/edit.html.tmpl + canmanage = 0 +%] +
+
+ + + +

Enter time period for gathering [% terms.bugs %] counts.

+

Default values below select this test-run time boundary.

+ + + + + + + + + + + + + + + + + + + + + [% PROCESS select sel = { name => "size", + list => size + default => "normal" } %] + + + + + +
From (yyyy-mm-dd): +
To (yyyy-mm-dd): +
Show only [% terms.bugs %] detected by this test run: +
Show 'bugs-cumulative': +
Size:
+
+
+ +

+[% PROCESS testopia/navlinks.html.tmpl + request = "BackToTestRun" +%] +

+ +[% PROCESS global/footer.html.tmpl %] + +[%############################################################################%] +[%# Block for SELECT fields #%] +[%############################################################################%] + +[% BLOCK select %] + + + +[% END %] diff --git a/template/en/default/testopia/run/add.html.tmpl b/template/en/default/testopia/run/add.html.tmpl new file mode 100644 index 0000000..95212d3 --- /dev/null +++ b/template/en/default/testopia/run/add.html.tmpl @@ -0,0 +1,69 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% title = "New Test Run For Plan: $plan.name" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + + + + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/search/variables.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] + +[% PROCESS testopia/case/filter.html.tmpl %] + +
+

Select Test Cases

+[% IF table.list_count > 0 %] +[% PROCESS testopia/case/table.html.tmpl %] +[% ELSE %] +No CONFIRMED test cases found in this test plan. +[% END %] +

+

Run Attributes

+[% PROCESS testopia/run/form.html.tmpl %] + +
+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/run/choose.html.tmpl b/template/en/default/testopia/run/choose.html.tmpl new file mode 100644 index 0000000..8274a80 --- /dev/null +++ b/template/en/default/testopia/run/choose.html.tmpl @@ -0,0 +1,37 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Greg Hendricks + #%] + +[% PROCESS global/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Search by Test Run Number" + %] + +
+

+ You may find a test run by entering its run id here: + + +

+
+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/run/clone.html.tmpl b/template/en/default/testopia/run/clone.html.tmpl new file mode 100644 index 0000000..d849060 --- /dev/null +++ b/template/en/default/testopia/run/clone.html.tmpl @@ -0,0 +1,124 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = "Clone Test Run: $run.summary" + style = style +%] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[% IF NOT case_list %] + + + + + + + + + +[% END %] +
Select Clone Options
New run summary:
Clone to plan: + [% PROCESS select sel = { name => 'plan_id', + list => product.plans + accesskey => 'p' + default => run.plan.id} + %] +
Product version:[% PROCESS select sel = { name => 'product_version', + list => run.plan.product.versions, + accesskey => 'v' + default => run.product_version } %]
Build:[% PROCESS select sel = { name => 'build', + list => run.plan.product.builds + accesskey => 'b' + default => run.build.id } %]
Maintain Run Manager:Yes No, make me the manager of the new run.
Copy tags:Yes No
Copy test cases:Yes + No
With status: + [% PROCESS select sel = { name => 'status', + list => caserun.get_status_list + accesskey => 's' + mult => 1 + default => 'all' } %] +
+ + +
+

Back to +test run

+ +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/run/delete.html.tmpl b/template/en/default/testopia/run/delete.html.tmpl new file mode 100644 index 0000000..3f73e39 --- /dev/null +++ b/template/en/default/testopia/run/delete.html.tmpl @@ -0,0 +1,60 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = "Delete Test Run $run.summary" +%] + +[% IF NOT deleted %] +You are about to permananty delete this test run with all its history. +
+Warning: This action cannot be undone +
+
+
+ + + +
+ +Go back + +[% ELSE %] + +Test run deleted. + +[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/run/form.html.tmpl b/template/en/default/testopia/run/form.html.tmpl new file mode 100644 index 0000000..c8320c8 --- /dev/null +++ b/template/en/default/testopia/run/form.html.tmpl @@ -0,0 +1,124 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Product Version + + + [% PROCESS select sel = { name => "product_version", + list => run.plan.product.versions, + default => run.product_version ? run.product_version : run.plan.product_version } + %] + Plan Version + + [% PROCESS select sel = { name => "plan_version", + list => run.plan.get_plan_versions, + default => run.plan_text_version } + %] +
Manager + Build + + [% PROCESS select sel = { name => "build", + list => run.plan.product.builds(1), + default => run.build.id } + %] + [% IF action == 'Add' %] + or New: + [% END %] +
Status + [% SET statuslist = [{ id => 1, name => 'Running'}, {id => 0, name=> 'Stopped'}] %] + [% PROCESS select sel = { name => "status", + list => statuslist, + default => run.stop_date ? 0 : 1 } + %] + + Environment + + [% IF action == 'Add' %] + or New: + [% END %] + +
Summary
Notes: + +
+
+ +
diff --git a/template/en/default/testopia/run/history.html.tmpl b/template/en/default/testopia/run/history.html.tmpl new file mode 100644 index 0000000..c8bd2f2 --- /dev/null +++ b/template/en/default/testopia/run/history.html.tmpl @@ -0,0 +1,67 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Run History for Run $run.id: $run.summary" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + + + + + + + + + +[% FOREACH row = run.history %] + + + + + + + +[% END %] +
WhoWhenWhatOld ValueNew Value
[% row.who FILTER html %][% row.changed FILTER time %][% row.what FILTER html %][% row.oldvalue FILTER html %][% row.newvalue FILTER html %]
+

+Back to run +

+ +[% PROCESS global/footer.html.tmpl %] + diff --git a/template/en/default/testopia/run/list.html.tmpl b/template/en/default/testopia/run/list.html.tmpl new file mode 100644 index 0000000..51c0a7e --- /dev/null +++ b/template/en/default/testopia/run/list.html.tmpl @@ -0,0 +1,133 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Runs" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] + +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] + +[%# More than this will cause your browser to get really slow + # So we won't show the action and effects %] +[% SET MAX_LIMIT = 500 %] +[% IF table.view_count < MAX_LIMIT %] + +[% END %] + + + +
+ +[% PROCESS testopia/run/table.html.tmpl %] + +

+[% IF table.list_count == 0 %] +No test runs +[% ELSE %] + [% IF table.list_count == 1 %] + One test run + [% ELSE %] + [% table.list_count FILTER none %] test runs + [% END %] +[% END %] +found. +

+ +[% IF dotweak AND table.list_count %] +

Update Selected Test Runs

+ + + + + + + + + + + + + + + + +[% IF NOT multiprod %] + + +[% ELSE %] + +[% END %] + +
ManagerAdd Tags
Status + [% PROCESS select sel = { name => 'run_status', + accesskey => 's', + list => status_list + default => "--Do Not Change--" } %] + + Environment + + Build + [% PROCESS select sel = { name => 'build', + accesskey => 'b', + list => build_list + default => "--Do Not Change--" } %] + +
+ +

+ + +

+ + +[% END %] +
+[% PROCESS "testopia/saved-search.html.tmpl" %] +[%############################################################################%] +[%# Page Footer #%] +[%############################################################################%] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/run/navigate.html.tmpl b/template/en/default/testopia/run/navigate.html.tmpl new file mode 100644 index 0000000..8d3bf66 --- /dev/null +++ b/template/en/default/testopia/run/navigate.html.tmpl @@ -0,0 +1,67 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Greg Hendricks + #%] + +[% list = table.get_saved_list('run') %] +Run List: +[% IF table && list > 0 %] +[% curr = lsearch(list, run.id) %] +[% IF curr != -1 && (curr > 0) %] + << First +[% ELSE %] + <<First +[% END %] + + [% IF run %] + [% IF curr != -1 %] + [% IF curr > 0 %] + [% prev = curr - 1 %] + < Prev + [% ELSE %] + Prev + [% END %] + + [% IF curr != -1 %] +   ([% curr + 1 %] of [% list.size %])   + [% END %] + + [% IF curr + 1 < list.size %] + [% next = curr + 1 %] + Next > + [% ELSE %] + Next + [% END %] + [% END %] + [% ELSE %] +    + [% END %] + +[% IF curr != -1 && (curr + 1 < list.size) %] + Last >> +[% ELSE %] + Last>> +[% END %] + +[% ELSE %] + [%# With no list, don't show link to search results %] +    + No search results available +[% END %] diff --git a/template/en/default/testopia/run/regression.html.tmpl b/template/en/default/testopia/run/regression.html.tmpl new file mode 100644 index 0000000..69f2445 --- /dev/null +++ b/template/en/default/testopia/run/regression.html.tmpl @@ -0,0 +1,151 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[% title = "Test Run Regression Test Cases" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style +%] + +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] + +
+ +[% IF bugs.size == 0 %] + +

There are no [% terms.bugs %] reported in this test run.

+ +[% ELSE %] + +
+ + + +

[% terms.Bugs %] reported in this test run:

+ +[% DECORATIVE_BORDER_BEGIN %] + + + + + + + + + + + +[% rowclass = "evenRow_first" %] + +[% FOREACH bug = bugs %] + + + + + + + + + +[% IF rowclass == "oddRow" %] + [% rowclass = "evenRow" %] +[% ELSE %] + [% rowclass = "oddRow" %] +[% END %] + +[% END %] + +
[% terms.Bug %] IDSummarySeverityStatusProduct
 [% bug.bug_id FILTER none %][% bug.summary %][% bug.severity %][% bug.status %][% bug.product_name %]
+ +[% DECORATIVE_BORDER_END %] + +

+Create regression test cases for each checked [% terms.bug %]? +  +

+ +
+ + + + + +

+Regression test cases are added to the test plan and will be available for future test runs. +[% terms.Bugs %] reported to products other than the plan's product cannot be selected. + +

+ +[% END %] + +

+Go back to the test run page. +

+

+ +[%############################################################################%] +[%# Page Footer #%] +[%############################################################################%] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/run/show.html.tmpl b/template/en/default/testopia/run/show.html.tmpl new file mode 100644 index 0000000..64100f9 --- /dev/null +++ b/template/en/default/testopia/run/show.html.tmpl @@ -0,0 +1,315 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% title = "Test Run $run.id: $run.summary" %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] +[% PROCESS testopia/style.none.tmpl %] + +[% PROCESS testopia/messages.html.tmpl %] + + + + + + + + + +[% PROCESS testopia/run/navigate.html.tmpl %] + +[%##### Overview #####%] +
+

Overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlanPlan Text VersionStart Date
[% run.plan.name FILTER html %][% run.plan_text_version FILTER html %][% run.start_date FILTER time %]
ProductProduct VersionStop Date
[% run.plan.product.name FILTER html %][% run.product_version FILTER html %][% run.stop_date FILTER time %]
ManagerPercent CompleteStatus
[% run.manager.identity FILTER html %] + [% PROCESS testopia/percent_bar.html.tmpl + percent = run.percent_complete + %] + + [% IF run.stop_date %] + STOPPED + [% ELSE %] + RUNNING + [% END %] +
+[% IF run.canedit %] +Edit Run Attributes +[% END %] +
+ +

Test Case Run Logs

+[% PROCESS testopia/caserun/filter.html.tmpl %] +
+[% PROCESS testopia/caserun/table.html.tmpl + caseruns = run.current_caseruns %] + +[% table.list_count FILTER none %] test cases found. +
+[% IF run.canedit %] +
+ + + + + + +
+ +
+
+ +
+ + + +
Update Multiple +[% END %] + +List Cases +[%##### Reports #####%] +

+

Reports

+General Reports
+[% IF run.bugs %] +Bugs Found in this Run
+[% END %] +
+[%##### Categories and Tags #####%] +

CC, Coverage, Tags

+ +
+ + + + + + + + + + + + + +
CC ListCase Run StatusTags
+ + [% IF run.canedit %] + + + + [% END %] + + + +
+ + +
+ +
+ [% IF run.canedit %] + + [% END %] +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Idle:[% run.idle_count FILTER html %]
Passed:[% run.passed_count FILTER html %]
Failed:[% run.failed_count FILTER html %]
Running:[% run.running_count FILTER html %]
Paused:[% run.paused_count FILTER html %]
Blocked:[% run.blocked_count FILTER html %]
Total:[% run.case_count FILTER html %]
+
+ +
+ [% PROCESS testopia/tag/table.html.tmpl + item = run + %] +
+
+
+
+ + + + + [% IF run.canedit %] + + [% END %] + [% IF run.candelete %] + + [% END %] + + +
+
+ +[% IF run.canedit %] +

Attributes

+ [% PROCESS testopia/run/form.html.tmpl %] +[% END %] +
+[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/run/table.html.tmpl b/template/en/default/testopia/run/table.html.tmpl new file mode 100644 index 0000000..c299a26 --- /dev/null +++ b/template/en/default/testopia/run/table.html.tmpl @@ -0,0 +1,86 @@ +[%# 1.0@bugzilla.org %][%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + # Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] +[% IF table.list_count > 0 %] + + [% IF dotweak %] +Select: +All, +None + [% END %] + + [% link = "${table.get_order_url}&order=" %] + [% DECORATIVE_BORDER_100_BEGIN %] + + + [% IF dotweak %][% END %] + + + + + + + + + + [% IF NOT plan %][% END %] + + + [% FOREACH run = table.list %] + + + [% IF dotweak %] [% END %] + + + + + + + + + + [% IF NOT plan %][% END %] + + [% END %] + [% IF NOT table.viewall %] + [% PROCESS navigation %] + [% END %] +
ID[% table.arrow IF table.last_sort == 'alias' %]Summary[% table.arrow IF table.last_sort == 'alias' %]Build[% table.arrow IF table.last_sort == 'alias' %]Manager[% table.arrow IF table.last_sort == 'alias' %]Environment[% table.arrow IF table.last_sort == 'alias' %]Started[% table.arrow IF table.last_sort == 'alias' %]Finished[% table.arrow IF table.last_sort == 'alias' %]% CompletedOut ofPlan[% table.arrow IF table.last_sort == 'alias' %]
[% run.id FILTER html %][% run.summary FILTER html %][% run.build.name FILTER html %][% run.manager.login FILTER html %][% run.environment.name FILTER html %][% run.start_date FILTER time %] + [% IF NOT run.stop_date %] + Running + [% ELSE %] + [% run.stop_date FILTER time %] + [% END %] + + [% PROCESS testopia/percent_bar.html.tmpl %] + [% run.case_count FILTER html %][% run.plan.id FILTER html %]
+ + [% DECORATIVE_BORDER_END %] + +[%# No else clause required here -- see list.html.tmpl just below + # PROCESS testopia/run/table.html.tmpl + #%] + +[% END %] diff --git a/template/en/default/testopia/run/tabs.html.tmpl b/template/en/default/testopia/run/tabs.html.tmpl new file mode 100644 index 0000000..eed0696 --- /dev/null +++ b/template/en/default/testopia/run/tabs.html.tmpl @@ -0,0 +1,52 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham + # Myk Melez + #%] + +[%# INTERFACE: + # tabs: List of hashes. May not be empty. Each hash has two members: + # name: string. Name of the tab and the format it represents. + # description: string. Description of the tab (used in tab title). + #%] + +[% tabs = [ { name => 'c', description => "Components " }, + { name => 'b', description => "Tested by" } + { name => 't', description => "Assigned testers" } ] %] + + + + + [% FOREACH tab = tabs %] + [% IF tab.name == current_tab %] + + [% ELSE %] + + [% END %] + [% END %] + + +
+ [% tab.description %] + + + [% tab.description %] + +
+ diff --git a/template/en/default/testopia/saved-search.html.tmpl b/template/en/default/testopia/saved-search.html.tmpl new file mode 100644 index 0000000..6c1a640 --- /dev/null +++ b/template/en/default/testopia/saved-search.html.tmpl @@ -0,0 +1,32 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + \ No newline at end of file diff --git a/template/en/default/testopia/search/advanced.html.tmpl b/template/en/default/testopia/search/advanced.html.tmpl new file mode 100644 index 0000000..c947748 --- /dev/null +++ b/template/en/default/testopia/search/advanced.html.tmpl @@ -0,0 +1,121 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS global/variables.none.tmpl %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl %] +[% PROCESS testopia/messages.html.tmpl %] +[% PROCESS testopia/style.none.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] + + +[% tabs = [ { name => 'case', description => "Find Test Cases" }, + { name => 'run', description => "Find Test Runs" }, + { name => 'plan', description => "Find Test Plans" }, + { name => 'case_run', description => "Find Test Case-Runs" }, + { name => 'environment', description => "Find Test Run Environments" }, ] %] + + + + + + + + + [% FOREACH tab = tabs %] + [% IF tab.name == current_tab %] + + [% ELSE %] + + [% END %] + [% END %] + + +
  + [% tab.description %] + + + [% tab.description %] + +  
+ +[% PROCESS testopia/search/variables.none.tmpl %] + +[% IF current_tab == 'plan' %] + [% PROCESS testopia/search/plan.html.tmpl %] +[% ELSIF current_tab == 'run' %] + [% PROCESS testopia/search/run.html.tmpl %] +[% ELSIF current_tab == 'case_run' %] + [% PROCESS testopia/search/caserun.html.tmpl %] +[% ELSIF current_tab == 'environment' %] + [% PROCESS testopia/search/environment.html.tmpl %] +[% ELSE %] + [% PROCESS testopia/search/case.html.tmpl %] +[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/search/case.html.tmpl b/template/en/default/testopia/search/case.html.tmpl new file mode 100644 index 0000000..b5a256b --- /dev/null +++ b/template/en/default/testopia/search/case.html.tmpl @@ -0,0 +1,228 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + +[% IF report %] +
+[% PROCESS "testopia/search/report-matrix.html.tmpl" + obj = case +%] +[% ELSE %] + +[% END %] + +
+ Product + + + + + + + + + + + +
StatusPriorityAutomatic
+ [% PROCESS select sel = { name => 'case_status_id', + accesskey => 'c', + list => case.get_status_list, + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'priority_id', + accesskey => 'p', + list => case.get_priority_list + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'isautomated', + accesskey => 'a', + list => + [ { id => "0", name => "Manual" }, + { id => "1", name => "Automatic" } ] + elements => 5, + mult => 1 } %] +
+ + + + + + + + + + + +
ProductComponentsCategory
+ [% PROCESS select sel = { name => 'product_id', + accesskey => 'p', + list => user.get_selectable_products, + elements => 5, + mult => 1 + events => 'onChange="document.getElementById(\'component\').disabled=true; + document.getElementById(\'category\').disabled=true; + onProductSelection()"' } %] + + [% PROCESS select sel = { name => 'component', + accesskey => 'm', + list => components + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'category', + accesskey => 't', + list => categories, + elements => 5, + mult => 1 } %] +
+
+
+ Roles + + + + + + + + + + + + + + +
Author: + [% PROCESS select sel = { name => 'author_type', + list => email_variants } %]
AND + OR
Default Tester: + [% PROCESS select sel = { name => 'default_tester_type', + list => email_variants } %]
+
+
+ Attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Summary: + [% PROCESS select sel = { name => 'summary_type', + list => query_variants } %]
Action: + [% PROCESS select sel = { name => 'tcaction_type', + list => query_variants } %]
Expected Results: + [% PROCESS select sel = { name => 'tceffect_type', + list => query_variants } %]
Script: + [% PROCESS select sel = { name => 'script_type', + list => query_variants } %]
Requirement: + [% PROCESS select sel = { name => 'requirement_type', + list => query_variants } %]
Tags: + [% PROCESS select sel = { name => 'tags_type', + list => tag_variants } %]
+
+ +
+ Associations (comma separated lists) + + + + + + + + + + + + + +
+ +
+ +
+ +
+
+ +
diff --git a/template/en/default/testopia/search/caserun.html.tmpl b/template/en/default/testopia/search/caserun.html.tmpl new file mode 100644 index 0000000..0933f8d --- /dev/null +++ b/template/en/default/testopia/search/caserun.html.tmpl @@ -0,0 +1,238 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + +[% IF report %] +
+[% PROCESS "testopia/search/report-matrix.html.tmpl" + obj = caserun +%] +[% ELSE %] + +[% END %] + +
+ Product + + + + + + + + + + + + + + + +
StatusRun StatusPriorityAutomaticProduct
+ [% PROCESS select sel = { name => "case_run_status_id", + list => caserun.get_status_list, + elements => 6, + mult => 1, } + %] + + [% PROCESS select sel = { name => 'run_status', + accesskey => 's', + list => run.get_status_list + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'priority_id', + accesskey => 'p', + list => case.get_priority_list + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'isautomated', + accesskey => 'a', + list => + [ { id => "0", name => "Manual" }, + { id => "1", name => "Automatic" } ] + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'product_id', + accesskey => 'p', + list => user.get_selectable_products, + elements => 5, + mult => 1 + events => 'onChange="document.getElementById(\'component\').disabled=true; + document.getElementById(\'version\').disabled=true; + document.getElementById(\'milestone\').disabled=true; + document.getElementById(\'category\').disabled=true; + document.getElementById(\'build\').disabled=true; + document.getElementById(\'environment\').disabled=true; + onProductSelection()"' } %] +
+ + + + + + + + + + + + + + + + + + + + +
ComponentVersionMilestone
+ [% PROCESS select sel = { name => 'component', + accesskey => 'm', + list => components + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'version', + accesskey => 'v', + list => versions, + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'milestone', + accesskey => 'm', + list => milestones, + elements => 5, + mult => 1 } %] +
CategoryBuildEnvironment
+ [% PROCESS select sel = { name => 'category', + accesskey => 't', + list => categories, + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'build', + accesskey => 't', + list => builds, + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'environment', + accesskey => 'e', + list => environments, + elements => 5, + mult => 1 } %] +
+ +
+
+ Roles + + + + + + + + + + + + + + + +
Assignee + [% PROCESS select sel = { name => 'assignee_type', + list => email_variants } %] + +
AND + OR
Tested By + [% PROCESS select sel = { name => 'testedby_type', + list => email_variants } %] + +
+
+
+ Attributes + + + + + + + + + + + + + + + + + + + + + + +
Case Summary + [% PROCESS select sel = { name => 'case_summary_type', + list => query_variants } %] + +
Requirement + [% PROCESS select sel = { name => 'requirement_type', + list => query_variants } %] + +
Case Tags + [% PROCESS select sel = { name => 'tags_type', + list => tag_variants } %] + +
Notes + [% PROCESS select sel = { name => 'notes_type', + list => query_variants } %] + +
+
+ +

+ + +

+ + +

+ + +

+ +

+ + +
diff --git a/template/en/default/testopia/search/environment.html.tmpl b/template/en/default/testopia/search/environment.html.tmpl new file mode 100644 index 0000000..ae6bcb3 --- /dev/null +++ b/template/en/default/testopia/search/environment.html.tmpl @@ -0,0 +1,411 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + # Brian Kramer + # Scott Sudweeks + #%] + +[%# INTERFACE: + # ... + #%] + + + + + + +[%#######################################%] +[%############## HTML #################%] +[%#######################################%] +

Search for Environments

+
+ + + + +[%###### Bugzilla Products #########%] + + +[%############ CATEGORY ############%] + + + + +[%############ ELEMENTS ############%] + + +[%############ PROPERTIES ############%] + + + +[%######### VALID EXPRESSIONS ##########%] + + + +
+ [% IF Param('useclassification') %] +
Classification
+ [% PROCESS select sel = { + name => 'classification', + accesskey => 'c', + list => classifications, + elements => 5, + mult => 1, + events => 'onchange="env_class_change(this);"' } %] + [% END %] +
+
Products:
+ [% PROCESS select sel = { + name => 'env_products', + accesskey => 'c', + list => products, + elements => 5, + mult => 1, + events => 'onchange="env_products_change(this);"' } %] +
+
Category:
+ [% PROCESS select sel = { + name => 'env_categories', + accesskey => 'c', + list => env.get_all_env_categories(1), + elements => 5, + mult => 1, + events => 'onchange="env_categories_change(this);"' } %] +
+
Element:
+ [% PROCESS select sel = { + name => 'env_elements', + accesskey => 'c', + list => env.get_all_visible_elements(1), + elements => 5, + mult => 1, + events => 'onchange="env_elements_change(this);"' } %] + +
+
Properties:
+ [% PROCESS select sel = { + name => 'env_properties', + accesskey => 'c', + list => env.get_all_element_properties(1), + elements => 5, + mult => 1, + events => 'onchange="env_properties_change(this);"' } %] +
+
Property Value
+ [% PROCESS select sel = { + name => 'env_expressions', + accesskey => 'c', + list => env.get_distinct_property_values, + elements => 5, + mult => 1, } %] +
+
+ + + + + + + + + + + +
Environment Name + [% PROCESS select sel = { name => 'name_type', + list => query_variants } %]
Selected Property Value + [% PROCESS select sel = { name => 'env_value_selected_type', + list => query_variants } %]
+ + +
\ No newline at end of file diff --git a/template/en/default/testopia/search/plan.html.tmpl b/template/en/default/testopia/search/plan.html.tmpl new file mode 100644 index 0000000..5ce1955 --- /dev/null +++ b/template/en/default/testopia/search/plan.html.tmpl @@ -0,0 +1,139 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% IF report %] +
+[% PROCESS "testopia/search/report-matrix.html.tmpl" + obj = plan +%] +[% ELSE %] + +[% END %] + +
+ Product + + + + + + + + + + + +
ProductProduct VersionType
+ [% PROCESS select sel = { name => 'product_id', + accesskey => 'p', + list => user.get_selectable_products, + elements => 5, + mult => 1 + events => 'onChange="document.getElementById(\'version\').disabled=true; + onProductSelection()"' } %] + + [% PROCESS select sel = { name => 'version', + accesskey => 'v', + list => versions, + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'type_id', + accesskey => 'p', + list => plan.get_plan_types + elements => 5, + mult => 1 } %] +
+
+
+ Attributes + + + + + + + + + + + + + + + + + + + + + +
Name: + [% PROCESS select sel = { name => 'name_type', + list => query_variants } %]
Text: + [% PROCESS select sel = { name => 'plan_text_type', + list => query_variants } %]
Tags: + [% PROCESS select sel = { name => 'tags_type', + list => tag_variants } %]
Author: + [% PROCESS select sel = { name => 'author_type', + list => email_variants } %]
+
+ +

+ + +

+ + +

+ + +
diff --git a/template/en/default/testopia/search/report-matrix.html.tmpl b/template/en/default/testopia/search/report-matrix.html.tmpl new file mode 100644 index 0000000..797d248 --- /dev/null +++ b/template/en/default/testopia/search/report-matrix.html.tmpl @@ -0,0 +1,64 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +

+ Choose one or more fields as your axes, and then refine your set of + [% obj.type FILTER none %]s using the rest of the form. +

+ + + + + + + + + + + + +
+ + Horizontal Axis: + [% PROCESS select sel = { name => 'x_axis_field', + list => obj.report_columns } %] + +
+ Vertical Axis:
+ [% PROCESS select sel = { name => 'y_axis_field', + list => obj.report_columns } %] + +
+ + + + +
+ Multiple Tables:
+ [% PROCESS select sel = { name => 'z_axis_field', + list => obj.report_columns } %] + +
+
+ +
+ + + diff --git a/template/en/default/testopia/search/run.html.tmpl b/template/en/default/testopia/search/run.html.tmpl new file mode 100644 index 0000000..f2f10b0 --- /dev/null +++ b/template/en/default/testopia/search/run.html.tmpl @@ -0,0 +1,182 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2001 + # Greg Hendricks. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% IF report %] +
+[% PROCESS "testopia/search/report-matrix.html.tmpl" + obj = run +%] +[% ELSE %] + +[% END %] + + +
+ Product + + + + + + + + + + + +
StatusProductVersion
+ [% PROCESS select sel = { name => 'run_status', + accesskey => 's', + list => run.get_status_list + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'product_id', + accesskey => 'p', + list => user.get_selectable_products, + elements => 5, + mult => 1 + events => 'onChange="document.getElementById(\'version\').disabled=true; + document.getElementById(\'milestone\').disabled=true; + document.getElementById(\'build\').disabled=true; + document.getElementById(\'environment\').disabled=true; + onProductSelection()"' } %] + + [% PROCESS select sel = { name => 'version', + accesskey => 'v', + list => versions, + elements => 5, + mult => 1 } %] +
+ + + + + + + + + + + + +
MilestoneBuildEnvironment
+ [% PROCESS select sel = { name => 'milestone', + accesskey => 'm', + list => milestones, + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'build', + accesskey => 't', + list => builds, + elements => 5, + mult => 1 } %] + + [% PROCESS select sel = { name => 'environment', + accesskey => 'e', + list => environments, + elements => 5, + mult => 1 } %] +
+
+
+ Attributes + + + + + + + + + + + + + + + + + + + + + + + + + + +
Summary: + [% PROCESS select sel = { name => 'summary_type', + list => query_variants } %]
Notes + [% PROCESS select sel = { name => 'notes_type', + list => query_variants } %]
Environment XML: + [% PROCESS select sel = { name => 'environment_type', + list => query_variants } %]
Tags: + [% PROCESS select sel = { name => 'tags_type', + list => tag_variants } %]
Manager: + [% PROCESS select sel = { name => 'manager_type', + list => email_variants } %]
+
+ +

+ + +

+ + +

+

+ + +
diff --git a/template/en/default/testopia/search/variables.none.tmpl b/template/en/default/testopia/search/variables.none.tmpl new file mode 100644 index 0000000..b947d39 --- /dev/null +++ b/template/en/default/testopia/search/variables.none.tmpl @@ -0,0 +1,48 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# Taken from bugzilla search/form.html.tmpl %] +[% query_variants = [ + { id => "allwordssubstr", name => "contains all of the words/strings" }, + { id => "anywordssubstr", name => "contains any of the words/strings" }, + { id => "substring", name => "contains the string" }, + { id => "casesubstring", name => "contains the string (exact case)" }, + { id => "allwords", name => "contains all of the words" }, + { id => "anywords", name => "contains any of the words" }, + { id => "regexp", name => "matches the regexp" }, + { id => "notregexp", name => "doesn't match the regexp" } ] %] + +[% email_variants = [ + { id => "substring", name => "contains" }, + { id => "exact", name => "is" }, + { id => "regexp", name => "matches regexp" }, + { id => "notregexp", name => "doesn't match regexp" } ] %] + +[% tag_variants = [ + { id => "anyexact", name => "is tagged with" }, + { id => "allwordssubstr", name => "contains all of the words/strings" }, + { id => "anywordssubstr", name => "contains any of the words/strings" }, + { id => "substring", name => "contains the string" }, + { id => "casesubstring", name => "contains the string (exact case)" }, + { id => "regexp", name => "matches the regexp" }, + { id => "notregexp", name => "doesn't match the regexp" }, + { id => "allwords", name => "contains all of the words" }, + { id => "anywords", name => "contains any of the words" }, + { id => "nowords", name => "contains none of the words" } ] %] \ No newline at end of file diff --git a/template/en/default/testopia/style.none.tmpl b/template/en/default/testopia/style.none.tmpl new file mode 100644 index 0000000..544b9ca --- /dev/null +++ b/template/en/default/testopia/style.none.tmpl @@ -0,0 +1,45 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Ed Fuentetaja + #%] + +[%# INTERFACE: + # ... + #%] + +[% DECORATIVE_BORDER_BEGIN = "
" %] +[% DECORATIVE_BORDER_100_BEGIN = "
" %] +[% DECORATIVE_BORDER_END = "
" %] + diff --git a/template/en/default/testopia/tag/list.html.tmpl b/template/en/default/testopia/tag/list.html.tmpl new file mode 100644 index 0000000..70db333 --- /dev/null +++ b/template/en/default/testopia/tag/list.html.tmpl @@ -0,0 +1,66 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[% IF item %] + [% SET tags = item.tags %] +[% END %] + + + + + + + + [% IF UserInGroup("admin") %] + + [% END %] + +[% FOREACH tag = tags %] + + + + + + + +[% END %] +
TagCasesPlansRunsActions
[% tag.name FILTER html %][% tag.case_count FILTER html %][% tag.plan_count FILTER html %][% tag.run_count FILTER html %] + [% IF item AND item.type != 'product' %] + Remove + [% END %] + [% IF UserInGroup("admin") %] + Delete + [% END %] +
+ +[% IF item AND item.type != 'product' %] +
+ + + + + + +
+ [% IF UserInGroup('admin') %] +

Show All Tags

+ [% END %] + +[% END %] diff --git a/template/en/default/testopia/tag/show.html.tmpl b/template/en/default/testopia/tag/show.html.tmpl new file mode 100644 index 0000000..bd3f288 --- /dev/null +++ b/template/en/default/testopia/tag/show.html.tmpl @@ -0,0 +1,115 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Testopia System. + # + # The Initial Developer of the Original Code is Greg Hendricks. + # Portions created by Greg Hendricks are Copyright (C) 2007 + # Novell. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + + +[% PROCESS global/header.html.tmpl + title = "Tags" %] +[% PROCESS testopia/messages.html.tmpl %] +[% PROCESS testopia/blocks.html.tmpl %] + +[% IF viewall OR tags.size > 0 %] + [% PROCESS testopia/tag/list.html.tmpl %] +[% END %] + +[% IF UserInGroup('admin') %] +Show All Tags +[% END %] + +[% IF case %] +

Tags for Case [% case.id FILTER none %] - [% case.summary FILTER html %]

+ [% PROCESS testopia/tag/list.html.tmpl + item = case + %] +[% END %] + +[% IF plan %] +

Tags for Plan [% plan.id FILTER none %] - [% plan.name FILTER html %]

+ [% PROCESS testopia/tag/list.html.tmpl + item = plan + %] +[% END %] + +[% IF run %] +

Tags for Run [% run.id FILTER none %] - [% run.summary FILTER html %]

+ [% PROCESS testopia/tag/list.html.tmpl + item = run + %] +[% END %] + +[% item = undef %] + + + + +
+ [% IF user_name == user.login %] +

My Tags

+ [% ELSE %] +

[% user_name %]'s Tags

+ [% END %] + +
+ + + + + +
+ Lookup Tags by User: + + + +
+
+ + [% PROCESS testopia/tag/list.html.tmpl + tags = user_tags + %] +
+

Tags by Product

+
+ + + + + + + + +
+ Lookup Tags by Product: + + [% PROCESS select sel = { name => 'product', + list => user.get_selectable_products, + default => products.0.id, + accesskey => 'p' } %] +
+
+ [% FOREACH p = products %] + [% p.name FILTER html %]
+ [% PROCESS testopia/tag/list.html.tmpl + item = p + %] + [% END %] + +
+ + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/testopia/tag/table.html.tmpl b/template/en/default/testopia/tag/table.html.tmpl new file mode 100644 index 0000000..ae248b3 --- /dev/null +++ b/template/en/default/testopia/tag/table.html.tmpl @@ -0,0 +1,63 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Test Runner System. + # + # The Initial Developer of the Original Code is Maciej Maczynski. + # Portions created by Maciej Maczynski are Copyright (C) 2001 + # Maciej Maczynski. All Rights Reserved. + # + # Contributor(s): Greg Hendricks + #%] + +[%# INTERFACE: + # ... + #%] + +[% IF item.type == 'case' %] + [% product_id = join(",", case.get_product_ids) %] +[% ELSIF item.type == 'plan' %] + [% product_id = plan.product_id %] +[% ELSIF item.type == 'run' %] + [% product_id = run.plan.product_id %] +[% END %] +[% IF item.canedit %] + + +
+[% END %] +
+ + + + + +
+[% FOREACH tag = item.tags %] + [% tag.name FILTER html %] +[% IF item.canedit %] + + [x] +[% END %] +
+ [% IF loop.count % 8 == 0 %] +
+ [% END %] + +[% END %] +
+ diff --git a/template/en/default/testopia/text.png.tmpl b/template/en/default/testopia/text.png.tmpl new file mode 100644 index 0000000..16afab3 --- /dev/null +++ b/template/en/default/testopia/text.png.tmpl @@ -0,0 +1,17 @@ + [% FILTER null; + USE gd = GD.Image(100,40); + USE gdc = GD.Constants; + white = gd.colorAllocate(255,255, 255); + black = gd.colorAllocate(0,0,0); + USE wrapbox = GD.Text.Wrap(gd, + line_space => 4, + color => black, + text => txt, + ); + wrapbox.set_font(gdc.gdMediumBoldFont); + wrapbox.set(align => 'left', width => 100); + wrapbox.draw(2, 2); + gdr = gd.copyRotate270(); + gdr.png | stdout(1); + END; + -%] \ No newline at end of file diff --git a/testopia.dtd b/testopia.dtd new file mode 100644 index 0000000..6be4411 --- /dev/null +++ b/testopia.dtd @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"> \ No newline at end of file diff --git a/testopia/ChangeLog b/testopia/ChangeLog new file mode 100644 index 0000000..3e1b60a --- /dev/null +++ b/testopia/ChangeLog @@ -0,0 +1,330 @@ +2005-09-21 Ed Fuentetaja + + * Version 0.7 + + * Bugzilla's administrators are allowed to manage test plans by default. + * Table test_cases_log now with its own 'group_id' column (there were potential problems with prev setup). + * New test log state: running. This lets testers to "reserve" test cases so others will see it as "running" and won't pick it up. + * Test cases have an order inside a plan. + * Ability to change the status of several test cases altogether. + * Added more fields to test_run: product version, platform, OS. + * Fixed listing of test case logs tied to a test case. + * Fixed problem on IE remembering selections from the last test case query (tr_query page). + * Simplified edit of test run notes. Notes added to test run reports. + * Fixed problem refreshing the list of test case when cloning or deleting test cases. + * Fixed minor problem: deleting a test run presents now the list of test runs. + * Fixed problem with null run_mode test cases. run_mode field cannot be null now. + * Added script & arguments fields to test cases. + * Incident report now lists every bug, not only bugs tied to failed test case logs. Also shows the bug's component. + * Now using Bugzilla template hooks. Patching reduced significantly. + * Fixed several problems regarding unescaped quotes inside fields. + * Documentation cleaned up of funny English by Michelle Greenlee. Thanks! + * Fix: import failed if test plan tags already existed. Now it updates tags if they are already there. + * Ask for a test run manager when starting a new test run. + * Group added to the search page. + * Added platform and op_sys as column on the list of test runs. + * Multiline text displayed goes now inside
.
+  * Tested on Opera 8. Doesn't look too bad. HTMLArea won't work though.
+  * Ability to archive (maybe out-dated) test plans, without deleting them.
+
+2005-06-19  Ed Fuentetaja  
+
+  * Version 0.6.2
+  
+  * When a new test run is created, test runner now goes to that test run page (tr_testruns.cgi).
+  * Problem with test run fixed. It can be called from two pages (tr_edittestplans & tr_testplan_form) 
+    but, if there is an error it doesn't remember where you called it from, it always 
+    goes to tr_edittestplans
+  * Now testruns.cgi looks like currenttestruns.cgi
+  * test plan document converted to templates
+  * Send email to testers on a new test run
+  * SendEmail method fixed
+  * Test Run IEEE reports: Test log report & Test incident report
+  * Ability to create test cases "check this is fixed" from the list of reported bugs on a test run.
+  * Test-run notifications email content are now configurable params
+  * Add links to tr_testruns.cgi header
+  * Show the % bar also on tr_testruns.cgi
+  * Fix: bugs can be added to test cases without regard of the product they are tied to.
+  * Directory data looks protected (.htaccess) on Bugzilla 219* -> this affects charts
+  * Administrators now don't have any restrictions on the UI (they still need to belong to BTR's groups)
+  * Fix: new Test Run method doesn't populate test_run_testers table
+  * Install: copy permissions from .orig files to patched ones
+  * Install: simplified, now runs the patch and detects if it run alright
+  * Install tested and working on Windows
+  * Bug fixed: 1171733 Parameter to set default test case status
+  * Bug fixed: 1171732 Add status field to list of test cases
+  * Bug fixed: 1182907 Uninitialized values in tr_clone_testplan.cgi
+  * Bug fixed: 1183365 nasty bug on copy test case to another plan
+  * Bug fixed: 1188590 scripts for automating tasks need fix
+  * Bug fixed: 1195439 Test run notifications doesn't work on 0.6.1
+  * Bug fixed: 1207343 Software Error when trying to change Editor
+  * Bug fixed: 1207366 Search for test cases just hangs (times out)
+  * Bug fixed: 1207683 Two problems with test plan detail updates
+  * Bug fixed: 1214203 Trying to change status of test plan fails
+  * Bug fixed: 1215847 Search condition "Case-sensitive" ignored for Tag search
+  * Bug fixed: 1216733 Functional Group cannot be updated
+  * Install instructions updated and improved
+
+2005-04-02  Ed Fuentetaja  
+
+  * Version 0.6.1
+  
+  * Added a new simplified interface for testers.
+  
+2005-02-01  Ed Fuentetaja  
+
+  * Version 0.6
+  
+  * Added support only for Bugzilla 2.18. This version doesn't support
+    previous Bugzillas. For that you need to use version 0.5.2.
+  
+2005-02-01  Ed Fuentetaja  
+
+  * Version 0.5.2
+  
+  * Added German language module for HTMLArea by Brand Lars.
+    (Anyway the spell-checker is disabled by default).
+  
+  * Added updated db models reversed engineered by Pieter-Paul Spiertz.
+  
+  * Now _every_ page runs on tainted mode. This was a huge tasks because every
+    single piece of functionality had to be touched and tested. I hope this
+    will make a difference as far as security. Anyway, I'd appreciate any
+    help to this regard. If anybody volunteers to run a code inspection chasing
+    security-related problems, that'll be great.
+  
+  * Fixed a _huge_ number of small bugs and nuances. Since I've found so many
+    and I don't believe that Test Runner's users are shy, it makes me wonder.
+    Maybe there are very few users, or, its users are so amazed by Test Runner
+    functionality that they forget these minor problems (kind of the "dancing
+    bear" syndrome, from the book "the inmates are running the asylum").
+    I believe the first option is truer.
+
+2004-04-21  Ed Fuentetaja  
+
+  * Fixed numerous warnings from the apache's error log.
+
+  * Replaced text areas by HTMLArea, a WYSIWYG html editor.
+
+  * Added the component column to the list of test cases.
+
+  * 'Update test case logs' now only updates confirmed test cases.
+  
+  * Added automated regresion test scripts from Sytze.
+
+2004-01-27  Ed Fuentetaja  
+
+  * compatibility with both Bugzilla 2.16.* and 2.17.*
+    
+  * install script installs the application and creates or upgrades the BTR's database, as needed
+    
+  * upgrade script to migrate BTR 0.3 to this version
+
+2004-01-18  Ed Fuentetaja  
+
+	* test cases can be marked as public, so anybody can run them
+
+	* more than one tester can be assigned to a test case, but it only needs to be run once
+
+	* improvements on the UI and usability of the most common pages
+
+	* cleaned up and removed duplications in the code. A future use of templates is now closer
+
+2003-11-21  Ed Fuentetaja  
+
+	* patch : updated to work with Bugzilla 2.17.6
+
+	* tr_buglist_to_plan : fixed bug: still using the products field
+
+2003-11-15  Ed Fuentetaja  
+
+	* doc : updated documentation.
+
+	* (all) : version migrated to make it work with Bugzilla 2.17.4
+
+
+2002-09-27  Maciej Maczynski  
+
+	* doc : updated documentation.
+
+	* edittestplans.cgi (InitTestCaseLog): Placed version info in header (version 0.2).
+
+2002-09-06  Maciej Maczynski  
+
+	* buglist_to_plan_query.cgi: Added a feature to turn buglist into test plan. This way you can use
+	Testopia as "supervising tool" for verifing set of bugs.
+
+2002-06-17  Maciej Maczynski  
+
+	* testrun_testers.cgi : Added a form to reassign test-cases "by bug owner". This is intended
+	to work together with test tests created out of lists of bugs (see 2002-06-10 buglist_to_plan.cgi
+	note). If a test case has "show_bug.cgi" is summary, it can be reassigned to tester, which is
+	bug reporter.
+
+2002-06-12  Maciej Maczynski  
+
+	* testruns.cgi : Removed hyperlinks to 0-items bug lists. Replaced plain user mail address with
+	"mailto" tag in tables.	
+
+	* tr_caselogform.cgi (DoRunNotifications): Case id is put to mail subject, user name to main body.
+
+2002-06-10  Maciej Maczynski  
+
+	* tr_query.cgi : $jscript must be parameter 5 to PutHeader.
+
+	* tr_testcaseform.cgi : Added a function for copying a test case to another test plan.
+
+	* testruns.cgi : Added hyperlink to "Update test cases" page.
+
+	* testplan_form.cgi : Added hyperlink to "Clone test plan" page. 
+
+	* buglist_to_plan.cgi : Status of new test case is "confirmed". Added handling of %description%
+	in test case "action". It is expanded to bug's description.
+
+	* testrun_update.cgi : Added a feature for updating test run. "Updating" means creating
+	test case log entries for all test cases, which are in parent test-plan, but have to log
+	entries in test run (i.e. were added after test run were created)
+
+	* clone_testplan.cgi : Added a feature for makeing a copy of test plan. Various "copy options"
+	available.
+
+	* buglist_to_plan.cgi : Added a feature to create test cases out of bug list. I started to use
+	Testopia as "to-do container" for the things related to testing. I often have a situation, when 
+	I wanted testers to test if a list of bug is fixed in current release.
+	Using this module, you can add "test-cases" out of buglist. For each bug in the list, a test-case
+	is created for selected plan.  A test-case is just a note "check bug ###". But this forms a list
+	of to-do items, which I can trace. The text of a note is configurable through.
+	bug-to-test-case-summary, bug-to-test-case-action and bug-to-test-case-effect parameters. You can 
+	use %id% symbol to include hyperlink to bug page.
+	
+
+2002-05-23  Maciej Maczynski  
+
+	* tr_testcaseform.cgi: Improved checking for IE version in javascript.
+
+2002-04-17  Maciej Maczynski  
+
+	* tr_import.pl : Fixed handling of situation when "Component" keyword was placed after "Add group".
+
+2002-04-02  Maciej Maczynski  
+
+	* tr_caselogform.cgi: Added the way to delete test case log entry (not adviced, but sometimes
+	convenient).
+
+	* caselogform.pl: Added "Delete" button to test case log entry form.
+
+2002-03-27  Maciej Maczynski  
+
+	* testrun_notif.cgi: Added interface for notifications setup.
+
+	* btpm_util.pl: Added "constants" for e-mail notification masks.
+	Added SendEmail procedure.
+
+	* tr_caselogform.cgi: Added mechanism for email notifications. Notifications are set up separately for 
+	each test-run. The testrun manager can receive the notifications when:
+	- test-run completes (no 'idle' case log entries left)
+	- test-run completes for tester
+	- test-run completes for component
+	- test case log entry is marked as failed
+
+	* testruns.cgi: Added link to notifications configuration.
+
+2002-03-25  Maciej Maczynski  
+
+	* btpm_util.pl: Defined global $::users_select_limit - it is used to defined maximum number of users
+	displayed in user-selection pop-ups.
+	Added some utility functions.
+
+	* doc/ref_param.html: Describe new options.
+
+	* doc/install.html : Described new options (new-case-action-template and new-case-effect-template).
+	Described Bugzilla bug-fix for GenerateCode procedure.
+
+	* tr_caselogform.cgi : Test case can now be re-assigned to another tester. Only test-plan editor or
+	test run manager can do it.
+	Added "Just mark as failed" option when marking the log entry as failed.
+
+	* testruns.cgi: New fields can be set: notes and manager.
+
+	* testrun_testers.cgi : Testers and test cases can now be reassigned when test is running 
+	(Finally!!! - I really missed it)
+
+	* testrun_reports.cgi: Added some new charts and bug-fixed the old ones.
+
+	* edittestplans.cgi (RunTest): New field (manager) for test run is set to test-plan editor, when 
+	test run is created.
+
+	* caselogform.pl: IsManager function is now used to verify case-access rights;
+	"Reassign" button added.
+
+	* testman.sql: Added columns to test_runs table:
+	- manager (person managing given test run)
+	- notes (notes for test run)
+	- notifications (e-mail notifications mask)
+
+2002-03-18  Maciej Maczynski  
+
+	* edittestplans.cgi (InitTestCaseLog): Missed some SQL-quotes when creating new test plan.
+
+2002-03-11  Maciej Maczynski  
+
+	* edittesters.cgi (PrintTestersAssignForm): Number of test cases defined is put to table header for each component.
+	It makes it easier to balance number of test cases assigned for testers.
+
+2002-03-08  Maciej Maczynski  
+
+	* btpm_util.pl : Added some utility functions needed by other modules.
+
+	* testrun_reports.cgi : Added bug-statistics reports for test run. You can get the numbers of bugs detected during
+	selected test run for each tester. Charts are also available.
+
+	* tr_testcaseform.cgi : After pressing "back" before saving values in test case form once again,
+	I added "change-notification" for this form.  A picture is displayed next to "summary", "action" and
+	"effect" when fields need save. Must use some Java Script here, but I hope it will work with various
+	browsers (checked for IE5, NS4, NS6). Anyway - the feature seems worth some risk for me.
+
+	* tr_edittestcases.cgi : Only privileged user can remove unused versions of test cases.
+	(NewTestCaseForm): Template values for case action and effect are used when creating new case.
+
+	* tr_editgroups.cgi : Improved support for group templates. Template can be deleted.
+
+	* testruns.cgi (PrintPlanHeader): The form displays version of test document used for this run, not current version.
+	(PrintTestersComponents): '%' was prefixed in wrong way...
+	(PrintTestersComponents): Added hyper-link to Reports page.
+	(PrintTestersComponents): PrintTestPlan function is used to display test plan document in unified form.
+
+	* testplan_versions.cgi : PrintTestPlan function is used to display test plan document in unified form.
+
+	* testplan_form.cgi : PrintTestPlan function is used to display test plan document in unified form.
+
+2002-03-05  Maciej Maczynski  
+
+	* tr_editgroups.cgi : Functional group templates can be created out of existing groups. "Delete template" function added
+	as well.
+
+2002-03-04  Maciej Maczynski  
+
+	* tr_query.cgi (StringSearch): Added "Find case id #" function.
+
+	* tr_edittestcases.cgi : Added a function to delete all unreferenced test case versions.
+
+	* testruns.cgi : Bugfix - only one test run was printed (aaarrrghh...) because of SendSql in UserInGroup sub.
+
+	* doc/dbschema.html: Added database schema chart.
+
+2002-03-01  Maciej Maczynski  
+
+	* edittesters.cgi (PrintTestersAssignForm): Added next column, which prints number of currently assigned test cases for
+	each tester.
+
+2002-02-26  Maciej Maczynski  
+
+	* tr_export.cgi : Added two additional export options: preceed case with "product>component>group" text,
+	and generate reference to case page.
+
+	* tr_edittags.cgi (TagsForm): Tags are sorted by name.
+
+	* tr_testcaseform.cgi : Changed quoting of summary, action and effect.
+
+
+	
diff --git a/testopia/README b/testopia/README
new file mode 100644
index 0000000..d271d53
--- /dev/null
+++ b/testopia/README
@@ -0,0 +1,96 @@
+Welcome to Testopia!
+
+Testopia is a test case management extension for Bugzilla. It is designed to 
+be a generic tool for tracking test cases, allowing for testing 
+organizations to integrate bug reporting with their test case run results. 
+Though it is designed with software testing in mind, it can be used to track 
+testing on virtually anything in the engineering process.
+
+=== Requirements ===
+* Bugzilla 2.22 or 2.23
+
+Testopia is an extension to Bugzilla. This means that if you have one of the
+supported versions of Bugzilla installed, you are all set to install Testopia.
+Testopia has been tested and is known to work with Bugzilla on Linux running
+MySQL. To my knowledge there is nothing that would prevent it from working on
+Windows installations or with PostgreSQL databases, however these have not been
+tested.
+
+=== Installation ===
+                                    Linux
+   From the tarball:
+If you are installing Testopia from the release tarball, simply expand the
+tarball in your bugzilla top level directory. On linux this would look
+something like this:
+
+  $> cp testopia-.tar.gz /path/to/bugzilla
+  $> cd /path/to/bugzilla
+  $> tar xzvf testopia-.tar.gz
+
+You then need to run tr_install.pl followed by checksetup.pl, and follow any
+instructions that they produce.
+
+  From CVS
+If you want to install the latest code from CVS you will need to do the 
+following:
+
+1. Check out the CVS code in a temporary location
+
+  $> export CVSROOT=:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
+  $> cvs login
+  (Logging in to anonymous@cvs-mirror.mozilla.org)
+  CVS password: anonymous
+
+  $> cvs co Testopia
+
+2. You will now make a tarball of the source. If you like to update your 
+Bugzilla from CVS, be sure to delete the top level CVS direcory first.
+
+  $> cd mozilla/webtools/testopia
+  $> rm -rf CVS
+  $> tar cvf /tmp/testopia.tar .
+
+Once you have your tarball, follow the instructions above to untar it into your
+Bugzilla directory and run tr_install and checksetup. The last step is to 
+install the dojo libraries:
+
+  $> cd path/to/bugzilla/testopia/
+  $> svn co http://svn.dojotoolkit.org/dojo/trunk/ dojo
+
+Congratulations, you should be able to see the Testopia links at the bottom of
+your bugzilla pages. 
+
+                                  Windows
+Good question. For the most part it should work the same as on Linux, 
+substituting the appropriate paths and commands. Unfortunately I don't have
+a good Windows setup to try it on.
+
+=== Upgrading from 1.0 ===
+
+NOTE: This should only be done on a Bugzilla 2.22 installation
+
+1. Untar the testopia files.
+2. Remove testopia/tr_patch_successful
+3. run patch -p2 -i testopia/patch-2.22
+   Answering no when it asks to apply -R
+4. run tr_install.pl -nopatch
+5. run checksetup.pl
+
+=== Getting Help ===
+
+First you should consult the documentation. You can reach it by clicking the 
+Help link on your installation or by visiting:
+
+    http://wiki.mozilla.org/Testopia:Documentation
+
+Questions can be asked on the mailing list: 
+    
+    support-webtools@lists.mozilla.org
+    
+or in the IRC channel at: 
+    
+    irc.mozilla.org/mozwebtools
+
+The latest news and info can be found at the project homepage:
+
+    http://www.mozilla.org/projects/testopia
diff --git a/testopia/css/default.css b/testopia/css/default.css
new file mode 100755
index 0000000..c51b84c
--- /dev/null
+++ b/testopia/css/default.css
@@ -0,0 +1,181 @@
+textarea {
+  background-color: #fff;
+  border: 1px solid #999;
+}
+
+.resultsTable {
+  border-collapse: collapse; /*cellspacing*/
+  border-spacing: 0px;
+}
+.resultsTable td { /*only immediate tds of mytable*/
+  padding: 4px; /*cellpadding*/ 
+}
+
+.resultsTable td a:hover {
+  text-decoration:underline overline;
+}
+
+.resultsTable th {
+  border-color:#FFF;
+  background-color:#C0FFC0;
+  
+  border-style:solid;
+  border-width: 2px;
+  padding: 4px;
+}
+
+.dlgTable {
+  border-collapse: collapse; /*cellspacing*/
+  border-spacing: 0px;
+}
+
+.dlgTable td { /*only immediate tds of mytable*/
+  padding: 4px; /*cellpadding*/
+  background-color:#EEE;
+}
+
+.spacerTable {
+  border-collapse: collapse; /*cellspacing*/
+  border-spacing: 0px;
+}
+.spacerTable td { /*only immediate tds of mytable*/
+  padding: 16px; /*cellpadding*/
+  background-color:#FFF;
+}
+
+.menuTable {
+  border-collapse: collapse; /*cellspacing*/
+  border-spacing: 0px;
+}
+.menuTable td { /*only immediate tds of mytable*/
+  padding: 4px; /*cellpadding*/
+  background-color:#EEE;
+  
+  border-style:solid;
+  border-width: 3px;
+  border-color:#FFF;
+}
+
+.evenRow_first {
+  background-color:#FFF;
+}
+.evenRow {
+  background-color:#FFF;
+}
+.evenRow td{
+  background-color:#FFF;border-top-style:solid;border-top-width:1px;border-top-color:#CCC;
+}
+
+.oddRow_first {
+  background-color:#EEE;
+}
+.oddRow {
+  background-color:#EEE;
+}
+.oddRow td {
+  background-color:#EEE;border-top-style:solid;border-top-width:1px;border-top-color:#CCC;
+}
+
+.highlightedCell {
+  border-width:1px;
+  border-style:solid;
+  background-color:lightyellow;
+}
+
+/* tr_showcaselog */
+
+.short_body {
+  border-bottom:1px solid #000;
+  border-left:1px solid #000;
+  border-right:1px solid #000;
+}
+
+.short_head {
+  border-top:1px solid #000;
+  border-left:1px solid #000;
+  border-right:1px solid #000;
+}
+
+.ae_dv {
+  display:none;
+  margin-left:15px;
+  border-width:0px;
+}
+
+.ae_tb {
+  width:100%;
+  border:0;
+  margin:0;
+  margin-right:30px;
+  margin-bottom:10px;
+  border-collapse:collapse;
+  border-spacing: 0px;
+}
+
+.ae_s {
+  border-style:solid;
+  border-width:1px;
+  border-color:#000;
+  background-color:#FFFFE0;
+}
+
+.cc_i {
+  float:left;
+  margin-left:10px;
+}
+
+.cc_xx {
+  clear:both;
+  margin-right:30px;
+  padding-top:5px;
+}
+
+.cc_trg {
+  padding-left:5px;
+  padding-right:5px;
+  vertical-align:baseline;
+}
+
+/* TODO: refactor these two: */
+
+#floatMsg {
+  text-align:right;
+  background-color:#FFDD66;
+  color:black;
+  padding:4px;
+  padding-left:20px;
+  padding-right:20px;
+  font-family:Arial;
+  font-weight:bold;
+  font-size:12px;
+  display:none;
+}
+
+.floatMsg {
+  text-align:right;
+  background-color:#FFDD66;
+  color:black;
+  padding:4px;
+  padding-left:20px;
+  padding-right:20px;
+  font-family:Arial;
+  font-weight:bold;
+  font-size:12px;
+  display:none;
+}
+
+.tr_button {
+  width:100px;
+}
+
+a img {
+  border: none;
+}
+
+h3 {
+  border-bottom: 1px dotted #000;
+}
+dt {
+  font-weight: bold;
+  font-size: medium;
+}
\ No newline at end of file
diff --git a/testopia/css/print.css b/testopia/css/print.css
new file mode 100644
index 0000000..eb9db96
--- /dev/null
+++ b/testopia/css/print.css
@@ -0,0 +1,33 @@
+body {
+	font-family: arial,sans-serif;
+}
+.print_table_header {
+	font-weight: bold;
+	text-align: center;
+	padding-left: 5px;
+	padding-right: 5px;
+	border-bottom: 1px solid #000;
+}
+.print_table_row_header {
+	font-weight: bold;
+	text-align: right;
+	padding-right: 5px;
+	border-right: 1px solid #000;
+}
+.print_table_bold {
+	text-align: right;
+	font-weight: bold;	
+}
+.print_table_body {
+	text-align: left;
+	padding-left: 15px;
+}
+.print_table_data {
+	text-align: center;
+}
+.print_table {
+	border-left: 1px solid #000000;
+	border-top: 1px solid #000000;
+	border-right: 1px solid #000000;
+	border-bottom: 1px solid #000000;
+}
diff --git a/testopia/css/report.css b/testopia/css/report.css
new file mode 100755
index 0000000..7828844
--- /dev/null
+++ b/testopia/css/report.css
@@ -0,0 +1,97 @@
+BODY {
+  font-family: Arial;
+}
+
+H1 {
+  font-size: 20px;
+  font-weight: bold;
+}
+
+H2 {
+  font-size: 16px;
+  font-weight: bold;
+  
+  /*border-style: solid;
+  border-color: #000;
+  border-width: 0px;
+  border-top-width: 2px;
+  padding-top: 8px;*/
+  background-color:#EEE;
+}
+
+H3 {
+  font-size: 14px;
+  font-weight: bold;
+}
+
+TABLE {
+  border-collapse: collapse; /*cellspacing*/
+  border-spacing: 0px;
+}
+
+TH {
+  font-weight: bold;
+  font-size: 14px;
+  
+  border-style: solid;
+  border-color: #000;
+  border-width: 0px;
+  border-bottom-width: 1px;
+  
+  /*background-color:#EEE;*/
+  padding: 4px; /*cellpadding*/
+  padding-left:8px;
+  padding-right:8px;
+  vertical-align:bottom;
+}
+
+TD {  
+  font-size: 14px;
+  padding: 4px; /*cellpadding*/
+  padding-left:8px;
+  padding-right:8px;
+}
+
+TD.sep {
+  border-style: solid;
+  border-color: #CCC;
+  border-width: 0px;
+  border-bottom-width: 1px;
+}
+
+TD.caption {
+  font-weight: bold;
+  text-align:right;
+}
+
+.tr_notes {
+  font-family: Arial;
+  margin-bottom:0px;
+}
+
+.header {
+
+  border-style: solid;
+  border-color: #000;
+  border-width: 0px;
+  border-top-width: 2px;
+  border-bottom-width: 2px;
+}
+
+.content1 {
+
+  padding-top: 16px;
+  padding-bottom: 16px;
+  border-style: solid;
+  border-color: #000;
+  border-width: 0px;
+  border-bottom-width: 2px;
+}
+
+.notes {
+  font-style: italic;
+}
+
+.highlight {
+  font-weight: bold;
+}
\ No newline at end of file
diff --git a/testopia/doc/Manual.odt b/testopia/doc/Manual.odt
new file mode 100644
index 0000000000000000000000000000000000000000..48800fb80cc8be6bea6c31a2431953a7e6a57db2
GIT binary patch
literal 144627
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
XO;_t24qA*3^;3?Ex?7_MM!^378)-cE

literal 0
HcmV?d00001

diff --git a/testopia/doc/Manual.pdf b/testopia/doc/Manual.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a0222a2a1d88590810eb2be16d8fb04d7b1681c1
GIT binary patch
literal 384291
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 z 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

V@E6j}2>J$crL8gWe^$Q=g5?TpC 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�_H%(uzi;cd(|LNP@T#+ZS0G5Ub>`&| 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.tar.gz} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 4.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls16\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Run tr_install.pl } +\par \pard\plain {\listtext\pard\plain \li1080\ri0\lin1080\rin0\fi-360\sa120 \tab}\ilvl1 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f5\fs24\lang1033\i0\b0\*\cs39\cf0\rtlch\ltrch\dbch\hich\f5\fs24\lang1033\loch\f5\fs24\lang1033 perl tr_install.pl} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 5.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls16\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0\*\cs39\cf0\rtlch\ltrch\dbch\hich\f5\fs24\lang1033\loch\f5\fs24\lang1033\f0 Download Dojo (If installing from CVS)} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0\*\cs39\cf0\rtlch\ltrch\dbch\hich\f5\fs24\lang1033\loch\f5\fs24\lang1033\f0 The easiest way to install dojo is from their subversion repository. Instructions are found in the DOJO_INSTALL_HELP file inside the testopia/dojo directory.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The tr_install script sets up the database tables, patches your code, and sets up the Testers group in Bugzilla. Whenever you update Testopia, you should run tr_install and checksetup again.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 You should now be able to See the Testopia links in the Bugzilla footer after logging into Bugzilla. Make sure you update the new Testers group to include any users that are going to need access to test cases. } +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Upgrading From Testopia 1.0.x} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To upgrade an existing release of Testopia, you can simply follow the steps outlined above. Running tr_install will upgrade your database and set any file permissions. You can also upgrade to the latest CVS tip using the cvs_update.sh script located in the + testopia/scripts directory.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Upgrading from Testrunner (v0.7 and prior) is not supported. } +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Configuration} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Testopia adds a number of additional parameters to the Bugzilla Parameters page. They are located under the Testopia tab. If you are installing Testopia with a new installation of Bugzilla, you should be sure to set the {\b urlbase }{\b0 parameter. Folowing is a lis +t of required Testopia parameters and their explanations:}} +\par \pard\plain \ltrpar\s11\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af11\afs24\lang255\ab\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\b\loch\f0\fs24\lang1033\b {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b {\*\bkmkstart allow-test-deletion}{\*\bkmkend allow-test-deletion}allow-test-deletion} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0{\b0 \tab I}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 f this option is on, users can delete objects including plans and cases. Delete rights are maintained by the plan access control lists.} +\par \pard\plain \ltrpar\s11\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af11\afs24\lang255\ab\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\b\loch\f0\fs24\lang1033\b {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b {\*\bkmkstart testopia-allow-group-member-deletes}{\*\bkmkend testopia-allow-group-member-deletes}testopia-allow-group-member-deletes} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0{\b0 \tab }}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 If this option is on, members of the Testers group will be allowed to delete test objects. This overrides settings for individuals in the Testers group.} +\par \pard\plain \ltrpar\s11\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af11\afs24\lang255\ab\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\b\loch\f0\fs24\lang1033\b {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b {\*\bkmkstart testopia-default-plan-testers-regexp}{\*\bkmkend testopia-default-plan-testers-regexp}testopia-default-plan-testers-regexp} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This is the default regular expression for granting access to new test plans.} +\par \pard\plain \ltrpar\s11\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af11\afs24\lang255\ab\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\b\loch\f0\fs24\lang1033\b {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b {\*\bkmkstart default-test-case-status}{\*\bkmkend default-test-case-status}default-test-case-status} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Default status for newly created test cases.} +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Using Testopia} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Why Test?} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The following example illustrates why software testing is so important:} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Taken from {\field{\*\fldinst HYPERLINK "http://techiecorner.blogspot.com/" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://techiecorner.blogspot.com}} .} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri567\lin567\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 In March 1992, a man living in Newtown near Boston, Massachusetts, received a bill for his as yet unused credit card stating that he owed $0.00. He ignored it and threw it away.} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri567\lin567\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 In April, he received another and threw that one away too.\line The following month, the credit card company sent him a very nasty note stating they were going to cancel his card if he didn't send them $0.00 by return of post. He called them and talked to them; + they said it was a computer error and told him they'd take care of it.} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri567\lin567\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The following month, our hero decided that it was about time that he tried out the troublesome credit card figuring that if there were purchases on his account it would put an end to his ridiculous predicament. However, in the first store that he produced +his credit card in payment for his purchases, he found that his card had been canceled.} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri567\lin567\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 He called the credit card company who apologized for the computer error once again and said that they would take care of it. The next day he got a bill for $0.00 stating that payment was now overdue. Assuming that, having spoken to the credit card company +only the previous day, the latest bill was yet another mistake, he ignored it, trusting that the company would be as good as their word and sort the problem out.\line The next month, he got a bill for $0.00 stating that he had 10 days to pay his account or the +company would have to take steps to recover the debt.} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri567\lin567\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Finally giving in, he thought he would play the company at their own game and mailed them a cheque for $0.00. The computer duly processed his account and returned a statement to the effect that he now owed the credit card company nothing at all.} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri567\lin567\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A week later, the man's bank called him asking him what he was doing writing a cheque for $0.00. After a lengthy explanation, the bank replied that the $0.00 cheque had caused their cheque processing software to fail. The bank could now not process ANY che +ques from ANY of their customers that day because the cheque for $0.00 was causing the bank's computer to crash.} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri567\lin567\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The following month, the man received a letter from the credit card company claiming that his cheque had bounced and that he now owed them $0.00 and unless he sent a cheque by return of post them would be taking steps to recover the debt.} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li0\ri567\lin0\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 This rather humorous anecdote explains the impact that untested software can have. In the case of both the credit card company and the bank, this seemingly minor issue may have cost both institutions significant sums of money in lost transactions and down +time, to say nothing of the frustration of the customer.} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri567\lin567\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Many times software errors cause only minor inconveniences. Other times they can have serious consequences. Think of the life support systems on the space shuttle or the flight control systems on an airliner. Software has become such an integral part of ou +r lives that many times we don't realize how much we depend on it until something goes wrong.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b What Types of Testing can Testopia Help You With?} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 There are two general classifications of software testing: black box and white box.} +\par \pard\plain \ltrpar\s30\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri567\lin567\rin567\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0{\cf1 Black box testing is a strategy in which testing is based solely on the requirements and specifications. Unlike its complement, white box testing, black box testing requires no knowledge of the internal paths, structure, or implementation of the software u +nder test}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 (Copeland, 2004,Sec I).} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \sb240\sa120\keepn\f2\fs28\b\fs28\b\fs28\b \ltrpar\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\b\loch\f2\fs28\lang1033\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i0\b Black Box Testing} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Testopia was designed primarily for this type of testing. Requirements are translated directly into test cases to be applied by the testers to the software being developed. If a requirement is not met, the test case fails; if it is met, it passes.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\b\fs28\b\fs28\b \ltrpar\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\b\loch\f2\fs28\lang1033\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i0\b White box and Automated Testing} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Though not specifically designed to handle white box tests (which are often automated), Testopia can still provide a repository for test results. Each test case can have an associated script and test logs can be attached to a test case to show the results +of testing.} +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Getting Started} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\b\fs28\b\fs28\b \ltrpar\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\b\loch\f2\fs28\lang1033\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i0\b The Big Picture} +\par +\pard\plain\absw8988\absh7305\pvpara\posyt\phcol\posxc{\*\flymaincnt69\flyvert14529\flyhorz49666\flyanchor0\flycntnt}{\*\shppict{\pict\picscalex83\picscaley80\piccropl0\piccropr0\piccropt0\piccropb0\picw636\pich536\picwgoal10775\pichgoal9080\pngblip +89504e470d0a1a0a}}{\nonshppict{\pict\picscalex83\picscaley80\piccropl0\piccropr0\piccropt0\piccropb0\picw636\pich536\picwgoal10775\pichgoal9080\wmetafile8 +0100090000036900000010001c0000000000050000000b0200000000050000000c020000000004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103000700 +0000430f2000cc00000000000300000000000000000000000000}} +\pard +\pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Since Testopia is an extension to Bugzilla, it relies on many of the same objects that Bugzilla uses to track bugs. In order to use Testopia you first need to set up products and versions using the Bugzilla product editor. Testopia makes use of Bugzilla's +target milestones feature as well so you may want to turn this optional field on in the parameters.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Testopia is comprised of several objects that are interdependent. Together, they make managing the testing procedure possible. Lets look at each of these in turn.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Test Plans} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 At the top of the Testopia hierarchy are test plans. Before you can do anything else in Testopia, you need a test plan. Test plans are associated with a single product in Bugzilla, though you can have multiple test plans for each product. Your test plan wi +ll serve as the storage point for all related test cases and test runs and it will act as the dashboard for your testing. It will also serve to determine who will have access to update test cases.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Test Cases} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test cases are the heart of all testing. Test cases spell out what steps to take while running a test and what outcomes to expect. If a particular run through the steps fails to produce the expected outcome, the test fails. Test cases are semi-independent +in Testopia. Each test case can be associated with multiple test plans so care should be taken to ensure that updating a test case does not interfere with testing in another test plan than your own. A list of associated test plans is displayed with each te +st case though, so this should not be too difficult.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test cases are divided into categories. You can define as many categories for your product as you like from the test plan page. These should not be confused with components however. Each product in Bugzilla is divided into components and you can apply mult +iple components to each test case, however each test case can belong to only one category at a time.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Test Runs} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test runs are the focal point of the testing effort. Once you have defined a set of test cases, you are ready to run through those tests in a test run. Each run is associated with a single test plan and can consist of any number of test cases from that pla +n. Before we can run any test however, we need to have a couple more items first.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Test Run Environments} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 If test cases are the 'what' of testing, then environments are the 'where'. No test runs in a vacuum. Where you run your test is as important as how you run it. Software often is designed to run on specific hardware under specific conditions. These conditi +ons are captured in the test environment. Environments are applied to test runs directly, but can be applied to test cases indirectly as we will see.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Builds} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Software development is usually an iterative affair. Developers write code which is then compiled and included in a system. As bugs and enhancement requests come in, the developer rewrites portions over again to fix or enhance a product. In Testopia, each +iteration is called a build. Builds are often associated with milestones of the project. This is reflected in the build's relationship to Bugzilla's target milestones object. Regardless of whether you use target milestones in Bugzilla, you need to define a +t least one build for your product before you can begin a test run.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Test Case-Runs} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A test case-run is the record of how a particular test case fared in a particular run for a given build in a given environment. When you create a test run, records for each test case in that run are created. By default these take on the build and environme +nt of the test run, however, it is possible to change these attributes on a particular case-run, essentially creating a new case-run for each combination. This is desirable in situations where most test cases are fairly generic in environmental scope but s +ingle test cases might require specific conditions. It also aids in iterative testing as each test case then be updated in a single run rather than having to create new runs to test the failed cases.} +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Testing In Testopia} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Start With a Plan} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 All testing should start with a test plan. In most cases this will take the form of a document that details the purpose, structure, and methods that will be employed in testing. The IEEE has put together a standard document template for test plans (IEEE St +andard 829-1998 for Software Test Documentation). Whether you decide to use a formal template such as this or not, having a rough outline of what your purpose for testing is will help those who test this in the future know what you were looking for in your + testing.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To create a new test plan in Testopia:} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 1.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls15\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Click the '{\ul\ulc0 New Plan}' link in the Bugzilla footer} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 2.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls15\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Enter a name for this test plan.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 3.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls15\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select a product from the product drop-down list} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 4.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls15\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select a type for this plan (descriptions of types below)} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 5.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls15\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select a product version. This will be the default version for new runs.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 6.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls15\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Type or paste your plan document into the Plan Document Editor} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 7.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls15\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Click the {\b Add} button} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have done this, you will be taken to your newly created test plan. } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Viewing A Test Plan} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 At the top of your new plan, you will see an overview section detailing much of the information you entered on the new plan form. In addition to this however, you will see such things as the plan author, when it was created, and what version of the documen +t you are viewing.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Below the overview section is the place for viewing categories and builds associated with this plan's product. You also have an area where you can add tags and view existing tags on this plan. We will discuss tags at greater length later.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 From here you may wish to create some categories for your test cases and add some builds before you begin creating test cases.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Attaching Files} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have created your test plan, you can upload attachments to it. To create an attachment, simply click the browse button and locate the file you wish to attach, type a description in the Description field and click the attach button. } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Attachments are treated very much the same as they are in Bugzilla. The size limit will be determined by the max-attachment-size parameter the same as it is for Bugzilla} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To edit an attachment click the edit link. This takes you to a page where you can set the description, filename, and mime-type for the attachment as well as view it if it is a viewable type or download it otherwise.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Editing Plan Fields} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 With the possible exception of product, you can edit any of the values that you supplied when you created your test plan buy scrolling down to the Attributes section or by clicking the '{\ul\ulc0 Edit Plan Attributes}{\ulnone\ulc0 ' link in the overview section. You are able to ed +it the product field as long as there are no test runs associated with this plan yet. Once you have created a test run you will not be able to update the product attribute unless you delete the run first.}} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Viewing Plan History} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Any changes made to plan values are captured and a history is kept so that as test circumstances change over the course of a development cycle, you can know what applied for a given set of tests in time. This also serves to thwart unintentional changes to +your test plan since each change captures when it happened and who performed it. To view this history click the {\b History}{\b0 button.}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Changes to the plan document are handled a little differently. A full version is kept for each change and it is possible to view the differences between versions by selecting which versions you want to compare and clicking the {\b Compare}{\b0 button on the plan hi +story page.}} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Adding Categories and Builds} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Categories are used to classify your test cases. Each product has a default category and it is up to you want to use categories to divide up your test cases. Since you can also apply product components to a test case, you may find that this suffices.{\ulnone\ulc0 Befor +e you can create a test run however, you have to specify at least one build. To add a build or category you can click the }{\ul\ulc0 add}{\ulnone\ulc0 link found below each of these fields from the test plan page. The fields are fairly self explanatory. In the case of builds howev +er, you have the option of hiding the build by unchecking the A{\b ctive} box.. This will hide it from the build list used when creating a run.}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To edit categories and builds, click the links above their respective fields on the test plan. From here you can edit individual builds and categories or remove them.} +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Creating Test Cases} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have a plan to store them in, you can start entering your test cases. Click the {\ul\ulc0 Create a New Test Case}{\ulnone\ulc0 link on the plan page or click the }{\ul\ulc0 New Case}{\ulnone\ulc0 link in the footer to begin.}} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Shortcut \uc3 \u8211\'e2\'80\'93\uc1 Creating a Test Case} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 1.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls14\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Click {\ul\ulc0 Create a New Test Case} on the plan page or {\ul\ulc0 New Case} from the footer} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 2.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls14\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Enter a short description of your test case in the {\b Summary} field} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 3.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls14\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select a {\b Category}} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 4.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls14\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Add a default tester or select a component to assign the test case to the Bugzilla QA Contact for that component.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 5.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls14\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 List the steps for testing in the {\b Action} field} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 6.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls14\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Provide the expected outcomes in the {\b Expected Results} field} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 7.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls14\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Click the {\b Add} button.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Because it is possible to have a single test case linked to multiple test plans, you can select which plans you wish to link your new case to. For now, we only have one so we will only see a single check box. } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 First you need to write a short summary of your test case in the summary field. Notice the options for the other fields here as well. Descriptions of each can be found at the end of this document. The only required field here is the summary, however you ma +y want to apply a default tester and a requirement at this time. Selecting a component at the right will automatically set the default tester based on the Bugzilla QA contact of that component.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Though not required at this point, you should supply your list of testing steps in the {\b Action }{\b0 field and the list of expected outcomes in the }{\b Expected Results}{\b0 field. To do this, click the {\ul\ulc0 Edit Document} link under the appropriate field. This will display a W +YSIWYG editing area where you can type or paste your values. For tips on writing good test cases refer to D.L Runnels' }{\field{\*\fldinst HYPERLINK "http://www.stickyminds.com/getfile.asp?ot=XML&id=2136&fn=XDD2136filelistfilename1.pdfL" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\b0\ul\ulc0 How to Write Better Test Cases}}}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 From here you are taken to your test case. You will notice a link at the top giving you the option of creating another test case for this plan at this time. } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Adding and Removing Components and Tags} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once again, you are offered an overview detailing the information for this test case at a glance. Below that you have the option of adding additional components to this test case. Because some testing is cross product, you have the option to add components + from any product in Bugzilla to your test case. You can also remove a component by selecting it from the list and clicking the {\b Remove} button. } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 As with plans you also can apply tags to your test cases. This will be described later.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Viewing Test Case-Run Results} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Below this section will display a history of this test case in all runs and their status as to whether they passed or failed in those runs. You also will see a graph representing the percentage of pass/fail across all runs. } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Attaching Files} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Just like test plans, you can attach files to your test cases. This works the same as for test plans.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Attaching Bugs} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Unlike test plans, you have the option of attaching Bugzilla bugs to your test cases. Each test case can have multiple bugs attached. To attach a bug, enter the bug number in the field and click the {\b Commit}{\b0 button. A table of attached bugs is displayed.}} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Editing Case Fields} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 As with test plans, you can update any of the values you entered while creating the plan. A history of these changes is also kept which you can view by clicking the {\b History}{\b0 button near the top of the test case. }} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Test Case Dependencies} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test cases have the concept of dependencies. Often when testing a set of test cases, the order in which you test is determined by what tests came before. It is also often the case that if a given test case fails, it prevents other test cases from being run + successfully at all. You can represent those relationships here using the {\b blocks }{\b0 and }{\b depends on}{\b0 fields. If this test potentially blocks the execution of another test case, you would enter that other test case's id in the }{\b blocks}{\b0 field. If this test case r +equires some other test case be run first you can enter that other test case's id in the }{\b depends on }{\b0 field. If a test case that blocks another test case fails, and both of them are in a single run, the blocked test case will automatically receive a status +of }{\b BLOCKED}{\b0 .}} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Creating Environments} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 As mentioned above, environments are the {\i where }{\i0 in testing. }In software testing in particular, this might include such things as which operating system and what hardware platform a test was conducted on.. Environments can be as broad or narrow as you define + them. The most basic environment consists of an OS and platform chosen from Bugzilla's lists of these objects. However it can be much more complicated such as a suite of applications and other products. It could be a browser or other client package.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Creating an environment in Testopia requires two steps. The first involves defining a set of variables to be used in your environment. The second is to create the environment from the set of possible elements.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\b\fs28\b\fs28\b \ltrpar\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\b\loch\f2\fs28\lang1033\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i0\b Environment Administration} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 When you first install Testopia, you must first define the set of environment variables that will be used to construct your environments. To access these, click the {\ul\ulc0\i0 Environment Variables} link in the footer. The environment variables are arranged in a hier +archy of objects that is represented as a tree. There are four major levels: Category, Element, Property, and Property Values.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\i\b\fs23\i\b\fs23\i\b \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\i\b\loch\f2\fs23\lang1033\i\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i\b Categories} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Environment Categories are similar to test case categories in that they provide a sorting mechanism for your environment elements. Each category is associated with a single product or in the special bucket labeled {\i \uc3 \u8211\'e2\'80\'93\uc1 ALL-- . }{\i0 The \uc3 \u8211\'e2\'80\'93\uc1 All-- denotes all products, +meaning it holds categories of elements that are not specific to any product.}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 When you first install Testopia you will see that the \uc3 \u8211\'e2\'80\'93\uc1 ALL-- bucket contains two Categories, OS and Platform. Expanding these you will see that there are elements representing each of the OS and Platform values defined in Bugzilla. This is list is generate +d at the time you first install Testopia and is maintained separately from the Bugzilla lists thereafter. } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To create a category, right click on the product or \uc3 \u8211\'e2\'80\'93\uc1 ALL-- and choose {\i Add Category}. You can then click on the newly create category in the tree which will pop up a form that allows you to edit the category name or change the product it is associated with.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\i\b\fs23\i\b\fs23\i\b \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\i\b\loch\f2\fs23\lang1033\i\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i\b Elements} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have a category defined for your product or the \uc3 \u8211\'e2\'80\'93\uc1 ALL-- bucket, you can add elements to that category. Elements are the crux of what makes up your environment. To create an element, right click on the category you wish to add it to and choose {\i creat +e element. }} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 This will create an element labeled \uc3 \u8220\'e2\'80\'9c\uc1 New Element\uc3 \u8221\'e2\'80\'9d\uc1 which you can edit by clicking on it in the tree, or right clicking and choosing {\i Edit. }} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Elements can be nested inside other elements. To create a sub element, right click on the element and choose {\i Add Element}. You can edit this child element in the same manner as its parent. You can create as many levels of elements as you need to represent t +he complexity of your environment.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\i\b\fs23\i\b\fs23\i\b \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\i\b\loch\f2\fs23\lang1033\i\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i\b Properties} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Properties describe your element. You can add properties to your elements by right clicking the element and choosing {\i Add Property}. You can add as many properties to your elements as you need. Properties cannot be nested however.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To edit your property, click on it in the tree or right click on it and choose {\i Edit}{\i0 .}} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\i\b\fs23\i\b\fs23\i\b \ltrpar\s7\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\i\b\loch\f2\fs23\lang1033\i\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i\b Property Values} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have defined a property for your element, you will need to provide a list of values from which to select for you environment. Right click on your property and choose {\i Add Value }{\i0 to create a value for your property. You can edit property values by ri +ght clicking and choosing Edit, or by clicking on one of the values under your property.}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 You can change the name or reorder the list of values from the form provided. You must hit Save Changes in order for you changes to be committed. } +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Creating Your Environment} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have set up the elements that will be used in your environment, you can now create environments with those elements.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Click the {\i0{\ul\ulc0 New Environment}}{\i0 link in the footer. }} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 You are prompted to name your environment and choose a product for it. The product is used only for classification. It does not limit your choices of which elements can be placed in your environment.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Clicking {\b Create} will take you to the environment editor. Here you will see two trees, one representing your new environment and the other containing the list of variables from which to choose. Your environment will consist of the elements you defined earli +er. To add an element, find it in the list and simply drag it onto your environment tree. The order does not matter. You can grab child elements at any level, but dragging an element with children will bring the children as well. } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have selected the elements for your environment, you can now select which of the property values apply to your environment. Expand the element and property and simply click the value you wish to use. It will have a star placed next to it to show y +our selection.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To remove an element, right click on it and choose R{\i emove}.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 All changes to your tree are saved immediately. } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Creating A Test Run} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Shortcut \uc3 \u8211\'e2\'80\'93\uc1 Creating a Test Run} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 1.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls13\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Click the {\ul\ulc0 Create a New Test Run}{\ulnone\ulc0 link on your test plan or the }{\ul\ulc0 New Run}{\ulnone\ulc0 link in the footer.}} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 2.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls13\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select which test cases to include. Use the filter to narrow your scope and the paging links to view more or fewer test cases.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 3.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls13\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Enter a summary for this test run.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 4.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls13\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select a build from the {\b Build} list or type the name for a new one.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 5.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls13\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select an environment from the {\b Environment} list.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 6.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls13\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Click {\b Add}.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have an environment to test in and some test cases to test, you are now ready to begin testing. You do this by creating a test run. The easiest way to do this is from within your test plan. Click the {\ul\ulc0 Create a New Test Run}{\ulnone\ulc0 link in the Test Runs sec +tion of your plan. You can also create a run by clicking the }{\ul\ulc0 New Run}{\ulnone\ulc0 link in the footer and entering your plan number.}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 You will be presented with a list of CONFIRMED test cases from your test plan. You can select only the ones you want included or all of them at once using the select all link. If you want to limit the list to only include test cases that meet certain crite +ria, you can use the filter to narrow down the list. If you have a lot of test cases, you can use the paging features in the table of test cases to view more than the default 25 at a time. This is important as the only test cases that will be included are +those that are visible on the screen and have a check in the box next to the case ID. If you do not know which test cases to apply, or do not wish to do so at this time, you can always add test cases later.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Next you need to provide a summary and select a build. If you forgot to create the build before, you can simply type the name of a new build in the {\b New} box and it will be added to the product. You can then edit the build later to add a milestone. Finally y +ou need to select an environment. You do this by typing the name of your environment in the {\b Environment} box. As you type, a list of environments from your product that match will appear. You can also click the drop down arrow to view a list of all environm +ents in your product. } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have completed the form, click the {\b Add} button to be taken to your new run.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Viewing Your Test Run } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 As with the other objects, you will notice an overview section at the top of your run. This contains similar information as found in the test case and test plan with one notable exception: the progress bar. This will show you a percentage of completed test + cases with the colors representing statuses. } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Below this section you will see the Test Case Run Logs. This table represents the test cases you will be testing each row represents a single case-run. You will notice the expander arrows next to each row in the table. Click on this to expand the case-run +form. Take note of the {\b Filter} and {\b Report} expanders as well. You can use the filter much like you did when choosing the test cases to include in your run, except this provides more options for narrowing the list of case runs visible at a time.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Adding Cases} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 As mentioned earlier, you can add test cases to your run by clicking the {\b Add Cases} button below the case-run table. This will take you back to the list of test cases you saw when creating your test run excluding any test cases in your plan that are already + in this run. } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Editing Test Run Fields} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 As with test cases and test plans, you can update any of the values you applied when you created the test run in the form at the bottom of the page. Note that changing the build and environment will not affect the case-runs already in the run but it will a +pply to any test cases added after the change. Changes to these fields are tracked and a history is kept much the same way as with test plans and test cases. Clicking the {\b History} button will display this history.} +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Running Your Tests} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 As a tester, you will likely spend most of your time running tests and recording the results from the test run page. When you first open a run the test cases are represented in a table as case-runs. Clicking the expander arrow next to each test case will e +xpand the test case-run form. Your run may included only those test cases that are required for a specific testing priority, or for a given tester. Or, your test run may include a larger set of test cases that represents an entire test cycle. On a given da +y, you may only want to test the highest priority test cases and skip lower priorities for later in the process. Or you may just want to run regression tests on the set of previously failed test cases. You can do this using the filters. } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Filtering Your Test Cases in a Run} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Expand the {\b Filter }{\b0 by clicking the expander triangle next to the filter. You will notice a number of options for filtering your test cases including:}} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls12\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Status} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls12\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Category} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls12\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Build} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls12\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Environments} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls12\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Priorities} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls12\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Components} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls12\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Assignee} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls12\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Tags} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls12\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Case summary.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Testopia remember your filters so that the next time you view this run it will apply the last filter you used. To clear the filter and return to the full list click the {\b Clear} button.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Sorting Test Cases} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 You can sort the list of test cases by clicking on any of the table column headings. You can also sort on the summary by clicking any of the {\b Summary }{\b0 field headers. If you wish to create a custom sort order for your test cases, type a number to index on in +the }{\b Index}{\b0 fields and click }{\b Change}{\b0 . Sorting on this field will then display your cases in ascending order of the indexes you supplied.}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Currently Testopia only supports ascending sorts. Support for descending sorts are planned for future releases.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Passing and Failing Test Cases} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you are ready to begin testing, expand the first test case in your list and read the {\b Action} and {\b Expected Results}{\b0 for this case. You can then perform the test. If the expected outcome is achieved you can pass the test by clicking the green check or }{\b PAS +SED}{\b0 button: {\*\shppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw14\pich14\picwgoal237\pichgoal237\pngblip +89504e470d0a1a0a}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw14\pich14\picwgoal237\pichgoal237\wmetafile8 +0100090000036900000010001c0000000000050000000b0200000000050000000c020000000004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103000700 +0000430f2000cc00000000000300000000000000000000000000}} +.}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 If the results were not expected or an error occurred, you can fail the test by clicking the red X or {\b FAILED} button: {\*\shppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw14\pich14\picwgoal237\pichgoal237\pngblip +89504e470d0a1a0a}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw14\pich14\picwgoal237\pichgoal237\wmetafile8 +0100090000036900000010001c0000000000050000000b0200000000050000000c020000000004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103000700 +0000430f2000cc00000000000300000000000000000000000000}} +.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Explanations of the other statuses appear at the end of this document.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Adding Notes} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Updating the status will add a line to the notes field with the time of the change and who made it. You can add additional notes by typing them in the {\b Add Note} field and clicking {\b Append Note}.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Attaching Bugs} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 If a test case has failed, or for any other reason, you may want to attach a bug to this test. You can attach existing bugs or create new ones. To attach an existing bug, type the bug number in the box and click {\b Attach Bug}. The bug will be displayed in the + {\b Bugs Detected} field. If you wish to log a new bug, click the {\b New }button. You will be taken to the enter bug page with information about the test case already provided in the form. You can now provide any additional details and submit the bug. This is done + in a new window so that you do not lose your place in testing. To return to your run, close the new window.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Reassigning Tests} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The assignee field is used to help testers track their own test cases. If you wish to change the assignee of a particular test case, you can do so by entering their Bugzilla user name in the assignee field and clicking {\b Assign}. Updating test cases is not li +mited by assignee. Anyone with rights to edit the case-run can pass or fail the test. If a test case is closed (PASSED, FAILED, or BLOCKED), the name of the person who performed the action is captured in the {\b Tested By} field. } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Changing Build or Environment on a Test Case} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Testopia is designed to be flexible. Testing organizations vary greatly on modes and methodologies. For this purpose, test runs were designed to allow the greatest flexibility possible as to how tests are run. Some groups will create a single test run for +each build and environment combination they encounter. Others will want a monolithic test run that represents an entire product release. In this case you can update the build and environments on individual test cases in your run. Each time you do, the appr +opriate case-run record is returned, if one exists, or is created if it does not. A note is appended with the time of the change as well as who made the change. If a new record is created, the status is set to IDLE and you are ready to test with your new b +uild or environment selection. For any given run, the case-runs displayed are the last ones that were updated. In essence however, the case-run table represents a two dimensional view of a three dimensional object. Changing the build or environment bring t +he corresponding record to the forefront. This should be kept in mind when running reports on case runs as what you see in a run is only the surface of what data may be included.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Classic View} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The test run page uses Javascript and AJAX technology to provide a more seamless user experience while running your tests. If you have trouble with the forms or would like a simpler view of your case runs, you may use the {\b classic interface}. This provides +a view of a single test case-run at a time. From here you can update any of the fields mentioned above and also attach files to the test case. } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Deleting Case-Runs} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Sometimes you might mistakingly add a test case to a run that does not belong or you may select an invalid build and environment combination. In these cases it is easiest to remove them by deleting the case-run all together. You must have the proper permis +sions to do so and the administrator needs to allow this in the parameters. To delete a single case run, click the {\ul\ulc0 Delete}{\ulnone\ulc0 link on the standard form, or click the {\b Delete} button on the classic form. You will be prompted to confirm the action before the recor +d is removed.}} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Updating Multiple Cases at Once} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 You can update a group of case-runs at once by clicking the {\ul\ulc0 Update Multiple}{\ulnone\ulc0 link below the table of cases. From here you can change the status, attach bugs, update build or environment attributes, and even delete a whole list at once. }} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Wrapping Up} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once all tests in a run are complete, you should set the status on the run to STOPPED. This will prevent further updates to case-runs in the run.} +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Getting Around Testopia} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Navigating Testopia is done using the links in the Bugzilla footer. You can use the QuickSearch box to quickly jump to any case, run, plan or environment. To do so simply type the object's ID number, or part of the name or summary, prefixed by a type ident +ifier. Following is the list of identifiers:} +\par \trowd\trql\trhdr\trpaddft3\trpaddt51\trpaddfl3\trpaddl51\trpaddfb3\trpaddb51\trpaddfr3\trpaddr51\clbrdrt\brdrdb\brdrw15\brdrcf4\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\cellx4680\clbrdrt\brdrdb\brdrw15\brdrcf4\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\clbrdrr\brdrdb\brdrw15\brdrcf4\cellx9360 +\pard\intbl\pard\plain \intbl\ltrpar\s17\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af10\afs24\lang255\ai\ab\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\i\b\loch\f0\fs24\lang1033\i\b {\rtlch \ltrch\loch\f0\fs24\lang1033\i\b Object} +\cell\pard\plain \intbl\ltrpar\s17\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af10\afs24\lang255\ai\ab\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\i\b\loch\f0\fs24\lang1033\i\b {\rtlch \ltrch\loch\f0\fs24\lang1033\i\b Prefix} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt51\trpaddfl3\trpaddl51\trpaddfb3\trpaddb51\trpaddfr3\trpaddr51\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\cellx4680\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\clbrdrr\brdrdb\brdrw15\brdrcf4\cellx9360 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b{\b TEST CASE}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 } +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 (Optional for cases) } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls11\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 case } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls11\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 TC } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\sa283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls11\aspalpha\li707\ri0\lin707\rin0\fi-283\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 c } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt51\trpaddfl3\trpaddl51\trpaddfb3\trpaddb51\trpaddfr3\trpaddr51\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\cellx4680\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\clbrdrr\brdrdb\brdrw15\brdrcf4\cellx9360 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b{\b TEST PLAN}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 } +\cell\pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls10\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 plan } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls10\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 TP } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\sa283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls10\aspalpha\li707\ri0\lin707\rin0\fi-283\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 p } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt51\trpaddfl3\trpaddl51\trpaddfb3\trpaddb51\trpaddfr3\trpaddr51\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\cellx4680\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\clbrdrr\brdrdb\brdrw15\brdrcf4\cellx9360 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b{\b TEST RUN}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 } +\cell\pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls9\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 run } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls9\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 TR } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\sa283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls9\aspalpha\li707\ri0\lin707\rin0\fi-283\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 r } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt51\trpaddfl3\trpaddl51\trpaddfb3\trpaddb51\trpaddfr3\trpaddr51\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\cellx4680\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\clbrdrr\brdrdb\brdrw15\brdrcf4\cellx9360 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b{\b TEST RUN ENVIRONMENT}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 } +\cell\pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls8\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 env } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls8\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 TE } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\sa283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls8\aspalpha\li707\ri0\lin707\rin0\fi-283\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 e } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt51\trpaddfl3\trpaddl51\trpaddfb3\trpaddb51\trpaddfr3\trpaddr51\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\cellx4680\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\clbrdrr\brdrdb\brdrw15\brdrcf4\cellx9360 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b{\b TEST CASE-RUN}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 } +\cell\pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls7\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 caserun } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls7\aspalpha\li707\ri0\lin707\rin0\fi-283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 TCR } +\par \pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\sa283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls7\aspalpha\li707\ri0\lin707\rin0\fi-283\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 cr } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt51\trpaddfl3\trpaddl51\trpaddfb3\trpaddb51\trpaddfr3\trpaddr51\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\cellx4680\clbrdrl\brdrdb\brdrw15\brdrcf4\clbrdrb\brdrdb\brdrw15\brdrcf4\clbrdrr\brdrdb\brdrw15\brdrcf4\cellx9360 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b{\b TAGS}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 } +\cell\pard\plain \intbl{\listtext\pard\plain \li707\ri0\lin707\rin0\fi-283\sa283\f4\fs18\f4\fs18\f4\fs18 \u8226\'2d\tab}\ilvl0 \ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls6\aspalpha\li707\ri0\lin707\rin0\fi-283\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 tag } +\cell\row\pard \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \line So for example, to find test run 45 you could type {\i r 45} or {\i tr 45} or {\i run 45.}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To find environments with 'Linux' in the name you could type {\i e:linux }or {\i TE Linux}.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Searching} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Bugzilla has very powerful searching capabilities. Testopia has applied the Bugzilla search engine to searching for test cases, plans, runs, environments, and case-runs. Each of these has its own set of search parameters that can be used to narrow the scop +e of a search. To perform a search, click the {\ul\ulc0 S{\b0 earch} }link in the footer and then click the tab representing the object you wish to search from.. From here you select the parameters you wish to query on and click the {\b Submit} button. This will take you to the + corresponding list page for that object.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Sorting Search Results} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Search results are paged and sortable. To sort, click the column header of the corresponding field you wish to sort on. This will return the list in ascending order. Descending sorts are not currently supported but are planned.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Paging} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 By default, Testopia will display 25 records at a time. You can use the links at the bottom of the list to navigate from one page of search results to another or use the {\b Jump To Page} button to jump directly to a page of results. You change the number of re +cords you view at a time by selecting an option from the page size drop down. Lastly, if there are not too many records, you can opt to view all of the records at once using the {\ul\ulc0 View All}{\ulnone\ulc0 link. }} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Batch Processing} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 From the search results page of cases, runs, plans, and case-runs, you can update a batch of objects at once. Do this by selecting which objects to update by checking its box and then updating the fields at the bottom of the form. For example, with test ca +ses, you can apply changes to virtually any fields as well as add these cases to test runs or link them to a set of plans. You can also export test cases as CSV or XML. More on this later.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Saved Searches} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Like Bugzilla, Testopia offers the user the opportunity to save a search for later retrieval. You do this by typing a name in the {\i save search as} field and clicking the {\b Save Search} button. Saved searches appear below the other Testopia links in the footer. +You can remove a saved search by running it and clicking the {\ul\ulc0 Delete saved query}{\ulnone\ulc0 link at the bottom of the search results page.}} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Reporting} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 As with searching, Testopia has modified the Bugzilla reporting engine to provide basic tabular reports based on a set of search criteria. These reports can be run on test cases, runs, plans, and case-runs. To run a report, click the {\ul\ulc0 Reports} link in the fo +oter and click the tab corresponding to the object you wish to report on. Select the fields for the horizontal and vertical axes of the report and then select your search criteria. The default report is in the form of tabular data. You can then switch bet +ween bar and line graph modes or export the data as a CSV (comma separated values) file which can be opened in a spreadsheet.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 In addition to these generic reports, certain objects have other reports associated with them. These are accessed from the object pages directly. } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Plan Reports} +\par \pard\plain \sb240\sa120\keepn\f2\fs21\i\b\fs21\i\b\fs21\i\b \ltrpar\s10\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs21\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs21\lang1033\i\b\loch\f2\fs21\lang1033\i\b {\rtlch \ltrch\loch\f2\fs21\lang1033\i\b Build Coverage Report} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 This Report is designed to show builds that are not being covered in testing. It breaks down each run, displaying the status of the latest case-run for a given build. If there are builds that are not being covered, no status will display for any runs for t +hat build. This report is not very practical for plans with very large numbers of test cases.} +\par \pard\plain \sb240\sa120\keepn\f2\fs21\i\b\fs21\i\b\fs21\i\b \ltrpar\s10\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs21\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs21\lang1033\i\b\loch\f2\fs21\lang1033\i\b {\rtlch \ltrch\loch\f2\fs21\lang1033\i\b Top Bugs} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 This report displays the bugs found in test cases within the test plan ordered by the bugs attached to the most test cases. In other words, which bugs are failing the most test cases.} +\par \pard\plain \sb240\sa120\keepn\f2\fs21\i\b\fs21\i\b\fs21\i\b \ltrpar\s10\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs21\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs21\lang1033\i\b\loch\f2\fs21\lang1033\i\b {\rtlch \ltrch\loch\f2\fs21\lang1033\i\b Bugs Found In This Plan} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 This generates a bug list of all the bugs attached to any case in this plan.} +\par \pard\plain \sb240\sa120\keepn\f2\fs21\i\b\fs21\i\b\fs21\i\b \ltrpar\s10\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs21\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs21\lang1033\i\b\loch\f2\fs21\lang1033\i\b {\rtlch \ltrch\loch\f2\fs21\lang1033\i\b Printable Percentage Report} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 This report displays the pass/fail percentages of the plan by run, build, and environment.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Test Case Reports} +\par \pard\plain \sb240\sa120\keepn\f2\fs21\i\b\fs21\i\b\fs21\i\b \ltrpar\s10\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs21\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs21\lang1033\i\b\loch\f2\fs21\lang1033\i\b {\rtlch \ltrch\loch\f2\fs21\lang1033\i\b Estimated vs Actual Time} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test cases can have a time estimate associated with them. This can then be used in conjunction with the case-runs for that case to determine the actual running time. To do this, test case-runs must be placed in the RUNNING state when a test is started. Thi +s then starts the stopwatch so to speak for that case in that run. When a case is passed or failed the difference of the two times is calculated. The average of all case-runs in all runs for this case is then used to calculate this report.} +\par \pard\plain \sb240\sa120\keepn\f2\fs21\i\b\fs21\i\b\fs21\i\b \ltrpar\s10\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs21\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs21\lang1033\i\b\loch\f2\fs21\lang1033\i\b {\rtlch \ltrch\loch\f2\fs21\lang1033\i\b Historic Status Breakdown} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 This pie chart represents the percentage of all case-runs for this case divided by status.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Cloning} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Often it is desirable to copy test information for use in a new development cycle. Testopia allows you to clone test cases, test run, and whole test plans, allowing you more efficiently move from one product release to another. Cloning is performed by clic +king the {\b Clone} button on the object you wish to clone.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Cloning Test Plans} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To clone a test plan:} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 1.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls5\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Navigate to the plan you wish to clone and click the {\b Clone} button.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 2.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls5\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Enter a name for the new plan or accept the default.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 3.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls5\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Choose a product and product version to clone to.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 4.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls5\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select the clone options} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 5.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls5\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Click {\b Clone}.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 When cloning a test plan, you have the option to copy attachments, the plan document, any tags, and the plans access control list. You have the option of either copying the test cases, or creating links to the existing test cases. Copying the test cases wi +ll produce a new set of test cases with new Ids whereas linking will allow you to make modifications to your test cases and have then reflected everywhere. } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 If you choose to copy the test cases, you are also given the option to apply yourself as the author of the new cases.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Cloning Test Cases} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To clone a test case:} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 1.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls4\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Navigate to the test case you wish to clone and click the {\b Clone} button.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 2.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls4\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select a clone method.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 3.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls4\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 If copying, check the box to copy within the plans already associated} +\par \pard\plain {\listtext\pard\plain \li1080\ri0\lin1080\rin0\fi-360\sa120 1.\tab}\ilvl1 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls4\aspalpha\li1080\ri0\lin1080\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Enter the plan ids of any additional test plans you wish to copy to} +\par \pard\plain {\listtext\pard\plain \li1080\ri0\lin1080\rin0\fi-360\sa120 2.\tab}\ilvl1 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls4\aspalpha\li1080\ri0\lin1080\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select clone options} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 4.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls4\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 If linking, enter the ids of any plans you with to link this case to.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 As with cloning plans, you have the option of making yourself the author of the copy. You can choose to copy the attachments, tags, components, and document.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Cloning a Run} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To clone a test run:} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 1.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls3\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Navigate to the test run you wish to clone and click the {\b Clone} button.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 2.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls3\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Enter a summary for the copy.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 3.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls3\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Choose a plan within the product to clone to.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 4.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls3\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Choose a product version and build.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 5.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls3\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Select clone options.} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120 6.\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls3\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Click the {\b Clone} button.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 In addition to the options to copy the tags and making yourself the manager of the cloned run, you have the option of copying over the test cases. You can limit the clone to only include test cases of a certain status. For instance you may want to only inc +lude cases that failed in the cloned run.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Deleting} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 It is possible to delete test cases, plans, runs and case-runs. To delete, you must have the allow-test-deletion parameter turned on and have the proper rights. Bugzilla admins (members of the admin group) can delete regardless of the parameter settings an +d have rights to delete anything in the Testopia system.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To delete an object, click the Delete button on that objects page. You will be taken to a confirmation screen detailing what other objects will be deleted, if any, as a result of deleting this object. To confirm, click the {\b Delete This Test} button. Deleting + in Testopia is irreversible. If you wish to simply hide an object instead you can do so using the methods outlined below:} +\par \pard\plain \sb240\sa120\keepn\f2\fs21\b\fs21\b\fs21\b \ltrpar\s10\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs21\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs21\lang1033\b\loch\f2\fs21\lang1033\b {\rtlch \ltrch\loch\f2\fs21\lang1033\i0\b Test Cases} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To hide a test case from search results, place it in the DISABLED status. } +\par \pard\plain \sb240\sa120\keepn\f2\fs21\b\fs21\b\fs21\b \ltrpar\s10\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs21\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs21\lang1033\b\loch\f2\fs21\lang1033\b {\rtlch \ltrch\loch\f2\fs21\lang1033\i0\b Test Plans} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To hide test plans from search results, you can archive them by clicking the {\b Archive} button on the plan page. } +\par \pard\plain \sb240\sa120\keepn\f2\fs21\b\fs21\b\fs21\b \ltrpar\s10\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs21\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs21\lang1033\b\loch\f2\fs21\lang1033\b {\rtlch \ltrch\loch\f2\fs21\lang1033\i0\b Test Runs} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To hide test runs, place them in the STOPPED state. } +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Importing and Exporting} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test cases can be exported as either XML or in Comma Separated Value formats. To export a test cases, click the appropriate format button under the {\b Export} section found at the bottom of the test plan page, the test case page, or the case search results pag +e.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Exporting in CSV allows you to open you test cases in a spreadsheet where you can manipulate the values and generate custom reports.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Exporting as XML allows you to import your test cases into other Testopia installations or into custom database applications.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Importing Test Cases} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 You can import test cases from other Testopia installations or from other test case management systems using the tr_importxml.pl script. In order to be eligible for import, your exported test cases must first comply with the Testopia document type definiti +on found in the testopia.dtd file. This can be done by using XML stylesheets to transform the XML to match the DTD. This is outside the scope of this manual, but information on this subject is readily available via the web.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To import test cases, run the tr_importxml.pl script with the path to your test case XML file. More details can be found on the project wiki at} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab {\field{\*\fldinst HYPERLINK "http://wiki.mozilla.org/Testopia:Documentation:XMLImport" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://wiki.mozilla.org/Testopia:Documentation:XMLImport}} } +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Testopia Security} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Like Bugzilla, Testopia provides several methods for restricting access to test data. Because test data is often more forward looking than bug reports, Testopia requires that users log in to see any test objects. There are several layers of security that a + user must pass through to view those objects however. These are determined in part by Bugzilla group membership, but mostly by the test plan access control list.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b The Testers Group} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 When you first install Testopia, it will create a Bugzilla group called 'Testers'. Members of this group have access to view and update all test plans and their associated objects such as cases and runs. Membership in this group is required in order to cre +ate new test plans, clone test plans, and administer environments. If the {\b {\*\bkmkstart testopia-allow-group-member-deletes1}{\*\bkmkend testopia-allow-group-member-deletes1}testopia-allow-group-member-deletes}{\b0 parameter is on, members of this group will also have rights to delete any object in Testopia. Membership in this group is checked first and supe +rsedes the access control lists for individual plans.}} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Test Plan Access Control Lists} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 In addition to the Testers group, each test plan maintains it's own access control list which can be used to allow or deny access to test plans based on email domain or explicit inclusion. Each test plan has its own access list. For a user that is not in t +he Testers group to access a test plan or any associated cases, runs, or case runs, he or she must be included on the list either by matching a regular expression, or explicit inclusion. To edit the access control list for a plan, navigate to the test plan + and click the {\ul\ulc0 Edit Access Controls}{\ulnone\ulc0 link in the over view section.}} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b User Regular Expression} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Users with login names (email addresses) matching a supplied regular expression can be given rights to a particular test plan. The regular expression should be crafted with care to prevent unintentional access to the test plan by outsiders. For example, to + grant access to your test plan by all users at acme.com you would supply the following regular expression:} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab {\f6 ^.*@acme\\.com$}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To provide access to all users at acme.com and foo.org you would use:} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab {\f6 ^.*@(acme\\.com|foo\\.org)$}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To provide public access (all users) you would use:} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab {\f6 .*}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 An empty regular expression does not match anything meaning leaving this field blank will mean the test plan will rely solely on explicit membership.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Once you have supplied the regular expression, you must select the access level. } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Explicit Inclusion} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 If you do not wish to grant access to a whole group at once, you can add individual users by entering their Bugzilla login in the field provided and clicking the {\b Add User} button. This allows the most fine grained control as to who can do what within your t +est plan. However, if you add a user that matches the regular expression they will have the greater of the two rights.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\i\b\fs28\i\b\fs28\i\b \ltrpar\s5\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ai\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\i\b\loch\f2\fs28\lang1033\i\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i\b Access Rights} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Users on the test plan access control lists can be granted rights to read, write, delete, and admin test plans and their associated objects.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Read } +\par \pard\plain \ltrpar\s31\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri0\lin567\rin0\fi0\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Allows viewing rights to the plan and all test cases, test runs, and test case-runs associated with it. Test cases linked to more than one plan will be visible to users in both plans.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Write } +\par \pard\plain \ltrpar\s31\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri0\lin567\rin0\fi0\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Implies Read. Allows rights to modify the plan and associated cases, runs, and case-runs. } +\par \pard\plain \ltrpar\s31\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri0\lin567\rin0\fi0\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test cases linked to more than one plan will not be writable unless the user has write rights in all plans.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Delete } +\par \pard\plain \ltrpar\s31\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri0\lin567\rin0\fi0\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Implies Read and Write. Allows rights to delete the plan and associated cases, runs, and case-runs. Test cases linked to more than one plan will not be deletable unless the user has delete rights in all plans.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Admin } +\par \pard\plain \ltrpar\s31\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li567\ri0\lin567\rin0\fi0\sa283\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Implies Read, Write, and Delete. Allows rights to modify the plan's access controls. } +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Tags} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Testopia utilizes a tagging mechanism to help organize test objects. Unlike the traditional method of placing things into virtual folders, tags allow a many-to-many relationship by allowing multiple objects to have the same tag while allowing each object t +o have multiple tags.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Tags are a novel approach to categorizing objects. They have become very popular with numerous web popular web tools and have met with much success. Tags are similar to keywords in Bugzilla but do not require an administrator to create. The act of tagging +an object creates the tag which can then be used anywhere.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The idea behind tags is that each user can categorize each item to his or her own liking without destroying other users' categorizations. Test cases, plans, and runs can all have tags associated with them. Though tags are not directly associated with a pro +duct, Testopia uses a smart typing approach to recommend tags based on relationships to other objects within the same product.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Tags have a knowledge of who added them to a particular object as well, allowing users to manage the tags that they have created.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Adding Tags to an Object} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To add a tag to a test case, run, or plan, begin typing in the {\b Tag} field. If what you type matches any other tags that others have applied within the product associated with this object, it will appear up in the drop down list. You can then either select a + tag that matches or type your own new tag. Clicking the Add button will then attach your tag to the object.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Viewing Tags} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 To see a list of your tags click the {\ul\ulc0 Tags}{\ulnone\ulc0 link in the header above the tags section in any object. From this screen you have the option to look up tags based on product or entered by another user.}} +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Using Testopia With Automated Test Scripts} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Testopia provides a web service XML RPC that utilizes the SOAP protocol to interact with Testopia objects via an automated script. Documentation for this feature is available on the project wiki at {\field{\*\fldinst HYPERLINK "http://wiki.mozilla.org/Testopia:Documentation:XMLRPC" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://wiki.mozilla.org/Testopia:Documentation:XMLRPC}} } +\par \pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Field Descriptions} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\b\fs28\b\fs28\b \ltrpar\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\b\loch\f2\fs28\lang1033\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i0\b Test Plans} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Name} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Short descriptor for a test plan. Does not need to be unique.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Product} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Bugzilla product that this plan is associated with.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Product Version} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The Bugzilla product version. Used as the default for new runs.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Type} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The testing type for this test plan. Possible values include system, integration, unit, functional and acceptance. This list is modifiable by the Bugzilla admins from the Testopai Admin link.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Archive} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab If this bit is set to true, the plan will be archived and not display in searches by default.To archive a plan click the {\b Archive} button. To unarchive click {\b Unarchive}.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Plan Document} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This is document that spells out the type of testing and testing methods used for this plan.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Tags} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab See tags description above.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\b\fs28\b\fs28\b \ltrpar\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\b\loch\f2\fs28\lang1033\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i0\b Test Cases} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Summary} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab A short description of the test case.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Default Tester} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The person who will be assigned to this test case when a new run is created in which this case is included.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Alias} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab A unique string that can be used to identify this test case. This can be used in place of the test case ID but must be globally unique to the database.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Requirement} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The requirement number or URL to a document containing the requirement this test case is designed to test.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Status} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Test case status determines whether this test case can be included in new test runs.} +\par \pard\plain {\listtext\pard\plain \li709\ri0\lin709\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li709\ri0\lin709\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b{\b PROPOSED}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \uc3 \u8211\'e2\'80\'93\uc1 This test case is a work in progress and has not been reviewed for accuracy. It is therefore not ready to be included in test runs.} +\par \pard\plain {\listtext\pard\plain \li709\ri0\lin709\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li709\ri0\lin709\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b{\b CONFIRMED}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \uc3 \u8211\'e2\'80\'93\uc1 Test case has passed review and is ready to be included in future test runs. Only test cases with this status can be included in new test runs.} +\par \pard\plain {\listtext\pard\plain \li709\ri0\lin709\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls2\aspalpha\li709\ri0\lin709\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b{\b DISABLED}}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \uc3 \u8211\'e2\'80\'93\uc1 This test case is no longer applicable to current testing.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Priority} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This denotes the level of testing. Higher priority test cases should be run first and more often then lower priorities.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Category} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The product category that this test case belongs to. Each product has a default category. Additional categories can be added which can be used to further classify your test cases. Because this is a product attribute, this list will be the same for all pla +ns in a given product.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Estimated Time} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The estimated time in HH:MM:SS format that this test case should take to complete.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Add To Runs} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Entering a run ID here will include this test case in a test run if it is not already included. You can also enter a comma separated list of run numbers to add to multiple runs at once.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Automatic} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Test cases can be either Automatic or Manual. Automatic test cases are run by a script while manual test cases are performed by a tester.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Script} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab If this is an automatic test case, you can enter the name of the script that runs this test case. TESTOPIA DOES NOT RUN YOUR SCRIPT FOR YOU. You must run your script and capture the results to send to Testopia. You can use the XMLRPC interface to have you +r script update the test case-run results automatically.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Arguments} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab If there are specific arguments sent to the script that apply to this test case, they can be stored here. TESTOPIA DOES NOT RUN YOUR SCRIPTS FOR YOU. This field is only used to store the information. The XMLRPC can be used by your script to capture this f +rom the test case.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Attach Bugs} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab You can attach bugs to your test cases. This field accepts a comma separated list of bug numbers.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Depends on} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab If this test case requires other test cases be run before this one, their case numbers should appear here. Enter a list of comma separated case numbers to add dependencies.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Blocks} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab If this test case prevents others from being run their ID numbers will appear here. This field accepts a comma separated list of case numbers.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Set Up} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This field details the steps that are necessary to prepare to run a test} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Break Down} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This field details the steps required to reset the test case to a known state in preparation for the next run.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Action} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This field lists the steps of testing. } +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Expected Results} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This details the expected outcomes of a test. } +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Component} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab You can associate Bugzilla components to your test cases. Because testing might be across multiple components and products, you can add multiple components from any product. Selecting the product from the drop down list displays the components available. +Click Add to associate the selected component with the test case.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Tags} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab See above for a description.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\b\fs28\b\fs28\b \ltrpar\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\b\loch\f2\fs28\lang1033\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i0\b Test Runs} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Product Version} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This is the Bugzilla product version that this test run is testing.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Plan Version} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This is the version of the plan document that this test run is using.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Manager} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The user in charge of this test run} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Build} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The default product build. This is applied to test cases added to the run.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Status} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Determines if this test run is active. } +\par \pard\plain {\listtext\pard\plain \li709\ri0\lin709\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li709\ri0\lin709\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 RUNNING \uc3 \u8211\'e2\'80\'93\uc1 This test run is still active. Test cases in this run can be updated.} +\par \pard\plain {\listtext\pard\plain \li709\ri0\lin709\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls1\aspalpha\li709\ri0\lin709\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 STOPPED \uc3 \u8211\'e2\'80\'93\uc1 Test cases in a stopped run cannot be modified.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Environment} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This is the environment in use for this test run. Test cases added to this run will receive this environment. Environments must be created using the Environment editor before a test run can be created.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Summary} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab A short description of this test run} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Notes} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This field is a place to make notes and observations about this run.} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\b\fs28\b\fs28\b \ltrpar\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\b\loch\f2\fs28\lang1033\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i0\b Test Case-Runs} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Status} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The status of a case-run determined by whether it passed or failed or is in some other state.} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li424\ri0\lin424\rin0\fi0\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\*\shppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +000099333300cc9999000000ff00a6585800ecd8d800b67474009d4a4a00dabbbb00ffffff00973e3e00bd858500d2acac00ad656500e6cece00a04f4f00f2ee +ee00c08b8b00953a3a00efe7e700ad6a6a00b97a7a00a1424200d6b4b400e8d8d800dec4c400aa535300d1a5a500c7929200a54a4a00ad5a5a00f5eded00eedf +df0099333300b46b6b009d3a3a009f424200bd7c7c00c2868600faf4f400dbb7b700b5636300c28b8b00eadddd00a5525200e3c9c900ddbcbc00d4adad00f7e6 +e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000808080808081216240c1d03030c24161f08080808080808080808080f2e0c2b2b03030303030303212e120808080808080808170a032b031d1d1d1d1d1d +1d1d2b2b0a2a0808080808082a140e0e1d1d1d1d2501211d1d1d1d2b2b240f080808080f240606191d1d190d080808141d1d1d1d1c06250f0808080b06061c19 +1919190808080801191919191906062e0808120c09151c2b2b2b2b2926080d192b2b2b2b1c1c09130f08270622151c1c1c1c1c1c2323231c1c1c1c1c1c151106 +1808240922221515151515250d0d0d15151515151515220910081d1122222222222222010808082b22222222222222110c080e00222222222222220508080816 +22222222222222002b08060000000000000000002c0808082d230000000000002b082b0000222215151515221504080808041915152222002b081d111115191d +1d1d1919191c2e080808121d191522220c082409091d21210c0c0c2121210c1b0808081a211d22090a0816060605241808081f050a0a0a0c0808082e24052306 +0708120c0e241b1a0808082c252425180808081a1b240e131208080b03141a01040808080808080808081f1b1a1403160808080f0a1301271a18080808080808 +08181a270113100f080808080f0a0a2e2c2d160d2608081e2e2d182e0a29120808080808081f1b0a1a180d2c182d182d2c181a0a011208080808080808080f16 +24101a27182c18161a100a270f08080808080808080808080f072505050505051b2d0f08080808080808030000000000}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +000099333300cc9999000000ff00a6585800ecd8d800b67474009d4a4a00dabbbb00ffffff00973e3e00bd858500d2acac00ad656500e6cece00a04f4f00f2ee +ee00c08b8b00953a3a00efe7e700ad6a6a00b97a7a00a1424200d6b4b400e8d8d800dec4c400aa535300d1a5a500c7929200a54a4a00ad5a5a00f5eded00eedf +df0099333300b46b6b009d3a3a009f424200bd7c7c00c2868600faf4f400dbb7b700b5636300c28b8b00eadddd00a5525200e3c9c900ddbcbc00d4adad00f7e6 +e6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000808080808081216240c1d03030c24161f08080808080808080808080f2e0c2b2b03030303030303212e120808080808080808170a032b031d1d1d1d1d1d +1d1d2b2b0a2a0808080808082a140e0e1d1d1d1d2501211d1d1d1d2b2b240f080808080f240606191d1d190d080808141d1d1d1d1c06250f0808080b06061c19 +1919190808080801191919191906062e0808120c09151c2b2b2b2b2926080d192b2b2b2b1c1c09130f08270622151c1c1c1c1c1c2323231c1c1c1c1c1c151106 +1808240922221515151515250d0d0d15151515151515220910081d1122222222222222010808082b22222222222222110c080e00222222222222220508080816 +22222222222222002b08060000000000000000002c0808082d230000000000002b082b0000222215151515221504080808041915152222002b081d111115191d +1d1d1919191c2e080808121d191522220c082409091d21210c0c0c2121210c1b0808081a211d22090a0816060605241808081f050a0a0a0c0808082e24052306 +0708120c0e241b1a0808082c252425180808081a1b240e131208080b03141a01040808080808080808081f1b1a1403160808080f0a1301271a18080808080808 +08181a270113100f080808080f0a0a2e2c2d160d2608081e2e2d182e0a29120808080808081f1b0a1a180d2c182d182d2c181a0a011208080808080808080f16 +24101a27182c18161a100a270f08080808080808080808080f072505050505051b2d0f08080808080808030000000000}} +{\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 - {\b IDLE}: This is the default status. Case has not yet been examined.} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\*\shppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +00000c700c007bb27b000000ff00dee8de0044914400aac5aa002a822a0066996600ffffff00c5d8c5009cc59c00438443002073200074a37400549654003b86 +3b008eb88e00eff1ef0017731700b5d1b500d3e2d3007ba87b00669966002a762a00a2c1a200e7eee700318431004a894a000d610d005b935b004a934a0094b7 +9400bad6ba0084b58400cee1ce00127212003a8b3a006da96d0084ad840020782000a6cba600f6f6f60064a36400b6d3b60073ad7300dfecdf00d7e5d700589b +580096c09600418d41001a781a006ba66b00aecdae008cbb8c004f8d4f00318c310053995300297b2900106c1000a4c7a400c7ddc70078aa7800000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000808080808081928331e0424241e33282d0808080808080808080808193b1e2424310404040424242f3b19080808080808080814252424311e1e3838381e +1e3124242c2e0808080808082e2a1a24041e1e3838383838381e04241a2a19080808081133061a31041e1e1e1e1e1e1e1e1e1e311a062c190808080a06062431 +31310f0f0f313131313131312406063b0808190427061a24242410090d391a0f242424241a06273819083439123939390f14080808141b391a1a1a1a1a271206 +20082a321227270b110808080808110b39393939392712323d08312323231d110808080808080811360c0c0c0c1223231e0806003a1708080808080308080808 +08072312121223001a0806003a26080808081f1c180808080808073a232323001a081a00231d080808330c0c0c070808080808050c0c23001a0831121239331f +36313131310f0d0808080808050c323204082a2727310e073333332a2a2a2f3311080808082627272508051a1a2f2c21212121212121213d0d110808083c391a +34081938242a210a0a0a0a0a0a0a0a0a10262e0808151a3819080818042a1034132b2b2b2b2b2b2b2b05101f262f043b080808193d2f21340922222222222222 +22220928212f01110808080811012c3020222e2d1919192d2e2220302c21190808080808082d350130133c14030303143c133001302d08080808080808081134 +3d01350a2828280a35010113110808080808080808080808112b21252525252535201108080808080808030000000000}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +00000c700c007bb27b000000ff00dee8de0044914400aac5aa002a822a0066996600ffffff00c5d8c5009cc59c00438443002073200074a37400549654003b86 +3b008eb88e00eff1ef0017731700b5d1b500d3e2d3007ba87b00669966002a762a00a2c1a200e7eee700318431004a894a000d610d005b935b004a934a0094b7 +9400bad6ba0084b58400cee1ce00127212003a8b3a006da96d0084ad840020782000a6cba600f6f6f60064a36400b6d3b60073ad7300dfecdf00d7e5d700589b +580096c09600418d41001a781a006ba66b00aecdae008cbb8c004f8d4f00318c310053995300297b2900106c1000a4c7a400c7ddc70078aa7800000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000808080808081928331e0424241e33282d0808080808080808080808193b1e2424310404040424242f3b19080808080808080814252424311e1e3838381e +1e3124242c2e0808080808082e2a1a24041e1e3838383838381e04241a2a19080808081133061a31041e1e1e1e1e1e1e1e1e1e311a062c190808080a06062431 +31310f0f0f313131313131312406063b0808190427061a24242410090d391a0f242424241a06273819083439123939390f14080808141b391a1a1a1a1a271206 +20082a321227270b110808080808110b39393939392712323d08312323231d110808080808080811360c0c0c0c1223231e0806003a1708080808080308080808 +08072312121223001a0806003a26080808081f1c180808080808073a232323001a081a00231d080808330c0c0c070808080808050c0c23001a0831121239331f +36313131310f0d0808080808050c323204082a2727310e073333332a2a2a2f3311080808082627272508051a1a2f2c21212121212121213d0d110808083c391a +34081938242a210a0a0a0a0a0a0a0a0a10262e0808151a3819080818042a1034132b2b2b2b2b2b2b2b05101f262f043b080808193d2f21340922222222222222 +22220928212f01110808080811012c3020222e2d1919192d2e2220302c21190808080808082d350130133c14030303143c133001302d08080808080808081134 +3d01350a2828280a35010113110808080808080808080808112b21252525252535201108080808080808030000000000}} +{\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 - {\b PASSED}: This test case met the requirement or ran as expected.} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\*\shppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +000000ff0000b4b4f8000404f0006b6bf0004141f700ffffff002929f8009393f100dfdff7001919f7005353f2007a7af800ccccff00a2a2f2000f0ff7006464 +f000f1f1f7003a3afa008181f2007272f0000808f7004949f8009f9ff100c5c5fe001f1fef005151fd003333f700adadef00e6e6f7008484f900d8d8f7007171 +f7006666ff009999ff000000ff005b5bfe006b6bf8009999ff004b4bfe003333ff002222fb004141fe001111fd000808ff00adadfe00a6a6fd005959f000f2f2 +fd008a8af0001a1afe007373ff006262f8009b9bf7007e7efc00ddddff00b6b6fe003a3aff00d6d6ff008787fc009696f7005353f9002121f800a6a6f7006666 +ff00ababf70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000505050505051c3e331504111115243e0805050505050505050505051c3e151111292929292911113c3e1c05050505050505051e24111129261919191919 +262911111f1e0505050505051e331a1a041519193c3c3c3c3c1504111a331c05050505103328061a0b0f042626262626040f0b1a1a28241c0505053b3d3d061e +0505131a2929291a1305051e0628283405051c112a3d1305050505131a1a1a1305050505133d2a151c053e3d0e310a050505050503180305050505050a310e3d +0105330e2b2a090305050505050d050505050503092a2b0e1f051a14222b2b0e0f0505050505050505050f0e0e2b2b2b04053d222222222b140f050505050505 +050f14142b22222206053d2222222b2b2b0216050505050516022b2b2b22222206050622222b2a31090305050505050505030931312b2b22060511141431271a +13050505050505050505131a1a312b2b1105332a312715120505050505400505050505121527312a24053e2828260a0505050505302e3005050505050a262828 +40051c151a23242f05050507123b12070505052f24231a151c050534042335302f05163b2c2c2c3b16052f303523040d0505051c1f3c3534343401170c0c0c17 +01163434353c0b1005050505100b243b370c393636363636390c373b24351c050505050505083a323b2c170c3636360c172c3b323b0805050505050505051040 +1f1f3a212d2d2d213a32320110050505050505050505050510010b20202020201d011005050505050505030000000000}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +000000ff0000b4b4f8000404f0006b6bf0004141f700ffffff002929f8009393f100dfdff7001919f7005353f2007a7af800ccccff00a2a2f2000f0ff7006464 +f000f1f1f7003a3afa008181f2007272f0000808f7004949f8009f9ff100c5c5fe001f1fef005151fd003333f700adadef00e6e6f7008484f900d8d8f7007171 +f7006666ff009999ff000000ff005b5bfe006b6bf8009999ff004b4bfe003333ff002222fb004141fe001111fd000808ff00adadfe00a6a6fd005959f000f2f2 +fd008a8af0001a1afe007373ff006262f8009b9bf7007e7efc00ddddff00b6b6fe003a3aff00d6d6ff008787fc009696f7005353f9002121f800a6a6f7006666 +ff00ababf70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000505050505051c3e331504111115243e0805050505050505050505051c3e151111292929292911113c3e1c05050505050505051e24111129261919191919 +262911111f1e0505050505051e331a1a041519193c3c3c3c3c1504111a331c05050505103328061a0b0f042626262626040f0b1a1a28241c0505053b3d3d061e +0505131a2929291a1305051e0628283405051c112a3d1305050505131a1a1a1305050505133d2a151c053e3d0e310a050505050503180305050505050a310e3d +0105330e2b2a090305050505050d050505050503092a2b0e1f051a14222b2b0e0f0505050505050505050f0e0e2b2b2b04053d222222222b140f050505050505 +050f14142b22222206053d2222222b2b2b0216050505050516022b2b2b22222206050622222b2a31090305050505050505030931312b2b22060511141431271a +13050505050505050505131a1a312b2b1105332a312715120505050505400505050505121527312a24053e2828260a0505050505302e3005050505050a262828 +40051c151a23242f05050507123b12070505052f24231a151c050534042335302f05163b2c2c2c3b16052f303523040d0505051c1f3c3534343401170c0c0c17 +01163434353c0b1005050505100b243b370c393636363636390c373b24351c050505050505083a323b2c170c3636360c172c3b323b0805050505050505051040 +1f1f3a212d2d2d213a32320110050505050505050505050510010b20202020201d011005050505050505030000000000}} +{\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 - {\b FAILED}: This test case did not run as expected or produced an unhandled exception.} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\*\shppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +000025b96e0074d2a2000000ff00d8f7ef0045b77900b3e2ca0061bf8b009ad9b90042ab6e00ddfefd00d5e9dd0050b97f008bd7b0002fb56e00ffffff006ec1 +9200e7f1ec004aa76e00bfead40043c382003cae6e00a8dfc30054c68c00dbebe200f6f6f60079c99d00f0ffff004aad6b003ac07b007fd6a90066cc9900c3ec +d700defaf4002cbb7200a7d8bd0031b7710066cc9900d5f1e300e8f7ef0043ae71003ab56b00a6e3c40093ddb70049ac72003fbb79005cc99100f7ffff005ab7 +8200e5eee8007cca9f00dff6ed004ac48500addac100c7eadb00bdefd60084d7ad0074c79a0071d1a00050ac7400ceefdf00eff4f1003bb57400e0f5ea0040b3 +7400bbe5cf00e8ffff00e8fdfa00defff7007ad4a700aae3c7004ac58c00d5f5e9009cdfbc0030bc740057c68d0051c08500abdec30042bd84007bd0a4002bb6 +6e0066cc9900b5e7ce0094debd003db07000edf2ef00d6efde004ab77b005abc8500c5eedd00a5ddbf00bdefde0073cea50047b376005ecb9300e0f0e800adde +bd0081c79f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000e0e0e0e0e0e303438570b56565738345e0e0e0e0e0e0e0e0e0e0e0e1022575c270808080808085c0622300e0e0e0e0e0e0e0e0a19040808111111111111 +1111270431170e0e0e0e0e0e17383f080811111111111111111111083f38100e0e0e0e54193d1408083a3a111111111111111108143d4e100e0e0e592c281408 +3a351a602b0808080808080808082c4c0e0e104a232314142f200920400f2708080808081414235d540e051c4f4f14145703411a4203450653141414140d0d13 +120e01494f4f4f4f57471a0e0e1a204707042828280d0d49370e16214f4f4f4f4b471a0e0e0e0e4120584e3d4f4f4f212d0e13000000000033471a0e0e0e0e0e +2e4203511e490000330e13000000000033471a0e0e0e0e0e0e0e1a09091e0000330e3300000049494a471a0e0e0e0e0e0e0e1a09035d0000330e1621211c3333 +39031a0e0e0e0e0e1a4203455d1c21214a0e4e4949331e1e1d031a0e0e0e2e42201f371e1e3349491d0e051c1c1e1d1d2a201a0e2e2e424729371d1d1d1e1c1c +050e102d13012a2a2920411a42201f072a2a2a2a2a01135d100e0e1533394845514242422551454545454545483933450e0e0e54445d2a401f32323b12121212 +121212122a5d373c0e0e0e0e3c1d44453525252525252525252535454437540e0e0e0e0e0e5e0c1d291f253e2626263e251f291d2a300e0e0e0e0e0e0e0e5405 +443748511f1f1f51483744053c0e0e0e0e0e0e0e0e0e0e0e3c401d39393939390c403c0e0e0e0e0e0e0e030000000000}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +000025b96e0074d2a2000000ff00d8f7ef0045b77900b3e2ca0061bf8b009ad9b90042ab6e00ddfefd00d5e9dd0050b97f008bd7b0002fb56e00ffffff006ec1 +9200e7f1ec004aa76e00bfead40043c382003cae6e00a8dfc30054c68c00dbebe200f6f6f60079c99d00f0ffff004aad6b003ac07b007fd6a90066cc9900c3ec +d700defaf4002cbb7200a7d8bd0031b7710066cc9900d5f1e300e8f7ef0043ae71003ab56b00a6e3c40093ddb70049ac72003fbb79005cc99100f7ffff005ab7 +8200e5eee8007cca9f00dff6ed004ac48500addac100c7eadb00bdefd60084d7ad0074c79a0071d1a00050ac7400ceefdf00eff4f1003bb57400e0f5ea0040b3 +7400bbe5cf00e8ffff00e8fdfa00defff7007ad4a700aae3c7004ac58c00d5f5e9009cdfbc0030bc740057c68d0051c08500abdec30042bd84007bd0a4002bb6 +6e0066cc9900b5e7ce0094debd003db07000edf2ef00d6efde004ab77b005abc8500c5eedd00a5ddbf00bdefde0073cea50047b376005ecb9300e0f0e800adde +bd0081c79f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000e0e0e0e0e0e303438570b56565738345e0e0e0e0e0e0e0e0e0e0e0e1022575c270808080808085c0622300e0e0e0e0e0e0e0e0a19040808111111111111 +1111270431170e0e0e0e0e0e17383f080811111111111111111111083f38100e0e0e0e54193d1408083a3a111111111111111108143d4e100e0e0e592c281408 +3a351a602b0808080808080808082c4c0e0e104a232314142f200920400f2708080808081414235d540e051c4f4f14145703411a4203450653141414140d0d13 +120e01494f4f4f4f57471a0e0e1a204707042828280d0d49370e16214f4f4f4f4b471a0e0e0e0e4120584e3d4f4f4f212d0e13000000000033471a0e0e0e0e0e +2e4203511e490000330e13000000000033471a0e0e0e0e0e0e0e1a09091e0000330e3300000049494a471a0e0e0e0e0e0e0e1a09035d0000330e1621211c3333 +39031a0e0e0e0e0e1a4203455d1c21214a0e4e4949331e1e1d031a0e0e0e2e42201f371e1e3349491d0e051c1c1e1d1d2a201a0e2e2e424729371d1d1d1e1c1c +050e102d13012a2a2920411a42201f072a2a2a2a2a01135d100e0e1533394845514242422551454545454545483933450e0e0e54445d2a401f32323b12121212 +121212122a5d373c0e0e0e0e3c1d44453525252525252525252535454437540e0e0e0e0e0e5e0c1d291f253e2626263e251f291d2a300e0e0e0e0e0e0e0e5405 +443748511f1f1f51483744053c0e0e0e0e0e0e0e0e0e0e0e3c401d39393939390c403c0e0e0e0e0e0e0e030000000000}} +{\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 - {\b RUNNING}: This test case is currently being examined.} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\*\shppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +00000d86e00096c9f1001190f0000000ff00e5ffff0032a1f400cde3f4005bb3f700a7d3f5002194ea00e1edf60059aeee00ffffff00b2d8f6006dbcf700108b +e7002697ec009ccdf1001094f700eef2f600128eee001f97f4006db8f100399fed0047a9f40041a3ed00ddeffd00b3dcfb0099ccff0081c3f500c4e4fc00aed6 +f50074bef700efffff001995f3001c91e90063b3ef0053b0f7008dcbf9003ca5f500bce0fc00319ff3002399f400e7eff600299cf4007bc0f5009bcdf400e8f4 +fe00cee8fd0062b6f600a5d6ff00b5def7008cc7f5002398f000f1f4f600add6ff00d4e6f4001992ed006bb5f7003fa6f5002a9cf2004aaaf400a2d0f40097ca +f100bcddf50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000c0c0c0c0c0c0a110b17171010170b11380c0c0c0c0c0c0c0c0c0c0c0a0117230f0f0000000f0f23193f0a0c0c0c0c0c0c0c0c0624090f00000000000000 +00000f0924380c0c0c0c0c0c380b390f00000000000000000000000f390b2b0c0c0c0c2b24390f0f0000000000000000000000000f39162b0c0c0c2e35140f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f353e0c0c2b1802020f0f042121040f0f0f042121040f0f0f02252b0c1f3c0202020f210c0c210f0f0f210c0c210f0f14143c +400c161502141414210c0c21141414210c0c2114141414152d0c182202020202210c0c21141414210c0c2114020202223d0c050202020202210c0c2102020221 +0c0c210202020202270c290202020202210c0c21020202210c0c210202020202050c27020222222a210c0c21151515210c0c212a2a222222270c1822222a053b +210c0c21050505210c0c213b052a22223d0c161515272507210c0c21252525210c0c210707271515200c1f3c3c250e0e210c0c21202020210c0c212020252c2c +0d0c2b25053a3434042121042626260421210426263a05252b0c0c3e2731263e3e3e3e3e3e3e3e3e3e3e3e3e26313b080c0c0c2b0e25261b2828282828282828 +2828281b26252d360c0c0c0c13200e321e3030303030303030301e320e2d2b0c0c0c0c0c0c0a1d201c28301a2f2f2f1a30281c20340a0c0c0c0c0c0c0c0c1308 +0e202637281e1e372620201f360c0c0c0c0c0c0c0c0c0c0c130d2031313131311d0d130c0c0c0c0c0c0c030000000000}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +00000d86e00096c9f1001190f0000000ff00e5ffff0032a1f400cde3f4005bb3f700a7d3f5002194ea00e1edf60059aeee00ffffff00b2d8f6006dbcf700108b +e7002697ec009ccdf1001094f700eef2f600128eee001f97f4006db8f100399fed0047a9f40041a3ed00ddeffd00b3dcfb0099ccff0081c3f500c4e4fc00aed6 +f50074bef700efffff001995f3001c91e90063b3ef0053b0f7008dcbf9003ca5f500bce0fc00319ff3002399f400e7eff600299cf4007bc0f5009bcdf400e8f4 +fe00cee8fd0062b6f600a5d6ff00b5def7008cc7f5002398f000f1f4f600add6ff00d4e6f4001992ed006bb5f7003fa6f5002a9cf2004aaaf400a2d0f40097ca +f100bcddf50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000c0c0c0c0c0c0a110b17171010170b11380c0c0c0c0c0c0c0c0c0c0c0a0117230f0f0000000f0f23193f0a0c0c0c0c0c0c0c0c0624090f00000000000000 +00000f0924380c0c0c0c0c0c380b390f00000000000000000000000f390b2b0c0c0c0c2b24390f0f0000000000000000000000000f39162b0c0c0c2e35140f0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f353e0c0c2b1802020f0f042121040f0f0f042121040f0f0f02252b0c1f3c0202020f210c0c210f0f0f210c0c210f0f14143c +400c161502141414210c0c21141414210c0c2114141414152d0c182202020202210c0c21141414210c0c2114020202223d0c050202020202210c0c2102020221 +0c0c210202020202270c290202020202210c0c21020202210c0c210202020202050c27020222222a210c0c21151515210c0c212a2a222222270c1822222a053b +210c0c21050505210c0c213b052a22223d0c161515272507210c0c21252525210c0c210707271515200c1f3c3c250e0e210c0c21202020210c0c212020252c2c +0d0c2b25053a3434042121042626260421210426263a05252b0c0c3e2731263e3e3e3e3e3e3e3e3e3e3e3e3e26313b080c0c0c2b0e25261b2828282828282828 +2828281b26252d360c0c0c0c13200e321e3030303030303030301e320e2d2b0c0c0c0c0c0c0a1d201c28301a2f2f2f1a30281c20340a0c0c0c0c0c0c0c0c1308 +0e202637281e1e372620201f360c0c0c0c0c0c0c0c0c0c0c130d2031313131311d0d130c0c0c0c0c0c0c030000000000}} +{\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 - {\b PAUSED}: This status is used to denote a problem with the test case itself that prevents the test from being completed.} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\*\shppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +000000ff0000c4c4fe000000ff007171f7004949f8003333ff00ffffff00a6a6f7002121f8005b5bfe008989ff00e6e6f7000f0ff9004040f700b4b4f800d8d8 +f7007a7af8006b6bf8005353f9003a3afa000808f9009b9bf7001919fe002929f800ababf700dfdff7006262f8008484f900f1f1f700bfbfff002020fd004a4a +fe009696f7001111fe006666ff00ccccff004141fe003c3cff00b6b6fe00a6a6ff000808ff007373ff00ddddff007b7bff009999ff00aeaefd002b2bfe008787 +fc00d6d6ff009999ff005151fd006666ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000606060606060b071a040d13130411071906060606060606060606060b070413132424242424131312070b06060606060606060f111313241f3212121232 +1f241313030f0606060606060f1a2e13241f321212121212323224132e1a0b060606061c1a082e241f1f1f1f1f1f1f1f1f1f1f242e2e110b0606062008080525 +242424242424242424242424051e1e1506060b13211e2e050606060606060606060606052e1e21040b0607080c161e2e06060606060606060606062e2e160c08 +0e061a0c1421161e06060606060606060606061e1621140c0306131414142121060606060606060606060621212828280d060802020202280606060606060606 +06060628280202021706080202020228060606060606060606060628280202021706170202282116060606060606060606060616162828021706131414160525 +06060606060606060606062505160c0c13061a0c160532090606060606060606060606093205160c11060708081f222b06060606060606060606062b221f0808 +18060b0405092b2c06060606060606060606062c2b0905040b0606150d090a272d2d2d2d2d2d2d2d2d2d2d270a090d070606060b03121b271d01232323232323 +23231d271b12101c060606061c1011202623302a2a2a2a2a3023262011100b060606060606192f29202d01232a2a2a23012d2029201906060606060606061c18 +03032f2c2727272c2f29290e1c06060606060606060606061c0e1022222222221b0e1c06060606060606030000000000}}{\nonshppict{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw23\pich23\picwgoal390\pichgoal390\wmetafile8 +010009000003980300001000360300000000050000000b0200000000050000000c021700170004000000020101000400000004010d0008000000fa0200000000 +000000000000040000002d01000007000000fc020000ffffff000000040000002d0101001c000000fb0200000e00000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000040000002d010200040000002e011800050000000902ffffff0004000000070103003603 +0000430f2000cc000000170017000000000017001700000000002800000017000000170000000100080000000000280200000000000000000000000100000000 +000000ff0000c4c4fe000000ff007171f7004949f8003333ff00ffffff00a6a6f7002121f8005b5bfe008989ff00e6e6f7000f0ff9004040f700b4b4f800d8d8 +f7007a7af8006b6bf8005353f9003a3afa000808f9009b9bf7001919fe002929f800ababf700dfdff7006262f8008484f900f1f1f700bfbfff002020fd004a4a +fe009696f7001111fe006666ff00ccccff004141fe003c3cff00b6b6fe00a6a6ff000808ff007373ff00ddddff007b7bff009999ff00aeaefd002b2bfe008787 +fc00d6d6ff009999ff005151fd006666ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffff +ff000606060606060b071a040d13130411071906060606060606060606060b070413132424242424131312070b06060606060606060f111313241f3212121232 +1f241313030f0606060606060f1a2e13241f321212121212323224132e1a0b060606061c1a082e241f1f1f1f1f1f1f1f1f1f1f242e2e110b0606062008080525 +242424242424242424242424051e1e1506060b13211e2e050606060606060606060606052e1e21040b0607080c161e2e06060606060606060606062e2e160c08 +0e061a0c1421161e06060606060606060606061e1621140c0306131414142121060606060606060606060621212828280d060802020202280606060606060606 +06060628280202021706080202020228060606060606060606060628280202021706170202282116060606060606060606060616162828021706131414160525 +06060606060606060606062505160c0c13061a0c160532090606060606060606060606093205160c11060708081f222b06060606060606060606062b221f0808 +18060b0405092b2c06060606060606060606062c2b0905040b0606150d090a272d2d2d2d2d2d2d2d2d2d2d270a090d070606060b03121b271d01232323232323 +23231d271b12101c060606061c1011202623302a2a2a2a2a3023262011100b060606060606192f29202d01232a2a2a23012d2029201906060606060606061c18 +03032f2c2727272c2f29290e1c06060606060606060606061c0e1022222222221b0e1c06060606060606030000000000}} +{\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 - {\b BLOCKED}: This test case has a dependency that failed.} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Index} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab A user defined sort index. This can be used to place your test cases in a specific order.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Add Notes} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This is a place to append notes to the case-run. } +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Notes} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This field combines the notes from all case-runs records for this case in this run as well as status change history.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Update bug status} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab With this box checked, bugs that are attached to this test case in the RESOLVED FIXED state will be automatically placed in the REOPENED state if the test case fails or into the VERIFIED FIXED state if it passes. } +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Attach Bugs} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This field allows you to attach bugs to this test case. Enter a comma separated list of bug numbers to attach more than one bug at a time.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Assignee} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This is the person assigned to run this test case.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Tested By} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab This is the person that actually ran the test. This is updated when a test case is placed into the PASSED, FAILED, or BLOCKED status.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Close Date} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The time this test case was closed (PASSED, FAILED, or BLOCKED)} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Build} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The product build used for this test case-run.} +\par \pard\plain \ltrpar\s33\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs28\lang1033\i\b\loch\f0\fs28\lang1033\i\b {\rtlch \ltrch\loch\f0\fs28\lang1033\i\b Environment} +\par \pard\plain \ltrpar\s13\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\li360\ri0\lin360\rin0\fi-360\sa240\ql\rtlch\af11\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab The product environment used for this test case run.} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab } +\par \page\pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Glossary} +\par \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrt\brdrs\brdrw1\brdrcf1\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s17\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af10\afs24\lang255\ai\ab\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\i\b\loch\f0\fs24\lang1033\i\b {\rtlch \ltrch\loch\f0\fs24\lang1033\i\b Term} +\cell\pard\plain \intbl\ltrpar\s17\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af10\afs24\lang255\ai\ab\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\i\b\loch\f0\fs24\lang1033\i\b {\rtlch \ltrch\loch\f0\fs24\lang1033\i\b Objects} +\cell\pard\plain \intbl\ltrpar\s17\cf0\qc{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\rtlch\af10\afs24\lang255\ai\ab\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\i\b\loch\f0\fs24\lang1033\i\b {\rtlch \ltrch\loch\f0\fs24\lang1033\i\b Description} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Action} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test Case} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The list of steps that a test case must complete.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Alias} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test Case} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A globally unique string that identifies a test case in conjunction with the test case ID. } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Archive} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test Plan} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test plans may be archived and hidden from regular searches.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Arguments} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test Case} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A list of parameters to send to an automatic test script .} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Assignee} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The person responsible for applying a status to a test case-run} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Blocks} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A test case that blocks another test case.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 BLOCKED} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test case-run indicating the prerequisite test case failed.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Build} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 In software testing, a string denoting the compiled results of a period of development. } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Category} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A property of a product that is used to classify test cases.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Clone} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 An exact replica of data between two objects. In Testopia you can clone plans, runs, and cases.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Component} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A Bugzilla component. An attribute of a product.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 CONFIRMED} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a case. Confirmed test cases have been approved for use in test runs.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Default Tester} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The default person responsible for applying a status to the test case-run for a given test case.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Dependency} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test cases can be dependent on other test cases. There are two types of relationships, depends on and blocks. A test case that is blocked by another should not be examined before the prerequisite test case as success is determined in part by the outcome of + the predecessor.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Depends on} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Sets up a dependency between test cases. Depends on lists the test cases that a particular test case requires to be completed before this case.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 DISABLED} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test case denoting it is no longer used for active testing. Similar to archival for a plan.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Expected Results} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The expected results upon completing the action of a test case.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Environment} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A list of the surrounding conditions that a test run is performed in.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 FAILED} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test case-run. Denotes the test case failed in the given run.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 IDLE} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test case-run. Denotes the test case has not been examined in the given run.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Manager} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The person in charge of a given run.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Milestone} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A Bugzilla object. A property of a product that implies when a given bug or feature will be fixed or included. Testopia builds are associated with milestones.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 PASSED} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test case-run. Denotes the test case has met the conditions of success detailed in the Expected Results of the test case in the given run.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 PAUSED} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test case-run. Denotes the test case has been under examination in the given run and is on hold. Used primarily for performance tests that may span long time periods.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Plan Document} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The information of a test plan detailing what the test plan will cover for what by when. Depending on the level of scrutiny required it can be very verbose.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Plan Version} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The version of the plan document used for a particular run. } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Priority} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The Bugzilla priority. Test cases can be assigned a priority similar to bugs.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 PROPOSED} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test case that denotes it has not yet been approved for use in test runs. } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Requirement} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A field of a test case provided to capture information about a requirement. Typically an ID of a requirement in a separate requirement tracking system.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 RUNNING} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test case-run. Denotes the test case is in the process of being examined in the given run.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Running} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test run. Running test runs can have case-runs updated and implies that there is further testing to be done in the run.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Script} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A path to an external automated test script for a given test case. Testopia does not run this script, the field is only provided as a way of informing the user where to find it.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Stopped} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A status of a test run. Stopped test runs can not have case-runs updated. This status denotes the run is complete.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Tag} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A user defined string used to classify test plans, cases, and runs. } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test Case} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 A list of conditions and expected results for success for a particular feature or object under scrutiny. Test cases are associated with one or more test plans and with zero or more test runs.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test Case-run} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The union of a test case and a test run. Each time a test case is included in a new test run, an entry is made for it in the test case-runs table. This captures whether the test case passed or failed in the given run. Each case-run should be associated wit +h only one build for a given status. } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test Plan} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The defining object in Testopia. Organizes the other objects in Testopia.} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Test Run} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The instance of performance in Testopia. Each run is associated with a single plan and environment. It contains a list of test cases to be examined and stores the results in the case-runs table. } +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Tested By} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The person who examined and applied a status to a given case-run} +\cell\row\pard \trowd\trql\trpaddft3\trpaddt55\trpaddfl3\trpaddl55\trpaddfb3\trpaddb55\trpaddfr3\trpaddr55\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx1693\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\cellx3506\clbrdrl\brdrs\brdrw1\brdrcf1\clbrdrb\brdrs\brdrw1\brdrcf1\clbrdrr\brdrs\brdrw1\brdrcf1\cellx9357 +\pard\intbl\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Type} +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\cell\pard\plain \intbl\ltrpar\s16\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 The plan type. Plan types might include System, Unit, Integration etc. Each plan can be of only one type.} +\cell\row\pard \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \page\pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Getting Help} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 There are a number of resources for getting help in Testopia. You should first check out the FAQ on the wiki for additional pointers not included in this manual. If your problem is not there, asking your question on the mailing lists or in the chat room ar +e your next best options. Please do not email the developers directly with support questions. They are busy people like you who have other commitments and cannot expect to be available at all times. Besides, asking your questions in a public forum allow mo +re people the chance to respond and might get you a solution more quickly.} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Mailing Lists} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\field{\*\fldinst HYPERLINK "mailto:support-webtools@lists.mozilla.org" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\loch{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 support-webtools@lists.mozilla.org}}} +\par \pard\plain {\listtext\pard\plain \li720\ri0\lin720\rin0\fi-360\sa120\f4\fs18\f4\fs18\f4\fs18 \u9679\'3f\tab}\ilvl0 \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ls0\aspalpha\li720\ri0\lin720\rin0\fi-360\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\field{\*\fldinst HYPERLINK "mailto:dev-apps-webtools@lists.mozilla.org" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\loch{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 dev-apps-webtools@lists.mozilla.org}}} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b IRC Chatroom} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab {\field{\*\fldinst HYPERLINK "irc://irc.mozilla.org/testopia" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 irc://irc.mozilla.org/testopia}}} +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Wiki} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab {\field{\*\fldinst HYPERLINK "http://wiki.mozilla.org/Testopia" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://wiki.mozilla.org/Testopia}} } +\par \pard\plain \sb240\sa120\keepn\f2\fs23\b\fs23\b\fs23\b \ltrpar\s8\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs23\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs23\lang1033\b\loch\f2\fs23\lang1033\b {\rtlch \ltrch\loch\f2\fs23\lang1033\i0\b Project Home Page} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab {\field{\*\fldinst HYPERLINK "http://mozilla.org/projects/testopia" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://mozilla.org/projects/testopia}}} +\par \pard\plain \sb240\sa120\keepn\f2\fs28\b\fs28\b\fs28\b \ltrpar\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs28\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs28\lang1033\b\loch\f2\fs28\lang1033\b {\rtlch \ltrch\loch\f2\fs28\lang1033\i0\b Reporting Bugs} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Testopia is still a work in progress. As such, it still has a lot of bugs to be worked out. If you encounter a bug or find some way to make Testopia better, please log it at } +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab {\field{\*\fldinst HYPERLINK "http://bugzilla.mozilla.org/enter_bug.cgi?product=Testopia" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://bugzilla.mozilla.org/enter_bug.cgi?product=Testopia}}} +\par \pard\plain \ltrpar\s2\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sa120\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Be sure to include steps to reproduce the problem and what browser you are using to access Testopia. } +\par \page\pard\plain \sb240\sa120\keepn\f2\fs32\b\fs32\b\fs32\b \ltrpar\s4\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\sb240\sa120\keepn\ql\rtlch\afs32\lang255\ab\ltrch\dbch\langfe255\hich\f2\fs32\lang1033\b\loch\f2\fs32\lang1033\b {\rtlch \ltrch\loch\f2\fs32\lang1033\i0\b Bibliography} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Copeland, L. (2004). A Practitioner's Guide to Software Test Design } +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Norwood, MA: Artech House} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 IEEE Std 829-1998 IEEE Standard for Software Test Documentation (n.d).} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Retrieved February 28, 2007 from \tab {\field{\*\fldinst HYPERLINK "http://standards.ieee.org/reading/ieee/std_public/description/se/829-1998_desc.html" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://standards.ieee.org/reading/ieee/std_public/description/se/829-1998_desc.html}}} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Lohmeyer, J. (2004, April 27). Open-Source Bug Tracking with Bugzilla. Linux Journal.} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Retrieved February 27, 2007, from {\field{\*\fldinst HYPERLINK "http://www.linuxjournal.com/taxonomy/term/8" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://www.linuxjournal.com/article/7216}}} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Meyers, G.J. (2004). The Art of Software Testing, Second Edition} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Hoboken, NJ: John Wiley & Sons.} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Runnels, D.L. (1999). {\f8 How to Write Better Test Cases}} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\rtlch \ltrch\loch\f8\fs24\lang1033\i0\b0{\f8 \tab }}{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Retrieved September, 2006 from} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033{\field{\*\fldinst HYPERLINK "http://www.stickyminds.com/getfile.asp?ot=XML&id=2136&fn=XDD2136filelistfilename1.pdf" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\loch{\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 http://www.stickyminds.com/getfile.asp?ot=XML&id=2136&fn=XDD2136filelistfilename1%2Epdf}} } +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Sherry, R.(2006, August).Testopia} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Retrieved January 23, 2007 from \tab {\field{\*\fldinst HYPERLINK "http://www.rosiesherry.com/softwaretesting/show/Testopia" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://www.rosiesherry.com/softwaretesting/show/Testopia}} } +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 Why Software Testing is Important ??? - Good one! (June 6, 2006).} +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab Retrieved January 23, 2007 from } +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 {\rtlch \ltrch\loch\f0\fs24\lang1033\i0\b0 \tab {\field{\*\fldinst HYPERLINK "http://techiecorner.blogspot.com/2006/06/why-softwaretesting-is-important-good.html" }{\fldrslt \*\cs37\cf2\ul\ulc0\rtlch\ltrch\dbch\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 http://techiecorner.blogspot.com/2006/06/why-softwaretesting-is-important-good.html}} } +\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\aspalpha\ql\rtlch\af10\afs24\lang255\ltrch\dbch\af7\langfe255\hich\f0\fs24\lang1033\loch\f0\fs24\lang1033 +\par } \ No newline at end of file diff --git a/testopia/doc/Manual.xhtml b/testopia/doc/Manual.xhtml new file mode 100644 index 0000000..9e80b80 --- /dev/null +++ b/testopia/doc/Manual.xhtml @@ -0,0 +1,135 @@ + + +<meta name="generator" content="StarOffice/OpenOffice.org XSLT (http://xml.openoffice.org/sx2ml)" /><meta name="author" content="Greg Hendricks" /><meta name="created" content="2007-02-26T14:35:59" /><meta name="changedby" content="Greg Hendricks" /><meta name="changed" content="2007-03-02T18:00:57" /><base href="." /><style type="text/css"> + @page { size: 8.5inch 11inch; margin-top: 1inch; margin-bottom: 1inch; margin-left: 1inch; margin-right: 1inch } + table { border-collapse:collapse; border-spacing:0; empty-cells:show } + td, th { vertical-align:top; } + h1, h2, h3, h4, h5, h6 { clear:both } + ol, ul { padding:0; } + * { margin:0; } + *.fr1 { vertical-align:top; } + *.fr2 { vertical-align:top; text-align:center; } + *.fr3 { vertical-align:top; } + *.fr4 { vertical-align:middle; text-align:center; } + *.Graphics { vertical-align:top; text-align:center; } + *.Caption { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0.0835in; margin-bottom:0.0835in; font-style:italic; } + *.Contents1 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0in; margin-right:0in; text-indent:0inch; } + *.Contents2 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.1965in; margin-right:0in; text-indent:0inch; } + *.Contents3 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.3929in; margin-right:0in; text-indent:0inch; } + *.Contents4 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.5898in; margin-right:0in; text-indent:0inch; } + *.Contents5 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.7862in; margin-right:0in; text-indent:0inch; } + *.Contents8 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:1.3756in; margin-right:0in; text-indent:0inch; } + *.Contents9 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:1.572in; margin-right:0in; text-indent:0inch; } + *.ContentsHeading { font-family:'Albany AMT'; font-size:16pt; margin-top:0.1665in; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; text-indent:0inch; font-weight:bold; } + *.Definition { font-family:'Thorndale AMT'; font-size:14pt; font-style:italic; font-weight:bold; } + *.Footer { font-family:'Thorndale AMT'; font-size:12pt; } + *.Header { font-family:'Thorndale AMT'; font-size:12pt; } + *.Heading { font-family:'Albany AMT'; font-size:14pt; margin-top:0.1665in; margin-bottom:0.0835in; } + *.Heading1 { font-family:'Albany AMT'; font-size:115%; margin-top:0.1665in; margin-bottom:0.0835in; font-weight:bold; } + *.Heading2 { font-family:'Albany AMT'; font-size:14pt; margin-top:0.1665in; margin-bottom:0.0835in; font-style:italic; font-weight:bold; } + *.Heading3 { font-family:'Albany AMT'; font-size:14pt; margin-top:0.1665in; margin-bottom:0.0835in; font-weight:bold; } + *.Heading4 { font-family:'Albany AMT'; font-size:85%; margin-top:0.1665in; margin-bottom:0.0835in; font-style:italic; font-weight:bold; } + *.Heading5 { font-family:'Albany AMT'; font-size:85%; margin-top:0.1665in; margin-bottom:0.0835in; font-weight:bold; } + *.Heading8 { font-family:'Albany AMT'; font-size:75%; margin-top:0.1665in; margin-bottom:0.0835in; font-weight:bold; } + *.Heading9 { font-family:'Albany AMT'; font-size:75%; margin-top:0.1665in; margin-bottom:0.0835in; font-weight:bold; } + *.Index { font-family:'Thorndale AMT'; font-size:12pt; } + *.List { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.List1End { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.1665in; margin-left:0.25in; margin-right:0in; text-indent:-0.25inch; } + *.List1Start { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0.1665in; margin-bottom:0.0835in; margin-left:0.25in; margin-right:0in; text-indent:-0.25inch; } + *.ListContents { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.3937in; margin-right:0in; text-indent:0inch; } + *.ListHeading { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0in; margin-right:0in; text-indent:0inch; } + *.P1 { font-family:'Thorndale AMT'; font-size:20pt; text-align:center ! important; font-weight:bold; } + *.P10 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.3929in; margin-right:0in; text-indent:0inch; } + *.P11 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.5898in; margin-right:0in; text-indent:0inch; } + *.P12 { font-family:'Albany AMT'; font-size:115%; margin-top:0.1665in; margin-bottom:0.0835in; font-weight:bold; } + *.P13 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P14 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P15 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P16 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; font-weight:bold; } + *.P17 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0in; margin-right:0.3937in; margin-top:0in; margin-bottom:0.1965in; text-indent:0inch; } + *.P18 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P19 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P2 { font-family:'Thorndale AMT'; font-size:20pt; text-align:center ! important; font-weight:bold; } + *.P20 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; font-weight:normal; } + *.P21 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; font-weight:normal; } + *.P22 { font-family:'Albany AMT'; font-size:11.8999996185303pt; margin-top:0.1665in; margin-bottom:0.0835in; font-weight:bold; } + *.P23 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; font-style:normal; } + *.P24 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P25 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P26 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; font-weight:normal; } + *.P27 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; font-weight:normal; } + *.P28 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.1965in; text-align:left ! important; } + *.P29 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.1965in; } + *.P3 { font-family:'Thorndale AMT'; font-size:12pt; text-align:center ! important; } + *.P30 { font-family:'Thorndale AMT'; font-size:12pt; } + *.P31 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.1965in; } + *.P32 { font-family:'Thorndale AMT'; font-size:12pt; } + *.P33 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.1965in; } + *.P34 { font-family:'Thorndale AMT'; font-size:12pt; } + *.P35 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.1965in; } + *.P36 { font-family:'Thorndale AMT'; font-size:12pt; } + *.P37 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.1965in; } + *.P38 { font-family:'Thorndale AMT'; font-size:12pt; } + *.P39 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.1965in; } + *.P4 { font-family:'Albany AMT'; font-size:16pt; margin-top:0.1665in; margin-bottom:0.0835in; margin-left:0in; margin-right:0in; text-indent:0inch; font-weight:bold; } + *.P40 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.1965in; } + *.P41 { font-family:'Albany AMT'; font-size:14pt; margin-top:0.1665in; margin-bottom:0.0835in; font-style:italic; font-weight:bold; } + *.P42 { font-family:'Albany AMT'; font-size:75%; margin-top:0.1665in; margin-bottom:0.0835in; font-weight:bold; font-style:italic; } + *.P43 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P44 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P45 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P46 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.3937in; margin-right:0in; text-indent:0inch; margin-top:0in; margin-bottom:0.1965in; } + *.P47 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P48 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P49 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.2945in; margin-right:0in; text-indent:0inch; } + *.P5 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0in; margin-right:0in; text-indent:0inch; } + *.P50 { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.P51 { font-family:'Thorndale AMT'; font-size:12pt; text-align:left ! important; } + *.P52 { font-family:'Thorndale AMT'; font-size:12pt; text-align:left ! important; } + *.P6 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.7862in; margin-right:0in; text-indent:0inch; } + *.P7 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.1965in; margin-right:0in; text-indent:0inch; } + *.P8 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:1.3756in; margin-right:0in; text-indent:0inch; } + *.P9 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:1.572in; margin-right:0in; text-indent:0inch; } + *.Quotations { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.3937in; margin-right:0.3937in; margin-top:0in; margin-bottom:0.1965in; text-indent:0inch; } + *.Standard { font-family:'Thorndale AMT'; font-size:12pt; } + *.TableContents { font-family:'Thorndale AMT'; font-size:12pt; } + *.TableHeading { font-family:'Thorndale AMT'; font-size:12pt; text-align:center ! important; font-style:italic; font-weight:bold; } + *.Textbody { font-family:'Thorndale AMT'; font-size:12pt; margin-top:0in; margin-bottom:0.0835in; } + *.UserIndex5 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:0.7862in; margin-right:0in; text-indent:0inch; } + *.UserIndex9 { font-family:'Thorndale AMT'; font-size:12pt; margin-left:1.572in; margin-right:0in; text-indent:0inch; } + *.Sect1 { } + *.Table1 { width:4.6167in; } + *.Table2 { width:6.5in; float:none; } + *.Table1A1 { padding:0.0354in; border-left-width:0.0917cm; border-left-style:double; border-left-color:#808080; border-right-style:none; border-top-width:0.0917cm; border-top-style:double; border-top-color:#808080; border-bottom-width:0.0917cm; border-bottom-style:double; border-bottom-color:#808080; } + *.Table1A2 { padding:0.0354in; border-left-width:0.0917cm; border-left-style:double; border-left-color:#808080; border-right-style:none; border-top-style:none; border-bottom-width:0.0917cm; border-bottom-style:double; border-bottom-color:#808080; } + *.Table1B1 { padding:0.0354in; border-width:0.0917cm; border-style:double; border-color:#808080; } + *.Table1B2 { padding:0.0354in; border-left-width:0.0917cm; border-left-style:double; border-left-color:#808080; border-right-width:0.0917cm; border-right-style:double; border-right-color:#808080; border-top-style:none; border-bottom-width:0.0917cm; border-bottom-style:double; border-bottom-color:#808080; } + *.Table2A1 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-width:0.0133cm; border-top-style:solid; border-top-color:#000000; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; } + *.Table2A2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-style:none; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; } + *.Table2C1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; } + *.Table2C2 { padding:0.0382in; border-left-width:0.0133cm; border-left-style:solid; border-left-color:#000000; border-right-width:0.0133cm; border-right-style:solid; border-right-color:#000000; border-top-style:none; border-bottom-width:0.0133cm; border-bottom-style:solid; border-bottom-color:#000000; } + *.Table1A { width:2.3083in; } + *.Table2A { width:1.1757in; } + *.Table2B { width:1.259in; } + *.Table2C { width:4.0632in; } + *.BulletSymbols { font-family:StarSymbol; font-size:9pt; } + *.Internetlink { color:#000080; text-decoration:underline; } + *.NumberingSymbols { } + *.SourceText { font-family:'Cumberland AMT'; } + *.T1 { font-family:'Thorndale AMT'; } + *.T10 { font-style:italic; } + *.T11 { font-style:normal; } + *.T12 { font-style:normal; text-decoration:underline; } + *.T13 { font-weight:bold; } + *.T14 { font-family:'Luxi Mono'; } + *.T15 { font-family:'Thorndale AMT'; font-weight:bold; } + *.T2 { font-weight:bold; } + *.T3 { font-weight:normal; } + *.T4 { color:#000000; } + *.T5 { text-decoration:underline; } + *.T6 { } + *.T7 { font-weight:bold; } + *.T8 { font-weight:normal; text-decoration:underline; } + *.T9 { font-weight:normal; text-decoration:underline; } + *.VisitedInternetLink { color:#800000; text-decoration:underline; } + </style></head><body dir="ltr"><p class="P1"> </p><div class="P2"><img width="247" height="304" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr1" /></div><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P2"> </p><p class="P2">Software Testing With Testopia </p><p class="P3">By Greg Hendricks </p><p class="P3"><a href="mailto:gregaryh@gmail.com">gregaryh@gmail.com</a></p><p class="P3"> </p><p class="P3"><a href="http://mozilla.org/projects/testopia">http://mozilla.org/projects/testopia</a></p><p class="Standard"> </p><p class="P4">Table of Contents </p><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Introduction</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Testopia - Test Case Management</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Testopia and Bugzilla</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>The Mozilla Foundation and the Testopia Project</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Installation</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Requirements at a Glance</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P8"><colgroup><col style="width: 5.1244in" /></colgroup><tr><td>   Recommended version Where to get it</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Database</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Additional Perl Modules</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Libraries</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Client</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>What You Need to Know</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Downloading and Installing</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Upgrading From Testopia 1.0.x</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Configuration</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Using Testopia</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Why Test?</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>What Types of Testing can Testopia Help You With?</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P10"><colgroup><col style="width: 6.1071in" /></colgroup><tr><td>Black Box Testing</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P10"><colgroup><col style="width: 6.1071in" /></colgroup><tr><td>White box and Automated Testing</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Getting Started</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P10"><colgroup><col style="width: 6.1071in" /></colgroup><tr><td>The Big Picture</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Test Plans</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Test Cases</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Test Runs</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Test Run Environments</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Builds</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Test Case-Runs</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Testing In Testopia</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Start With a Plan</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Viewing A Test Plan</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Attaching Files</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Editing Plan Fields</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Viewing Plan History</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Adding Categories and Builds</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Creating Test Cases</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Shortcut – Creating a Test Case</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Adding and Removing Components and Tags</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Viewing Test Case-Run Results</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Attaching Files</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Attaching Bugs</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Editing Case Fields</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Test Case Dependencies</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Creating Environments</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P10"><colgroup><col style="width: 6.1071in" /></colgroup><tr><td>Environment Administration</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P11"><colgroup><col style="width: 5.9102in" /></colgroup><tr><td>Categories</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P11"><colgroup><col style="width: 5.9102in" /></colgroup><tr><td>Elements</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P11"><colgroup><col style="width: 5.9102in" /></colgroup><tr><td>Properties</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P11"><colgroup><col style="width: 5.9102in" /></colgroup><tr><td>Property Values</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Creating Your Environment</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Creating A Test Run</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Shortcut – Creating a Test Run</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Viewing Your Test Run </td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Adding Cases</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Editing Test Run Fields</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Running Your Tests</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Filtering Your Test Cases in a Run</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Sorting Test Cases</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Passing and Failing Test Cases</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Adding Notes</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Attaching Bugs</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Reassigning Tests</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Changing Build or Environment on a Test Case</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Classic View</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Deleting Case-Runs</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Updating Multiple Cases at Once</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Wrapping Up</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Getting Around Testopia</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Searching</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Sorting Search Results</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Paging</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Batch Processing</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Saved Searches</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Reporting</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Plan Reports</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Build Coverage Report</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Top Bugs</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Bugs Found In This Plan</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Printable Percentage Report</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Test Case Reports</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Estimated vs Actual Time</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Historic Status Breakdown</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Cloning</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Cloning Test Plans</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Cloning Test Cases</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Cloning a Run</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Deleting</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Test Cases</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Test Plans</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P9"><colgroup><col style="width: 4.928in" /></colgroup><tr><td>Test Runs</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Importing and Exporting</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Importing Test Cases</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Testopia Security</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>The Testers Group</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Test Plan Access Control Lists</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>User Regular Expression</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Explicit Inclusion</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P7"><colgroup><col style="width: 6.3035in" /></colgroup><tr><td>Access Rights</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Read </td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Write </td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Delete </td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Admin </td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Tags</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Adding Tags to an Object</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P6"><colgroup><col style="width: 5.7138in" /></colgroup><tr><td>Viewing Tags</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Using Testopia With Automated Test Scripts</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Field Descriptions</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P10"><colgroup><col style="width: 6.1071in" /></colgroup><tr><td>Test Plans</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P10"><colgroup><col style="width: 6.1071in" /></colgroup><tr><td>Test Cases</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P10"><colgroup><col style="width: 6.1071in" /></colgroup><tr><td>Test Runs</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P10"><colgroup><col style="width: 6.1071in" /></colgroup><tr><td>Test Case-Runs</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Glossary</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Getting Help</td></tr></table><table border="0" cellspacing="0" cellpadding="0" class="P5"><colgroup><col style="width: 6.5in" /></colgroup><tr><td>Bibliography</td></tr></table><h1 class="P12"><a name="Introduction" />Introduction</h1><p class="Textbody">Testing, especially software testing, can be a tedious and overwhelming task. Often there are many levels of testing requirements and many iterations during a project life cycle. Keeping track of the results of tests is important both to the customer, and the developer. Customers want to know that their requirements are being met and developers want to know if there are bugs that they missed. Testing is an important part of the software development process since “Software should be predictable and consistent, offering no surprises to users” (Meyers 2004, ch 1). </p><h5 class="Heading5"><a name="Testopia_-_Test_Case_Management" />Testopia - Test Case Management</h5><p class="Textbody">Test case management is the process of tracking test outcomes on a set of test cases for a given set of environments and development iterations. To do this effectively, an organizational structure needs to be set in place to track test cases and their outcomes in a given test scenario. Testopia was developed to provide a central repository for the collaborative efforts of distributed testers. It serves as both a test case repository and management system. Testopia is designed to meet the needs of software testers from all sizes of groups and organizations.  </p><p class="Textbody">Though Testopia was designed primarily for software testing, it can be used to track any type of test cases. Also, being open source, Testopia can be easily adapted to fit just about any testing model. </p><h2 class="Heading2"><a name="Testopia_and_Bugzilla" />Testopia and Bugzilla</h2><p class="Textbody">Mozilla's Bugzilla bug tracking system is one of the most popular open source issue tracking systems available. Bugzilla “provides an easy to use, easy to maintain and cost effective solution with a rich feature set that easily can compete with its proprietary counterparts” (Lohmeyer). </p><p class="Textbody">Test cases are, and should be, closely tied to defects. As defects are found, test cases should be written to verify that the defect is fixed in future releases. To this end Testopia was designed as an add-on extension to Bugzilla. This allows a single user experience and point of product management for both defect tracking and test case management. </p><h2 class="Heading2"><a name="The_Mozilla_Foundation_and_the_Testopia_Project" />The Mozilla Foundation and the Testopia Project</h2><p class="Textbody">Testopia began life as Bugzilla Testrunner. It was written by Maciej Maczynski in 2001 and later ownership passed to Ed Fuentetaja who passed development duties to Greg Hendricks in 2006. It was renamed Testopia in March 2006 prior to release of version 1.0 in May. It was adopted as a Mozilla project and now resides at <a href="http://mozilla.org/projects/testopia">http://mozilla.org/projects/testopia</a>.</p><p class="Textbody">Since May 2006, Testopia has been increasing in popularity among testers in the open source community as well as in other organizations. In a recent blog posting, Rosie Sherry, a respected software testing expert, states that “This is probably the most comprehensive open source test management system and once up and running provides everything needed of a test management system” (Sherry 2006). </p><h1 class="P12"><a name="Installation" />Installation</h1><h2 class="Heading2"><a name="Requirements_at_a_Glance" />Requirements at a Glance</h2><h8 class="Heading8"><a name="Recommended_versionWhere_to_get_it" />                        Recommended version        Where to get it</h8><p class="Textbody">Bugzilla                2.22.2                                <a href="http://bugzilla.org/downloads">http://bugzilla.org/downloads</a></p><h9 class="Heading9"><a name="Database" />Database</h9><p class="Textbody">MySQL                5.0                                <a href="http://mysql.com/">http://mysql.com</a></p><h9 class="Heading9"><a name="Additional_Perl_Modules" />Additional Perl Modules</h9><p class="Textbody">JSON                                                        http://cpan.org</p><p class="Textbody">Text::Diff                                                <a href="http://cpan.org/">http://cpan.org</a></p><h9 class="Heading9"><a name="Libraries" />Libraries</h9><p class="Textbody">Dojo toolkit                0.4.1                                <a href="http://dojotoolkit.org/">http://dojotoolkit.org/</a> </p><h9 class="Heading9"><a name="Client" />Client</h9><p class="Textbody">Firefox                 2.0+                                <a href="http://getfirefox.com/">http://getfirefox.com</a></p><h2 class="Heading2"><a name="What_You_Need_to_Know" />What You Need to Know</h2><p class="Textbody">As our development has moved forward, we have decided to try to keep abreast of the latest stable release from Bugzilla (currently 2.22). This gives us a stable code base to work from. Developing plugins or extensions for any software is like trying to hit a moving target. This decision allows us to focus our time more on releasing new features often and early rather than back porting. However, this means that most major feature will not be back ported to earlier versions unless and until we have time to do so. Anyone wishing to help in this effort is more than welcome. </p><p class="Textbody">Though Bugzilla officially supports MySQL and Postgres databases, Testopia has only been tested with MySQL. Patches are welcome to make Testopia Postgres compliant. </p><p class="Textbody">Likewise, Testopia has only been thoroughly tested using Firefox browsers. This is not because we don't care about other browser platforms, but because we lack the time and resources to attempt thorough testing in other browsers. Testopia should run fine on mast modern browsers.  If issues arise however, please log them at bugzilla.mozilla.org </p><p class="Textbody">Testopia makes use of some cutting edge AJAX technology provided by the Dojo toolkit. Our philosophy is that it is better to focus more processing on the client than to tie up the server. Dojo places some extra weight on the client, but makes interactions with the server faster. This increases the load on the client machine however, which means the need for faster processing power and more memory. Trying to run Testopia on a Pentium 2 with 128 MB of RAM will probably not be the best user experience.  </p><h2 class="Heading2"><a name="Downloading_and_Installing" />Downloading and Installing</h2><p class="Textbody">Testopia is an extension to Bugzilla. It goes without saying then that you should have Bugzilla up and running first. Instructions for installing Bugzilla can be found at <a href="http://bugzilla.org/">http://bugzilla.org</a> as well as in the package you downloaded. Basically all you need is to unzip the package and run checksetup.pl and follow any instructions that come up.</p><p class="Textbody">Once you have bugzilla successfully installed you need to do the following to get Testopia up and running: </p><ol style="margin-left:1.25cm;list-style-type:decimal; "><li class="P13" style="margin-left:0cm;"><p class="P13" style="margin-left:0.25cm;">Download the testopia tarball from ftp://ftp.mozilla.org </p></li><li class="P13" style="margin-left:0cm;"><p class="P13" style="margin-left:0.25cm;">Copy the testopia tar ball into your bugzilla's root directory. </p></li><li class="P13" style="margin-left:0cm;"><p class="P13" style="margin-left:0.25cm;">Untar  </p><ol style="margin-left:0.75cm;list-style-type:decimal; "><li class="P13" style="margin-left:0cm;"><p class="P13" style="margin-left:0.25cm;"><span class="SourceText">tar xzvf testopia-<release>.tar.gz</span></p></li></ol></li><li class="P13" style="margin-left:0cm;"><p class="P13" style="margin-left:0.25cm;">Run tr_install.pl  </p><ol style="margin-left:0.75cm;list-style-type:decimal; "><li class="P13" style="margin-left:0cm;"><p class="P13" style="margin-left:0.25cm;"><span class="SourceText">perl tr_install.pl</span></p></li></ol></li><li class="P14" style="margin-left:0cm;"><p class="P14" style="margin-left:0.25cm;"><span class="T1">Download Dojo (If installing from CVS)</span></p></li></ol><p class="P15"><span class="T1">The easiest way to install dojo is from their subversion repository. Instructions are found in the DOJO_INSTALL_HELP file inside the testopia/dojo directory.</span></p><p class="Textbody">The tr_install script sets up the database tables, patches your code, and sets up the Testers group in Bugzilla. Whenever you update Testopia, you should run tr_install and checksetup again. </p><p class="Textbody">You should now be able to See the Testopia links in the Bugzilla footer after logging into Bugzilla. Make sure you update the new Testers group to include any users that are going to need access to test cases.  </p><h2 class="Heading2"><a name="Upgrading_From_Testopia_1.0.x" />Upgrading From Testopia 1.0.x</h2><p class="Textbody">To upgrade an existing release of Testopia, you can simply follow the steps outlined above. Running tr_install will upgrade your database and set any file permissions. You can also upgrade to the latest CVS tip using the cvs_update.sh script located in the testopia/scripts directory. </p><p class="Textbody">Upgrading from Testrunner (v0.7 and prior) is not supported.  </p><h1 class="Heading1"><a name="Configuration" />Configuration</h1><p class="Textbody">Testopia adds a number of additional parameters to the Bugzilla Parameters page. They are located under the Testopia tab. If you are installing Testopia with a new installation of Bugzilla, you should be sure to set the <span class="T2">urlbase </span><span class="T3">parameter. Folowing is a list of required Testopia parameters and their explanations:</span></p><p class="P16">allow-test-deletion</p><p class="List1End"><span class="T3">        I</span>f this option is on, users can delete objects including plans and cases. Delete rights are maintained by the plan access control lists.</p><p class="P16">testopia-allow-group-member-deletes</p><p class="List1End"><span class="T3">        </span>If this option is on, members of the Testers group will be allowed to delete test objects. This overrides settings for individuals in the Testers group.</p><p class="P16">testopia-default-plan-testers-regexp</p><p class="List1End">        This is the default regular expression for granting access to new test plans.</p><p class="P16">default-test-case-status</p><p class="List1End">        Default status for newly created test cases.</p><h1 class="Heading1"><a name="Using_Testopia" />Using Testopia</h1><h2 class="Heading2"><a name="Why_Test_3F" />Why Test?</h2><p class="Textbody">The following example illustrates why software testing is so important: </p><p class="Textbody">Taken from <a href="http://techiecorner.blogspot.com/">http://techiecorner.blogspot.com</a> .</p><p class="Quotations">In March 1992, a man living in Newtown near Boston, Massachusetts, received a bill for his as yet unused credit card stating that he owed $0.00. He ignored it and threw it away. </p><p class="Quotations">In April, he received another and threw that one away too.<br />The following month, the credit card company sent him a very nasty note stating they were going to cancel his card if he didn't send them $0.00 by return of post. He called them and talked to them; they said it was a computer error and told him they'd take care of it.</p><p class="Quotations">The following month, our hero decided that it was about time that he tried out the troublesome credit card figuring that if there were purchases on his account it would put an end to his ridiculous predicament. However, in the first store that he produced his credit card in payment for his purchases, he found that his card had been canceled. </p><p class="Quotations">He called the credit card company who apologized for the computer error once again and said that they would take care of it. The next day he got a bill for $0.00 stating that payment was now overdue. Assuming that, having spoken to the credit card company only the previous day, the latest bill was yet another mistake, he ignored it, trusting that the company would be as good as their word and sort the problem out.<br />The next month, he got a bill for $0.00 stating that he had 10 days to pay his account or the company would have to take steps to recover the debt.</p><p class="Quotations">Finally giving in, he thought he would play the company at their own game and mailed them a cheque for $0.00. The computer duly processed his account and returned a statement to the effect that he now owed the credit card company nothing at all. </p><p class="Quotations">A week later, the man's bank called him asking him what he was doing writing a cheque for $0.00. After a lengthy explanation, the bank replied that the $0.00 cheque had caused their cheque processing software to fail. The bank could now not process ANY cheques from ANY of their customers that day because the cheque for $0.00 was causing the bank's computer to crash. </p><p class="Quotations">The following month, the man received a letter from the credit card company claiming that his cheque had bounced and that he now owed them $0.00 and unless he sent a cheque by return of post them would be taking steps to recover the debt. </p><p class="P17">This rather humorous anecdote explains the impact that untested software can have. In the case of both the credit card company and the bank, this seemingly minor issue may have cost both institutions significant sums of money in lost transactions and down time, to say nothing of the frustration of the customer. </p><p class="P17">Many times software errors cause only minor inconveniences. Other times they can have serious consequences. Think of the life support systems on the space shuttle or the flight control systems on an airliner. Software has become such an integral part of our lives that many times we don't realize how much we depend on  it until something goes wrong.</p><h2 class="Heading2"><a name="What_Types_of_Testing_can_Testopia_Help_You_With_3F" />What Types of Testing can Testopia Help You With?</h2><p class="Textbody">There are two general classifications of software testing: black box and white box. </p><p class="Quotations"><span class="T4">Black box testing is a strategy in which testing is based solely on the requirements and specifications. Unlike its complement, white box testing, black box testing requires no knowledge of the internal paths, structure, or implementation of the software under test</span> (Copeland, 2004,Sec I).</p><p class="Textbody"> </p><h3 class="Heading3"><a name="Black_Box_Testing" />Black Box Testing</h3><p class="Textbody">Testopia was designed primarily for this type of testing. Requirements are translated directly into test cases to be applied by the testers to the software being developed. If a requirement is not met, the test case fails; if it is met, it passes. </p><h3 class="Heading3"><a name="White_box_and_Automated_Testing" />White box and Automated Testing</h3><p class="Textbody">Though not specifically designed to handle white box tests (which are often automated), Testopia can still provide a repository for test results. Each test case can have an associated script and test logs can be attached to a test case to show the results of testing. </p><h1 class="Heading1"><a name="Getting_Started" />Getting Started</h1><h3 class="Heading3"><a name="The_Big_Picture" />The Big Picture</h3><div class="Textbody"><img width="693" height="563" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr2" /></div><p class="Textbody">Since Testopia is an extension to Bugzilla, it relies on many of the same objects that Bugzilla uses to track bugs. In order to use Testopia you first need to set up products and versions using the Bugzilla product editor. Testopia makes use of Bugzilla's target milestones feature as well so you may want to turn this optional field on in the parameters. </p><p class="Textbody">Testopia is comprised of several objects that are interdependent. Together, they make managing the testing procedure possible. Lets look at each of these in turn. </p><h2 class="Heading2"><a name="Test_Plans" />Test Plans</h2><p class="Textbody">At the top of the Testopia hierarchy are test plans. Before you can do anything else in Testopia, you need a test plan. Test plans are associated with a single product in Bugzilla, though you can have multiple test plans for each product. Your test plan will serve as the storage point for all related test cases and test runs and it will act as the dashboard for your testing. It will also serve to determine who will have access to update test cases. </p><h2 class="Heading2"><a name="Test_Cases" />Test Cases</h2><p class="Textbody">Test cases are the heart of all testing. Test cases spell out what steps to take while running a test and what outcomes to expect. If a particular run through the steps fails to produce the expected outcome, the test fails. Test cases are semi-independent in Testopia. Each test case can be associated with multiple test plans so care should be taken to ensure that updating a test case does not interfere with testing in another test plan than your own. A list of associated test plans is displayed with each test case though, so this should not be too difficult. </p><p class="Textbody">Test cases are divided into categories. You can define as many categories for your product as you like from the test plan page. These should not be confused with components however. Each product in Bugzilla is divided into components and you can apply multiple components to each test case, however each test case can belong to only one category at a time. </p><h2 class="Heading2"><a name="Test_Runs" />Test Runs</h2><p class="Textbody">Test runs are the focal point of the testing effort. Once you have defined a set of test cases, you are ready to run through those tests in a test run. Each run is associated with a single test plan and can consist of any number of test cases from that plan. Before we can run any test however, we need to have a couple more items first. </p><h2 class="Heading2"><a name="Test_Run_Environments" />Test Run Environments</h2><p class="Textbody">If test cases are the 'what' of testing, then environments are the 'where'. No test runs in a vacuum. Where you run your test is as important as how you run it. Software often is designed to run on specific hardware under specific conditions. These conditions are captured in the test environment. Environments are applied to test runs directly, but can be applied to test cases indirectly as we will see. </p><h2 class="Heading2"><a name="Builds" />Builds</h2><p class="Textbody">Software development is usually an iterative affair. Developers write code which is then compiled and included in a system. As bugs and enhancement requests come in, the developer rewrites portions over again to fix or enhance a product. In Testopia, each iteration is called a build. Builds are often associated with milestones of the project. This is reflected in the build's relationship to Bugzilla's target milestones object. Regardless of whether you use target milestones in Bugzilla, you need to define at least one build for your product before you can begin a test run. </p><h2 class="Heading2"><a name="Test_Case-Runs" />Test Case-Runs</h2><p class="Textbody">A test case-run is the record of how a particular test case fared in a particular run for a given build in a given environment. When you create a test run, records for each test case in that run are created. By default these take on the build and environment of the test run, however, it is possible to change these attributes on a particular case-run, essentially creating a new case-run for each combination. This is desirable in situations where most test cases are fairly generic in environmental scope but single test cases might require specific conditions. It also aids in iterative testing as each test case then be updated in a single run rather than having to create new runs to test the failed cases. </p><h1 class="Heading1"><a name="Testing_In_Testopia" />Testing In Testopia</h1><h2 class="Heading2"><a name="Start_With_a_Plan" />Start With a Plan</h2><p class="Textbody">All testing should start with a test plan. In most cases this will take the form of a document that details the purpose, structure, and methods that will be employed in testing. The IEEE has put together a standard document template for test plans (IEEE Standard 829-1998 for Software Test Documentation). Whether you decide to use a formal template such as this or not, having a rough outline of what your purpose for testing is will help those who test this in the future know what you were looking for in your testing. </p><p class="Textbody">To create a new test plan in Testopia: </p><ol style="margin-left:1.25cm;list-style-type:decimal; "><li class="P18" style="margin-left:0cm;"><p class="P18" style="margin-left:0.25cm;">Click the '<span class="T5">New Plan</span>' link in the Bugzilla footer</p></li><li class="P18" style="margin-left:0cm;"><p class="P18" style="margin-left:0.25cm;">Enter a name for this test plan. </p></li><li class="P18" style="margin-left:0cm;"><p class="P18" style="margin-left:0.25cm;">Select a product from the product drop-down list </p></li><li class="P18" style="margin-left:0cm;"><p class="P18" style="margin-left:0.25cm;">Select a type for this plan (descriptions of types below) </p></li><li class="P18" style="margin-left:0cm;"><p class="P18" style="margin-left:0.25cm;">Select a product version. This will be the default version for new runs. </p></li><li class="P18" style="margin-left:0cm;"><p class="P18" style="margin-left:0.25cm;">Type or paste your plan document into the Plan Document Editor </p></li><li class="P18" style="margin-left:0cm;"><p class="P18" style="margin-left:0.25cm;">Click the <span class="T2">Add</span> button</p></li></ol><p class="Textbody">Once you have done this, you will be taken to your newly created test plan.  </p><h5 class="Heading5"><a name="Viewing_A_Test_Plan" />Viewing A Test Plan</h5><p class="Textbody">At the top of your new plan, you will see an overview section detailing much of the information you entered on the new plan form. In addition to this however, you will see such things as the plan author, when it was created, and what version of the document you are viewing. </p><p class="Textbody">Below the overview section is the place for viewing categories and builds associated with this plan's product. You also have an area where you can add tags and view existing tags on this plan. We will discuss tags at greater length later. </p><p class="Textbody">From here you may wish to create some categories for your test cases and add some builds before you begin creating test cases. </p><h5 class="Heading5"><a name="Attaching_Files" />Attaching Files</h5><p class="Textbody">Once you have created your test plan, you can upload attachments to it. To create an attachment, simply click the browse button and locate the file you wish to attach, type a description in the Description field and click the attach button.  </p><p class="Textbody">Attachments are treated very much the same as they are in Bugzilla. The size limit will be determined by the max-attachment-size parameter the same as it is for Bugzilla </p><p class="Textbody">To edit an attachment click the edit link. This takes you to a page where you can set the description, filename, and mime-type for the attachment as well as view it if it is a viewable type or download it otherwise. </p><h5 class="Heading5"><a name="Editing_Plan_Fields" />Editing Plan Fields</h5><p class="Textbody">With the possible exception of product, you can edit any of the values that you supplied when you created your test plan buy scrolling down to the Attributes section or by clicking the '<span class="T5">Edit Plan Attributes</span><span class="T6">' link in the overview section. You are able to edit the product field as long as there are no test runs associated with this plan yet. Once you have created a test run you will not be able to update the product attribute unless you delete the run first.</span></p><h5 class="Heading5"><a name="Viewing_Plan_History" />Viewing Plan History</h5><p class="P19">Any changes made to plan values are captured and a history is kept so that as test circumstances change over the course of a development cycle, you can know what applied for a given set of tests in time. This also serves to thwart unintentional changes to your test plan since each change captures when it happened and who performed it. To view this history click the <span class="T2">History</span><span class="T3"> button.</span></p><p class="P19">Changes to the plan document are handled a little differently. A full version is kept for each change and it is possible to view the differences between versions by selecting which versions you want to compare and clicking the <span class="T2">Compare</span><span class="T3"> button on the plan history page.</span></p><h2 class="Heading2"><a name="Adding_Categories_and_Builds" />Adding Categories and Builds</h2><p class="Textbody">Categories are used to classify your test cases. Each product has a default category and it is up to you want to use categories to divide up your test cases. Since you can also apply product components to a test case, you may find that this suffices.<span class="T6"> Before you can create a test run however, you have to specify at least one build. To add a build or category you can click the </span><span class="T5">add</span><span class="T6"> link found below each of these fields from the test plan page. The fields are fairly self explanatory. In the case of builds however, you have the option of hiding the build by unchecking the A</span><span class="T7">ctive</span><span class="T6"> box.. This will hide it from the build list used when creating a run.</span></p><p class="P19">To edit categories and builds, click the links above their respective fields on the test plan. From here you can edit individual builds and categories or remove them. </p><h1 class="Heading1"><a name="Creating_Test_Cases" />Creating Test Cases</h1><p class="Textbody">Once you have a plan to store them in, you can start entering your test cases. Click the <span class="T5">Create a New Test Case</span><span class="T6"> link on the plan page or click the </span><span class="T5">New Case</span><span class="T6"> link in the footer to begin.</span></p><h5 class="Heading5"><a name="Shortcut__E2_80_93_Creating_a_Test_Case" />Shortcut – Creating a Test Case</h5><ol style="margin-left:1.25cm;list-style-type:decimal; "><li class="P20" style="margin-left:0cm;"><p class="P20" style="margin-left:0.25cm;">Click <span class="T5">Create a New Test Case</span> on the plan page or <span class="T5">New Case</span> from the footer</p></li><li class="P20" style="margin-left:0cm;"><p class="P20" style="margin-left:0.25cm;">Enter a short description of your test case in the <span class="T2">Summary</span> field</p></li><li class="P20" style="margin-left:0cm;"><p class="P20" style="margin-left:0.25cm;">Select a <span class="T2">Category</span></p></li><li class="P20" style="margin-left:0cm;"><p class="P20" style="margin-left:0.25cm;">Add a default tester or select a component to assign the test case to the Bugzilla QA Contact for that component. </p></li><li class="P20" style="margin-left:0cm;"><p class="P20" style="margin-left:0.25cm;">List the steps for testing in the <span class="T2">Action</span> field</p></li><li class="P20" style="margin-left:0cm;"><p class="P20" style="margin-left:0.25cm;">Provide the expected outcomes in the <span class="T2">Expected Results</span> field</p></li><li class="P20" style="margin-left:0cm;"><p class="P20" style="margin-left:0.25cm;">Click the <span class="T2">Add</span> button.</p></li></ol><p class="P19">Because it is possible to have a single test case linked to multiple test plans, you can select which plans you wish to link your new case to. For now, we only have one so we will only see a single check box.  </p><p class="P19">First you need to write a short summary of your test case in the summary field. Notice the options for the other fields here as well. Descriptions of each can be found at the end of this document. The only required field here is the summary, however you may want to apply a default tester and a requirement at this time. Selecting a component at the right will automatically set the default tester based on the Bugzilla QA contact of that component. </p><p class="P19">Though not required at this point, you should supply your list of testing steps in the <span class="T2">Action </span><span class="T3">field and the list of expected outcomes in the </span><span class="T2">Expected Results</span><span class="T3"> field. To do this, click the </span><span class="T8">Edit Document</span><span class="T3"> link under the appropriate field. This will display a WYSIWYG editing area where you can type or paste your values. For tips on writing good test cases refer to D.L Runnels' </span><a href="http://www.stickyminds.com/getfile.asp?ot=XML&id=2136&fn=XDD2136filelistfilename1.pdfL"><span class="T9">How to Write Better Test Cases</span></a></p><p class="P21">From here you are taken to your test case. You will notice a link at the top giving you the option of creating another test case for this plan at this time.  </p><h5 class="Heading5"><a name="Adding_and_Removing_Components_and_Tags" />Adding and Removing Components and Tags</h5><p class="P21">Once again, you are offered an overview detailing the information for this test case at a glance. Below that you have the option of adding additional components to this test case. Because some testing is cross product, you have the option to add components from any product in Bugzilla to your test case. You can also remove a component by selecting it from the list and clicking the <span class="T2">Remove</span> button. </p><p class="P21">As with plans you also can apply tags to your test cases. This will be described later. </p><h5 class="P22"><a name="Viewing_Test_Case-Run_Results" />Viewing Test Case-Run Results</h5><p class="P21">Below this section will display a history of this test case in all runs and their status as to whether they passed or failed in those runs. You also will see a graph representing the percentage of pass/fail across all runs.  </p><h5 class="Heading5"><a name="Attaching_Files" />Attaching Files</h5><p class="Textbody">Just like test plans, you can attach files to your test cases. This works the same as for test plans. </p><h5 class="Heading5"><a name="Attaching_Bugs" />Attaching Bugs</h5><p class="Textbody">Unlike test plans, you have the option of attaching Bugzilla bugs to your test cases. Each test case can have multiple bugs attached. To attach a bug, enter the bug number in the field and click the <span class="T2">Commit</span><span class="T3"> button. A table of attached bugs is displayed.</span></p><h5 class="Heading5"><a name="Editing_Case_Fields" />Editing Case Fields</h5><p class="Textbody">As with test plans, you can update any of the values you entered while creating the plan. A history of these changes is also kept which you can view by clicking the <span class="T2">History</span><span class="T3"> button near the top of the test case. </span></p><h5 class="Heading5"><a name="Test_Case_Dependencies" />Test Case Dependencies</h5><p class="Textbody">Test cases have the concept of dependencies. Often when testing a set of test cases, the order in which you test is determined by what tests came before. It is also often the case that if a given test case fails, it prevents other test cases from being run successfully at all. You can represent those relationships here using the <span class="T2">blocks </span><span class="T3"> and </span><span class="T2">depends on</span><span class="T3"> fields. If this test potentially blocks the execution of another test case, you would enter that other test case's id in the </span><span class="T2">blocks</span><span class="T3"> field. If this test case requires some other test case be run first you can enter that other test case's id in the </span><span class="T2">depends on </span><span class="T3"> field. If a test case that blocks another test case fails, and both of them are in a single run, the blocked test case will automatically receive a status of </span><span class="T2">BLOCKED</span><span class="T3">.</span></p><h2 class="Heading2"><a name="Creating_Environments" />Creating Environments</h2><p class="Textbody">As mentioned above, environments are the <span class="T10">where </span><span class="T11">in testing. </span>In software testing in particular, this might include such things as which operating system and what hardware platform a test was conducted on.. Environments can be as broad or narrow as you define them. The most basic environment consists of an OS and platform chosen from Bugzilla's lists of these objects. However it can be much more complicated such as a suite of applications and other products. It could be a browser or other client package.</p><p class="Textbody">Creating an environment in Testopia requires two steps. The first involves defining a set of variables to be used in your environment. The second is to create the environment from the set of possible elements. </p><h3 class="Heading3"><a name="Environment_Administration" />Environment Administration</h3><p class="Textbody">When you first install Testopia, you must first define the set of environment variables that will be used to construct your environments.  To access these, click the <span class="T12">Environment Variables</span> link in the footer. The environment variables are arranged in a hierarchy of objects that is represented as a tree.  There are four major levels: Category, Element,  Property, and Property Values.</p><h4 class="Heading4"><a name="Categories" />Categories</h4><p class="Textbody">Environment Categories are similar to test case categories in that they provide a sorting mechanism for your environment elements. Each category is associated with a single product or in the special bucket labeled <span class="T10">–ALL-- . </span><span class="T11">The –All-- denotes all products, meaning it holds categories of elements that are not specific to any product.</span></p><p class="P23">When you first install Testopia you will see that the –ALL-- bucket contains two Categories, OS and Platform. Expanding these you will see that there are elements representing each of the OS and Platform values defined in Bugzilla. This is list is generated at the time you first install Testopia and is maintained separately from the Bugzilla lists thereafter.  </p><p class="P23">To create a category, right click on the product or –ALL-- and choose <span class="T10">Add Category</span>. You can then click on the newly create category in the tree which will pop up a form that allows you to edit the category name or change the product it is associated with.</p><h4 class="Heading4"><a name="Elements" />Elements</h4><p class="Textbody">Once you have a category defined for your product or the –ALL-- bucket, you can add elements to that category. Elements are the crux of what makes up your environment. To create an element, right click on the category you wish to add it to and choose <span class="T10">create element. </span></p><p class="P23">This will create an element labeled “New Element” which you can edit by clicking on it in the tree, or right clicking and choosing <span class="T10">Edit. </span></p><p class="P23">Elements can be nested inside other elements. To create a sub element, right click on the element and choose <span class="T10">Add Element</span>. You can edit this child element in the same manner as its parent. You can create as many levels of elements as you need to represent the complexity of your environment.</p><h4 class="Heading4"><a name="Properties" />Properties</h4><p class="Textbody">Properties describe your element. You can add properties to your elements by right clicking the element and choosing <span class="T10">Add Property</span>.  You can add as many properties to your elements as you need. Properties cannot be nested however.</p><p class="Textbody">To edit your property, click on it in the tree or right click on it and choose <span class="T10">Edit</span><span class="T11">.</span></p><h4 class="Heading4"><a name="Property_Values" />Property Values</h4><p class="Textbody">Once you have defined a property for your element, you will need to provide a list of values from which to select for you environment. Right click on your property and choose <span class="T10">Add Value </span><span class="T11">to create a value for your property. You can edit property values by right clicking and choosing Edit, or by clicking on one of the values under your property.</span></p><p class="P23">You can change the name or reorder the list of values from the form provided. You must hit Save Changes in order for you changes to be committed.  </p><h2 class="Heading2"><a name="Creating_Your_Environment" />Creating Your Environment</h2><p class="Textbody">Once you have set up the elements that will be used in your environment, you can now create environments with those elements. </p><p class="Textbody">Click the <span class="T12">New Environment</span><span class="T11"> link in the footer. </span></p><p class="P23">You are prompted to name your environment and choose a product for it. The product is used only for classification. It does not limit your choices of which elements can be placed in your environment. </p><p class="P23">Clicking <span class="T2">Create</span> will take you to the environment editor. Here you will see two trees, one representing your new environment and the other containing the list of variables from which to choose. Your environment will consist of the elements you defined earlier. To add an element, find it in the list and simply drag it onto your environment tree. The order does not matter. You can grab child elements at any level, but dragging an element with children will bring the children as well. </p><p class="P23">Once you have selected the elements for your environment, you can now select which of the property values apply to your environment. Expand the element and property and simply click the value you wish to use. It will have a star placed next to it to show your selection. </p><p class="P23">To remove an element, right click on it and choose R<span class="T10">emove</span>.</p><p class="P23">All changes to your tree are saved immediately.  </p><p class="P23"> </p><h1 class="Heading1"><a name="Creating_A_Test_Run" />Creating A Test Run</h1><h5 class="Heading5"><a name="Shortcut__E2_80_93_Creating_a_Test_Run" />Shortcut – Creating a Test Run</h5><ol style="margin-left:1.25cm;list-style-type:decimal; "><li class="P24" style="margin-left:0cm;"><p class="P24" style="margin-left:0.25cm;">Click the <span class="T5">Create a New Test Run</span><span class="T6"> link on your test plan or the </span><span class="T5">New Run</span><span class="T6"> link in the footer.</span></p></li><li class="P25" style="margin-left:0cm;"><p class="P25" style="margin-left:0.25cm;">Select which test cases to include. Use the filter to narrow your scope and the paging links to view more or fewer test cases. </p></li><li class="P25" style="margin-left:0cm;"><p class="P25" style="margin-left:0.25cm;">Enter a summary for this test run. </p></li><li class="P25" style="margin-left:0cm;"><p class="P25" style="margin-left:0.25cm;">Select a build from the <span class="T2">Build</span> list or type the name for a new one.</p></li><li class="P25" style="margin-left:0cm;"><p class="P25" style="margin-left:0.25cm;">Select an environment from the <span class="T2">Environment</span> list.</p></li><li class="P25" style="margin-left:0cm;"><p class="P25" style="margin-left:0.25cm;">Click <span class="T2">Add</span>.</p></li></ol><p class="Textbody">Once you have an environment to test in and some test cases to test, you are now ready to begin testing. You do this by creating a test run. The easiest way to do this is from within your test plan. Click the <span class="T5">Create a New Test Run</span><span class="T6"> link in the Test Runs section of your plan. You can also create a run by clicking the </span><span class="T5">New Run</span><span class="T6"> link in the footer and entering your plan number.</span></p><p class="P19">You will be presented with a list of CONFIRMED test cases from your test plan. You can select only the ones you want included or all of them at once using the select all link. If you want to limit the list to only include test cases that meet certain criteria, you can use the filter to narrow down the list. If you have a lot of test cases, you can use the paging features in the table of test cases to view more than the default 25 at a time. This is important as the only test cases that will be included are those that are visible on the screen and have a check in the box next to the case ID. If you do not know which test cases to apply, or do not wish to do so at this time, you can always add test cases later. </p><p class="P19">Next you need to provide a summary and select a build. If you forgot to create the build before, you can simply type the name of a new build in the <span class="T2">New</span> box and it will be added to the product. You can then edit the build later to add a milestone. Finally you need to select an environment. You do this by typing the name of your environment in the <span class="T2">Environment</span> box. As you type, a list of environments from your product that match will appear. You can also click the drop down arrow to view a list of all environments in your product. </p><p class="P19">Once you have completed the form, click the <span class="T2">Add</span> button to be taken to your new run.</p><h5 class="Heading5"><a name="Viewing_Your_Test_Run" />Viewing Your Test Run </h5><p class="Textbody">As with the other objects, you will notice an overview section at the top of your run. This contains similar information as found in the test case and test plan with one notable exception: the progress bar. This will show you a percentage of completed test cases with the colors representing statuses.  </p><p class="Textbody">Below this section you will see the Test Case Run Logs. This table represents the test cases you will be testing each row represents a single case-run. You will notice the expander arrows next to each row in the table. Click on this to expand the case-run form. Take note of the <span class="T2">Filter</span> and <span class="T2">Report</span> expanders as well. You can use the filter much like you did when choosing the test cases to include in your run, except this provides more options for narrowing the list of case runs visible at a time.</p><h5 class="Heading5"><a name="Adding_Cases" />Adding Cases</h5><p class="Textbody">As mentioned earlier, you can add test cases to your run by clicking the <span class="T2">Add Cases</span> button below the case-run table. This will take you back to the list of test cases you saw when creating your test run excluding any test cases in your plan that are already in this run. </p><h5 class="Heading5"><a name="Editing_Test_Run_Fields" />Editing Test Run Fields</h5><p class="Textbody">As with test cases and test plans, you can update any of the values you applied when you created the test run in the form at the bottom of the page. Note that changing the build and environment will not affect the case-runs already in the run but it will apply to any test cases added after the change. Changes to these fields are tracked and a history is kept much the same way as with test plans and test cases. Clicking the <span class="T2">History</span> button will display this history.</p><h1 class="Heading1"><a name="Running_Your_Tests" />Running Your Tests</h1><p class="Textbody">As a tester, you will likely spend most of your time running tests and recording the results from the test run page. When you first open a run the test cases are represented in a table as case-runs. Clicking the expander arrow next to each test case will expand the test case-run form. Your run may included only those test cases that are required for a specific testing priority, or for a given tester. Or, your test run may include a larger set of test cases that represents an entire test cycle. On a given day, you may only want to test the highest priority test cases and skip lower priorities for later in the process. Or you may just want to run regression tests on the set of previously failed test cases. You can do this using the filters.  </p><h5 class="Heading5"><a name="Filtering_Your_Test_Cases_in_a_Run" />Filtering Your Test Cases in a Run</h5><p class="Textbody">Expand the <span class="T2">Filter </span><span class="T3">by clicking the expander triangle next to the filter. You will notice a number of options for filtering your test cases including:</span></p><ul style="margin-left:1.25cm;"><li class="P26" style="margin-left:0cm;"><p class="P26" style="margin-left:0.25cm;">Status </p></li><li class="P26" style="margin-left:0cm;"><p class="P26" style="margin-left:0.25cm;">Category </p></li><li class="P26" style="margin-left:0cm;"><p class="P26" style="margin-left:0.25cm;">Build </p></li><li class="P26" style="margin-left:0cm;"><p class="P26" style="margin-left:0.25cm;">Environments </p></li><li class="P26" style="margin-left:0cm;"><p class="P26" style="margin-left:0.25cm;">Priorities </p></li><li class="P26" style="margin-left:0cm;"><p class="P26" style="margin-left:0.25cm;">Components </p></li><li class="P26" style="margin-left:0cm;"><p class="P26" style="margin-left:0.25cm;">Assignee </p></li><li class="P26" style="margin-left:0cm;"><p class="P26" style="margin-left:0.25cm;">Tags </p></li><li class="P26" style="margin-left:0cm;"><p class="P26" style="margin-left:0.25cm;">Case summary. </p></li></ul><p class="P27">Testopia remember your filters so that the next time you view this run it will apply the last filter you used. To clear the filter and return to the full list click the <span class="T2">Clear</span> button.</p><h5 class="Heading5"><a name="Sorting_Test_Cases" />Sorting Test Cases</h5><p class="Textbody">You can sort the list of test cases by clicking on any of the table column headings. You can also sort on the summary by clicking any of the <span class="T2">Summary </span><span class="T3">field headers. If you wish to create a custom sort order for your test cases, type a number to index on in the </span><span class="T2">Index</span><span class="T3"> fields and click </span><span class="T2">Change</span><span class="T3">. Sorting on this field will then display your cases in ascending order of the indexes you supplied.</span></p><p class="P27">Currently Testopia only supports ascending sorts. Support for descending sorts are planned for future releases. </p><h5 class="Heading5"><a name="Passing_and_Failing_Test_Cases" />Passing and Failing Test Cases</h5><p class="Textbody">Once you are ready to begin testing, expand the first test case in your list and read the <span class="T2">Action</span> and <span class="T2">Expected Results</span><span class="T3"> for this case. You can then perform the test. If the expected outcome is achieved you can pass the test by clicking the green check or </span><span class="T2">PASSED</span><span class="T3"> button: </span><span class="T3"><img width="18" height="18" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr3" /></span><span class="T3">.</span></p><div class="P27">If the results were not expected or an error occurred, you can fail the test by clicking the red X or <span class="T2">FAILED</span> button: <img width="18" height="18" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr3" />.</div><p class="P27">Explanations of the other statuses appear at the end of this document. </p><h5 class="Heading5"><a name="Adding_Notes" />Adding Notes</h5><p class="P27">Updating the status will add a line to the notes field with the time of the change and who made it. You can add additional notes by typing them in the <span class="T2">Add Note</span> field and clicking <span class="T2">Append Note</span>.</p><h5 class="Heading5"><a name="Attaching_Bugs" />Attaching Bugs</h5><p class="P27">If a test case has failed, or for any other reason, you may want to attach a bug to this test. You can attach existing bugs or create new ones. To attach an existing bug, type the bug number in the box and click <span class="T2">Attach Bug</span>. The bug will be displayed in the <span class="T2">Bugs Detected</span> field. If you wish to log a new bug, click the <span class="T2">New </span>button. You will be taken to the enter bug page with information about the test case already provided in the form. You can now provide any additional details and submit the bug. This is done in a new window so that you do not lose your place in testing. To return to your run, close the new window.</p><h5 class="Heading5"><a name="Reassigning_Tests" />Reassigning Tests</h5><p class="Textbody">The assignee field is used to help testers track their own test cases. If you wish to change the assignee of a particular test case, you can do so by entering their Bugzilla user name in the assignee field and clicking <span class="T2">Assign</span>. Updating test cases is not limited by assignee. Anyone with rights to edit the case-run can pass or fail the test. If a test case is closed (PASSED, FAILED, or BLOCKED), the name of the person who performed the action is captured in the <span class="T2">Tested By</span> field. </p><h5 class="Heading5"><a name="Changing_Build_or_Environment_on_a_Test_Case" />Changing Build or Environment on a Test Case</h5><p class="Textbody">Testopia is designed to be flexible. Testing organizations vary greatly on modes and methodologies. For this purpose, test runs were designed to allow the greatest flexibility possible as to how tests are run. Some groups will create a single test run for each build and environment combination they encounter. Others will want a monolithic test run that represents an entire product release. In this case you can update the build and environments on individual test cases in your run. Each time you do, the appropriate case-run record is returned, if one exists, or is created if it does not. A note is appended with the time of the change as well as who made the change. If a new record is created, the status is set to IDLE and you are ready to test with your new build or environment selection. For any given run, the case-runs displayed are the last ones that were updated. In essence however, the case-run table represents a two dimensional view of a three dimensional object. Changing the build or environment bring the corresponding record to the forefront. This should be kept in mind when running reports on case runs as what you see in a run is only the surface of what data may be included. </p><h5 class="Heading5"><a name="Classic_View" />Classic View</h5><p class="Textbody">The test run page uses Javascript and AJAX technology to provide a more seamless user experience while running your tests. If you have trouble with the forms or would like a simpler view of your case runs, you may use the <span class="T2">classic interface</span>.  This provides a view of a single test case-run at a time. From here you can update any of the fields mentioned above and also attach files to the test case. </p><h5 class="Heading5"><a name="Deleting_Case-Runs" />Deleting Case-Runs</h5><p class="Textbody">Sometimes you might mistakingly add a test case to a run that does not belong or you may select an invalid build and environment combination. In these cases it is easiest to remove them by deleting the case-run all together. You must have the proper permissions to do so and the administrator needs to allow this in the parameters. To delete a single case run, click the <span class="T5">Delete</span><span class="T6"> link on the standard form, or click the </span><span class="T7">Delete</span><span class="T6"> button on the classic form. You will be prompted to confirm the action before the record is removed.</span></p><h5 class="Heading5"><a name="Updating_Multiple_Cases_at_Once" />Updating Multiple Cases at Once</h5><p class="Textbody">You can update a group of case-runs at once by clicking the <span class="T5">Update Multiple</span><span class="T6"> link below the table of cases. From here you can change the status, attach bugs, update build or environment attributes, and even delete a whole list at once. </span></p><h5 class="Heading5"><a name="Wrapping_Up" />Wrapping Up</h5><p class="Textbody">Once all tests in a run are complete, you should set the status on the run to STOPPED. This will prevent further updates to case-runs in the run. </p><h1 class="Heading1"><a name="Getting_Around_Testopia" />Getting Around Testopia</h1><p class="Textbody">Navigating Testopia is done using the links in the Bugzilla footer. You can use the QuickSearch box to quickly jump to any case, run, plan or environment. To do so simply type the object's ID number, or part of the name or summary, prefixed by a type identifier. Following is the list of identifiers: </p><div style="text-align:left"><table border="0" cellspacing="0" cellpadding="0" class="Table1"><colgroup><col width="256" /><col width="256" /></colgroup><tr><td style="text-align:left;width:2.3083in; " class="Table1A1"><p class="TableHeading">Object </p></td><td style="text-align:left;width:2.3083in; " class="Table1B1"><p class="TableHeading">Prefix </p></td></tr><tr><td style="text-align:left;width:2.3083in; " class="Table1A2"><p class="P28"><span class="T13">TEST CASE</span> </p></td><td style="text-align:left;width:2.3083in; " class="Table1B2"><p class="P29">(Optional for cases)  </p><ul style="margin-left:1.25cm;"><li class="P30" style="margin-left:0cm;"><p class="P30" style="margin-left:0cm;">case  </p></li><li class="P30" style="margin-left:0cm;"><p class="P30" style="margin-left:0cm;">TC  </p></li><li class="P31" style="margin-left:0cm;"><p class="P31" style="margin-left:0cm;">c  </p></li></ul></td></tr><tr><td style="text-align:left;width:2.3083in; " class="Table1A2"><p class="P28"><span class="T13">TEST PLAN</span> </p></td><td style="text-align:left;width:2.3083in; " class="Table1B2"><ul style="margin-left:1.25cm;"><li class="P32" style="margin-left:0cm;"><p class="P32" style="margin-left:0cm;">plan  </p></li><li class="P32" style="margin-left:0cm;"><p class="P32" style="margin-left:0cm;">TP  </p></li><li class="P33" style="margin-left:0cm;"><p class="P33" style="margin-left:0cm;">p  </p></li></ul></td></tr><tr><td style="text-align:left;width:2.3083in; " class="Table1A2"><p class="P28"><span class="T13">TEST RUN</span> </p></td><td style="text-align:left;width:2.3083in; " class="Table1B2"><ul style="margin-left:1.25cm;"><li class="P34" style="margin-left:0cm;"><p class="P34" style="margin-left:0cm;">run  </p></li><li class="P34" style="margin-left:0cm;"><p class="P34" style="margin-left:0cm;">TR  </p></li><li class="P35" style="margin-left:0cm;"><p class="P35" style="margin-left:0cm;">r  </p></li></ul></td></tr><tr><td style="text-align:left;width:2.3083in; " class="Table1A2"><p class="P28"><span class="T13">TEST RUN ENVIRONMENT</span> </p></td><td style="text-align:left;width:2.3083in; " class="Table1B2"><ul style="margin-left:1.25cm;"><li class="P36" style="margin-left:0cm;"><p class="P36" style="margin-left:0cm;">env  </p></li><li class="P36" style="margin-left:0cm;"><p class="P36" style="margin-left:0cm;">TE  </p></li><li class="P37" style="margin-left:0cm;"><p class="P37" style="margin-left:0cm;">e  </p></li></ul></td></tr><tr><td style="text-align:left;width:2.3083in; " class="Table1A2"><p class="P28"><span class="T13">TEST CASE-RUN</span> </p></td><td style="text-align:left;width:2.3083in; " class="Table1B2"><ul style="margin-left:1.25cm;"><li class="P38" style="margin-left:0cm;"><p class="P38" style="margin-left:0cm;">caserun  </p></li><li class="P38" style="margin-left:0cm;"><p class="P38" style="margin-left:0cm;">TCR  </p></li><li class="P39" style="margin-left:0cm;"><p class="P39" style="margin-left:0cm;">cr  </p></li></ul></td></tr><tr><td style="text-align:left;width:2.3083in; " class="Table1A2"><p class="P28"><span class="T13">TAGS</span> </p></td><td style="text-align:left;width:2.3083in; " class="Table1B2"><ul style="margin-left:1.25cm;"><li class="P40" style="margin-left:0cm;"><p class="P40" style="margin-left:0cm;">tag  </p></li></ul></td></tr></table></div><p class="Textbody"><br />So for example, to find test run 45 you could type <span class="T10">r 45</span> or <span class="T10">tr 45</span> or <span class="T10">run 45.</span></p><p class="P23">To find environments with 'Linux' in the name you could type <span class="T10">e:linux </span>or <span class="T10">TE Linux</span>.</p><h2 class="P41"><a name="Searching" />Searching</h2><p class="P23">Bugzilla has very powerful searching capabilities. Testopia has applied the Bugzilla search engine to searching for test cases, plans, runs, environments, and case-runs. Each of these has its own set of search parameters that can be used to narrow the scope of a search. To perform a search, click the <span class="T5">S</span><span class="T8">earch</span><span class="T5"> </span>link in the footer and then click the tab representing the object you wish to search from.. From here you select the parameters you wish to query on and click the <span class="T2">Submit</span> button. This will take you to the corresponding list page for that object.</p><h5 class="Heading5"><a name="Sorting_Search_Results" />Sorting Search Results</h5><p class="P23">Search results are paged and sortable. To sort, click the column header of the corresponding field you wish to sort on. This will return the list in ascending order. Descending sorts are not currently supported but are planned. </p><h5 class="Heading5"><a name="Paging" />Paging</h5><p class="P23">By default, Testopia will display 25 records at a time. You can use the links at the bottom of the list to navigate from one page of search results to another or use the <span class="T2">Jump To Page</span> button to jump directly to a page of results. You change the number of records you view at a time by selecting an option from the page size drop down. Lastly, if there are not too many records, you can opt to view all of the records at once using the <span class="T5">View All</span><span class="T6"> link. </span></p><h5 class="Heading5"><a name="Batch_Processing" />Batch Processing</h5><p class="Textbody">From the search results page of cases, runs, plans, and case-runs, you can update a batch of objects at once. Do this by selecting which objects to update by checking its box and then updating the fields at the bottom of the form. For example, with test cases, you can apply changes to virtually any fields as well as add these cases to test runs or link them to a set of plans. You can also export test cases as CSV or XML. More on this later. </p><h5 class="Heading5"><a name="Saved_Searches" />Saved Searches</h5><p class="Textbody">Like Bugzilla, Testopia offers the user the opportunity to save a search for later retrieval. You do this by typing a name in the <span class="T10">save search as</span> field and clicking the <span class="T2">Save Search</span> button. Saved searches appear below the other Testopia links in the footer. You can remove a saved search by running it and clicking the <span class="T5">Delete saved query</span><span class="T6"> link at the bottom of the search results page.</span></p><h2 class="Heading2"><a name="Reporting" />Reporting</h2><p class="Textbody">As with searching, Testopia has modified the Bugzilla reporting engine to provide basic tabular reports based on a set of search criteria. These reports can be run on test cases, runs, plans, and case-runs. To run a report, click the <span class="T5">Reports</span> link in the footer and click the tab corresponding to the object you wish to report on. Select the fields for the horizontal and vertical axes of the report  and then select your search criteria. The default report is in the form of tabular data. You can then switch between bar and line graph modes or export the data as a CSV (comma separated values) file which can be opened in a spreadsheet.</p><p class="Textbody">In addition to these generic reports, certain objects have other reports associated with them. These are accessed from the object pages directly.  </p><h5 class="Heading5"><a name="Plan_Reports" />Plan Reports</h5><h9 class="P42"><a name="Build_Coverage_Report" />Build Coverage Report</h9><p class="Textbody">This Report is designed to show builds that are not being covered in testing. It breaks down each run, displaying the status of the latest case-run for a given build. If there are builds that are not being covered, no status will display for any runs for that build. This report is not very practical for plans with very large numbers of test cases. </p><h9 class="P42"><a name="Top_Bugs" />Top Bugs</h9><p class="Textbody">This report displays the bugs found in test cases within the test plan ordered by the bugs attached to the most test cases. In other words, which bugs are failing the most test cases. </p><h9 class="P42"><a name="Bugs_Found_In_This_Plan" />Bugs Found In This Plan</h9><p class="Textbody">This generates a bug list of all the bugs attached to any case in this plan. </p><h9 class="P42"><a name="Printable_Percentage_Report" />Printable Percentage Report</h9><p class="Textbody">This report displays the pass/fail percentages of the plan by run, build, and environment. </p><h5 class="Heading5"><a name="Test_Case_Reports" />Test Case Reports</h5><h9 class="P42"><a name="Estimated_vs_Actual_Time" />Estimated vs Actual Time</h9><p class="Textbody">Test cases can have a time estimate associated with them. This can then be used in conjunction with the case-runs for that case to determine the actual running time. To do this, test case-runs must be placed in the RUNNING state when a test is started. This then starts the stopwatch so to speak for that case in that run. When a case is passed or failed the difference of the two times is calculated. The average of all case-runs in all runs for this case is then used to calculate this report. </p><h9 class="P42"><a name="Historic_Status_Breakdown" />Historic Status Breakdown</h9><p class="Textbody">This pie chart represents the percentage of all case-runs for this case divided by status. </p><h2 class="Heading2"><a name="Cloning" />Cloning</h2><p class="Textbody">Often it is desirable to copy test information for use in a new development cycle. Testopia allows you to clone test cases, test run, and whole test plans, allowing you more efficiently move from one product release to another. Cloning is performed by clicking the <span class="T2">Clone</span> button on the object you wish to clone.</p><h5 class="Heading5"><a name="Cloning_Test_Plans" />Cloning Test Plans</h5><p class="Textbody">To clone a test plan: </p><ol style="margin-left:1.25cm;list-style-type:decimal; "><li class="P43" style="margin-left:0cm;"><p class="P43" style="margin-left:0.25cm;">Navigate to the plan you wish to clone and click the <span class="T2">Clone</span> button.</p></li><li class="P43" style="margin-left:0cm;"><p class="P43" style="margin-left:0.25cm;">Enter a name for the new plan or accept the default. </p></li><li class="P43" style="margin-left:0cm;"><p class="P43" style="margin-left:0.25cm;">Choose a product and product version to clone to. </p></li><li class="P43" style="margin-left:0cm;"><p class="P43" style="margin-left:0.25cm;">Select the clone options </p></li><li class="P43" style="margin-left:0cm;"><p class="P43" style="margin-left:0.25cm;">Click <span class="T2">Clone</span>.</p></li></ol><p class="Textbody">When cloning a test plan, you have the option to copy attachments, the plan document, any tags, and the plans access control list. You have the option of either copying the test cases, or creating links to the existing test cases. Copying the test cases will produce a new set of test cases with new Ids whereas linking will allow you to make modifications to your test cases and have then reflected everywhere.  </p><p class="Textbody">If you choose to copy the test cases, you are also given the option to apply yourself as the author of the new cases. </p><h5 class="Heading5"><a name="Cloning_Test_Cases" />Cloning Test Cases</h5><p class="Textbody">To clone a test case: </p><ol style="margin-left:1.25cm;list-style-type:decimal; "><li class="P44" style="margin-left:0cm;"><p class="P44" style="margin-left:0.25cm;">Navigate to the test case you wish to clone and click the <span class="T2">Clone</span> button.</p></li><li class="P44" style="margin-left:0cm;"><p class="P44" style="margin-left:0.25cm;">Select a clone method. </p></li><li class="P44" style="margin-left:0cm;"><p class="P44" style="margin-left:0.25cm;">If copying, check the box to copy within the plans already associated </p><ol style="margin-left:0.75cm;list-style-type:decimal; "><li class="P44" style="margin-left:0cm;"><p class="P44" style="margin-left:0.25cm;">Enter the plan ids of any additional test plans you wish to copy to </p></li><li class="P44" style="margin-left:0cm;"><p class="P44" style="margin-left:0.25cm;">Select clone options </p></li></ol></li><li class="P44" style="margin-left:0cm;"><p class="P44" style="margin-left:0.25cm;">If linking, enter the ids of any plans you with to link this case to. </p></li></ol><p class="Textbody">As with cloning plans, you have the option of making yourself the author of the copy. You can choose to copy the attachments, tags, components, and document. </p><h5 class="Heading5"><a name="Cloning_a_Run" />Cloning a Run</h5><p class="Textbody">To clone a test run: </p><ol style="margin-left:1.25cm;list-style-type:decimal; "><li class="P45" style="margin-left:0cm;"><p class="P45" style="margin-left:0.25cm;">Navigate to the test run you wish to clone and click the <span class="T2">Clone</span> button.</p></li><li class="P45" style="margin-left:0cm;"><p class="P45" style="margin-left:0.25cm;">Enter a summary for the copy. </p></li><li class="P45" style="margin-left:0cm;"><p class="P45" style="margin-left:0.25cm;">Choose a plan within the product to clone to. </p></li><li class="P45" style="margin-left:0cm;"><p class="P45" style="margin-left:0.25cm;">Choose a product version and build. </p></li><li class="P45" style="margin-left:0cm;"><p class="P45" style="margin-left:0.25cm;">Select clone options. </p></li><li class="P45" style="margin-left:0cm;"><p class="P45" style="margin-left:0.25cm;">Click the <span class="T2">Clone</span> button.</p></li></ol><p class="Textbody">In addition to the options to copy the tags and making yourself the manager of the cloned run, you have the option of copying over the test cases. You can limit the clone to only include test cases of a certain status. For instance you may want to only include cases that failed in the cloned run. </p><h2 class="Heading2"><a name="Deleting" />Deleting</h2><p class="Textbody">It is possible to delete test cases, plans, runs and case-runs. To delete, you must have the allow-test-deletion parameter turned on and have the proper rights. Bugzilla admins (members of the admin group) can delete regardless of the parameter settings and have rights to delete anything in the Testopia system. </p><p class="Textbody">To delete an object, click the Delete button on that objects page. You will be taken to a confirmation screen detailing what other objects will be deleted, if any, as a result of deleting this object. To confirm, click the <span class="T2">Delete This Test</span> button. Deleting in Testopia is irreversible. If you wish to simply hide an object instead you can do so using the methods outlined below:</p><h9 class="Heading9"><a name="Test_Cases" />Test Cases</h9><p class="Textbody">To hide a test case from search results, place it in the DISABLED status.  </p><h9 class="Heading9"><a name="Test_Plans" />Test Plans</h9><p class="Textbody">To hide test plans from search results, you can archive them by clicking the <span class="T2">Archive</span> button on the plan page. </p><h9 class="Heading9"><a name="Test_Runs" />Test Runs</h9><p class="Textbody">To hide test runs, place them in the STOPPED state.  </p><h1 class="Heading1"><a name="Importing_and_Exporting" />Importing and Exporting</h1><p class="Textbody">Test cases can be exported as either XML or in Comma Separated Value formats. To export a test cases, click the appropriate format button under the <span class="T2">Export</span> section found at the bottom of the test plan page, the test case page, or the case search results page.</p><p class="Textbody">Exporting in CSV allows you to open you test cases in a spreadsheet where you can manipulate the values and generate custom reports. </p><p class="Textbody">Exporting as XML allows you to import your test cases into other Testopia installations or into custom database applications. </p><h5 class="Heading5"><a name="Importing_Test_Cases" />Importing Test Cases</h5><p class="Textbody">You can import test cases from other Testopia installations or from other test case management systems using the tr_importxml.pl script. In order to be eligible for import, your exported test cases must first comply with the Testopia document type definition found in the testopia.dtd file. This can be done by using XML stylesheets to transform the XML to match the DTD. This is outside the scope of this manual, but information on this subject is readily available via the web. </p><p class="Textbody">To import test cases, run the tr_importxml.pl script with the path to your test case XML file. More details can be found on the project wiki at </p><p class="Textbody">        <a href="http://wiki.mozilla.org/Testopia:Documentation:XMLImport">http://wiki.mozilla.org/Testopia:Documentation:XMLImport</a> </p><h1 class="Heading1"><a name="Testopia_Security" />Testopia Security</h1><p class="Textbody">Like Bugzilla, Testopia provides several methods for restricting access to test data. Because test data is often more forward looking than bug reports, Testopia requires that users log in to see any test objects. There are several layers of security that a user must pass through to view those objects however. These are determined in part by Bugzilla group membership, but mostly by the test plan access control list. </p><h2 class="Heading2"><a name="The_Testers_Group" />The Testers Group</h2><p class="Textbody">When you first install Testopia, it will create a Bugzilla group called 'Testers'. Members of this group have access to view and update all test plans and their associated objects such as cases and runs. Membership in this group is required in order to create new test plans, clone test plans, and  administer environments. If the <span class="T2">testopia-allow-group-member-deletes</span><span class="T3"> parameter is on, members of this group will also have rights to delete any object in Testopia. Membership in this group is checked first and supersedes the access control lists for individual plans.</span></p><h2 class="Heading2"><a name="Test_Plan_Access_Control_Lists" />Test Plan Access Control Lists</h2><p class="Textbody">In addition to the Testers group, each test plan maintains it's own access control list which can be used to allow or deny access to test plans based on email domain or explicit inclusion. Each test plan has its own access list. For a user that is not in the Testers group to access a test plan or any associated cases, runs, or case runs, he or she must be included on the list either by matching a regular expression, or explicit inclusion. To edit the access control list for a plan, navigate to the test plan and click the <span class="T5">Edit Access Controls</span><span class="T6"> link in the over view section.</span></p><h5 class="Heading5"><a name="User_Regular_Expression" />User Regular Expression</h5><p class="Textbody">Users with login names (email addresses) matching a supplied regular expression can be given rights to a particular test plan. The regular expression should be crafted with care to prevent unintentional access to the test plan by outsiders. For example, to grant access to your test plan by all users at acme.com you would supply the following regular expression: </p><p class="Textbody">        <span class="T14">^.*@acme\.com$</span></p><p class="Textbody">To provide access to all users at acme.com and foo.org you would use: </p><p class="Textbody">        <span class="T14">^.*@(acme\.com|foo\.org)$</span></p><p class="Textbody">To provide public access (all users) you would use: </p><p class="Textbody">        <span class="T14">.*</span></p><p class="Textbody">An empty regular expression does not match anything meaning leaving this field blank will mean the test plan will rely solely on explicit membership. </p><p class="Textbody">Once you have supplied the regular expression, you must select the access level.  </p><h5 class="Heading5"><a name="Explicit_Inclusion" />Explicit Inclusion</h5><p class="Textbody">If you do not wish to grant access to a whole group at once, you can add individual users by entering their Bugzilla login in the field provided and clicking the <span class="T2">Add User</span> button. This allows the most fine grained control as to who can do what within your test plan. However, if you add a user that matches the regular expression they will have the greater of the two rights.</p><h2 class="Heading2"><a name="Access_Rights" />Access Rights</h2><p class="Textbody">Users on the test plan access control lists can be granted rights to read, write, delete, and admin test plans and their associated objects. </p><h5 class="Heading5"><a name="Read" />Read </h5><p class="ListContents">Allows viewing rights to the plan and all test cases, test runs, and test case-runs associated with it. Test cases linked to more than one plan will be visible to users in both plans. </p><h5 class="Heading5"><a name="Write" />Write </h5><p class="ListContents">Implies Read. Allows rights to modify the plan and associated cases, runs, and case-runs.  </p><p class="ListContents">Test cases linked to more than one plan will not be writable unless the user has write rights in all plans. </p><h5 class="Heading5"><a name="Delete" />Delete </h5><p class="ListContents">Implies Read and Write. Allows rights to delete the plan and associated cases, runs, and case-runs. Test cases linked to more than one plan will not be deletable unless the user has delete rights in all plans. </p><h5 class="Heading5"><a name="Admin" />Admin </h5><p class="P46">Implies Read, Write, and Delete. Allows rights to modify the plan's access controls.  </p><h1 class="Heading1"><a name="Tags" />Tags</h1><p class="Textbody">Testopia utilizes a tagging mechanism to help organize test objects. Unlike the traditional method of placing things into virtual folders, tags allow a many-to-many relationship by allowing multiple objects to have the same tag while allowing each object to have multiple tags. </p><p class="Textbody">Tags are a novel approach to categorizing objects. They have become very popular with numerous web popular web tools and have met with much success. Tags are similar to keywords in Bugzilla but do not require an administrator to create. The act of tagging an object creates the tag which can then be used anywhere. </p><p class="Textbody">The idea behind tags is that each user can categorize each item to his or her own liking without destroying other users' categorizations. Test cases, plans, and runs can all have tags associated with them. Though tags are not directly associated with a product, Testopia uses a smart typing approach to recommend tags based on relationships to other objects within the same product. </p><p class="Textbody">Tags have a knowledge of who added them to a particular object as well, allowing users to manage the tags that they have created. </p><h5 class="Heading5"><a name="Adding_Tags_to_an_Object" />Adding Tags to an Object</h5><p class="Textbody">To add a tag to a test case, run, or plan, begin typing in the <span class="T2">Tag</span> field. If what you type matches any other tags that others have applied within the product associated with this object, it will appear up in the drop down list. You can then either select a tag that matches or type your own new tag. Clicking the Add button will then attach your tag to the object.</p><h5 class="Heading5"><a name="Viewing_Tags" />Viewing Tags</h5><p class="Textbody">To see a list of your tags click the <span class="T5">Tags</span><span class="T6"> link in the header above the tags section in any object. From this screen you have the option to look up tags based on product or entered by another user.</span></p><h1 class="Heading1"><a name="Using_Testopia_With_Automated_Test_Scripts" />Using Testopia With Automated Test Scripts</h1><p class="Textbody">Testopia provides a web service XML RPC that utilizes the SOAP protocol to interact with Testopia objects via an automated script. Documentation for this feature is available on the project wiki at <a href="http://wiki.mozilla.org/Testopia:Documentation:XMLRPC">http://wiki.mozilla.org/Testopia:Documentation:XMLRPC</a> </p><h1 class="Heading1"><a name="Field_Descriptions" />Field Descriptions</h1><h3 class="Heading3"><a name="Test_Plans" />Test Plans</h3><p class="Definition">Name </p><p class="List1End">        Short descriptor for a test plan. Does not need to be unique.</p><p class="Definition">Product </p><p class="List1End">        Bugzilla product that this plan is associated with.</p><p class="Definition">Product Version </p><p class="List1End">        The Bugzilla product version. Used as the default for new runs.</p><p class="Definition">Type </p><p class="List1End">        The testing type for this test plan. Possible values include system, integration, unit, functional and acceptance. This list is modifiable by the Bugzilla admins from the Testopai Admin link.</p><p class="Definition">Archive </p><p class="List1End">        If this bit is set to true, the plan will be archived and not display in searches by default.To archive a plan click the <span class="T2">Archive</span> button. To unarchive click <span class="T2">Unarchive</span>.</p><p class="Definition">Plan Document </p><p class="List1End">        This is document that spells out the type of testing and testing methods used for this plan.</p><p class="Definition">Tags </p><p class="List1End">        See tags description above.</p><h3 class="Heading3"><a name="Test_Cases" />Test Cases</h3><p class="Definition">Summary </p><p class="List1End">        A short description of the test case.</p><p class="Definition">Default Tester </p><p class="List1End">        The person who will be assigned to this test case when a new run is created in which this case is included.</p><p class="Definition">Alias </p><p class="List1End">        A unique string that can be used to identify this test case. This can be used in place of the test case ID but must be globally unique to the database.</p><p class="Definition">Requirement </p><p class="List1End">        The requirement number or URL to a document containing the requirement this test case is designed to test.</p><p class="Definition">Status </p><p class="List1End">        Test case status determines whether this test case can be included in new test runs.</p><ul style="margin-left:1cm;"><li class="P47" style="margin-left:0cm;"><p class="P47" style="margin-left:0.25cm;"><span class="T2">PROPOSED</span> – This test case is a work in progress and has not been reviewed for accuracy. It is therefore not ready to be included in test runs.</p></li><li class="P47" style="margin-left:0cm;"><p class="P47" style="margin-left:0.25cm;"><span class="T2">CONFIRMED</span> – Test case has passed review and is ready to be included in future test runs. Only test cases with this status can be included in new test runs.</p></li><li class="P47" style="margin-left:0cm;"><p class="P47" style="margin-left:0.25cm;"><span class="T2">DISABLED</span> – This test case is no longer applicable to current testing.</p></li></ul><p class="Definition">Priority </p><p class="List1End">        This denotes the level of testing. Higher priority test cases should be run first and more often then lower priorities.</p><p class="Definition">Category </p><p class="List1End">        The product category that this test case belongs to. Each product has a default category. Additional categories can be added which can be used to further classify your test cases. Because this is a product attribute, this list will be the same for all plans in a given product.</p><p class="Definition">Estimated Time </p><p class="List1End">        The estimated time in HH:MM:SS format that this test case should take to complete.</p><p class="Definition">Add To Runs </p><p class="List1End">        Entering a run ID here will include this test case in a test run if it is not already included. You can also enter a comma separated list of run numbers to add to multiple runs at once.</p><p class="Definition">Automatic </p><p class="List1End">        Test cases can be either Automatic or Manual. Automatic test cases are run by a script while manual test cases are performed by a tester.</p><p class="Definition">Script </p><p class="List1End">        If this is an automatic test case, you can enter the name of the script that runs this test case. TESTOPIA DOES NOT RUN YOUR SCRIPT FOR YOU. You must run your script and capture the results to send to Testopia. You can use the XMLRPC interface to have your script update the test case-run results automatically.</p><p class="Definition">Arguments </p><p class="List1End">        If there are specific arguments sent to the script that apply to this test case, they can be stored here. TESTOPIA DOES NOT RUN YOUR SCRIPTS FOR YOU. This field is only used to store the information. The XMLRPC can be used by your script to capture this from the test case.</p><p class="Definition">Attach Bugs </p><p class="List1End">        You can attach bugs to your test cases. This field accepts a comma separated list of bug numbers.</p><p class="Definition">Depends on </p><p class="List1End">        If this test case requires other test cases be run before this one, their case numbers should appear here. Enter a list of comma separated case numbers to add dependencies.</p><p class="Definition">Blocks </p><p class="List1End">        If this test case prevents others from being run their ID numbers will appear here. This field accepts a comma separated list of case numbers.</p><p class="Definition">Set Up </p><p class="List1End">        This field details the steps that are necessary to prepare to run a test</p><p class="Definition">Break Down </p><p class="List1End">        This field details the steps required to reset the test case to a known state in preparation for the next run.</p><p class="Definition">Action </p><p class="List1End">        This field lists the steps of testing. </p><p class="Definition">Expected Results </p><p class="List1End">        This details the expected outcomes of a test. </p><p class="Definition">Component </p><p class="List1End">        You can associate Bugzilla components to your test cases. Because testing might be across multiple components and products, you can add multiple components from any product. Selecting the product from the drop down list displays the components available. Click Add to associate the selected component with the test case.</p><p class="Definition">Tags </p><p class="List1End">        See above for a description.</p><h3 class="Heading3"><a name="Test_Runs" />Test Runs</h3><p class="Definition">Product Version </p><p class="List1End">        This is the Bugzilla product version that this test run is testing.</p><p class="Definition">Plan Version </p><p class="List1End">        This is the version of the plan document that this test run is using.</p><p class="Definition">Manager </p><p class="List1End">        The user in charge of this test run</p><p class="Definition">Build </p><p class="List1End">        The default product build. This is applied to test cases added to the run.</p><p class="Definition">Status </p><p class="List1End">        Determines if this test run is active. </p><ul style="margin-left:1cm;"><li class="P48" style="margin-left:0cm;"><p class="P48" style="margin-left:0.25cm;">RUNNING – This test run is still active. Test cases in this run can be updated. </p></li><li class="P48" style="margin-left:0cm;"><p class="P48" style="margin-left:0.25cm;">STOPPED – Test cases in a stopped run cannot be modified. </p></li></ul><p class="Definition">Environment </p><p class="List1End">        This is the environment in use for this test run. Test cases added to this run will receive this environment. Environments must be created using the Environment editor before a test run can be created.</p><p class="Definition">Summary </p><p class="List1End">        A short description of this test run</p><p class="Definition">Notes </p><p class="List1End">        This field is a place to make notes and observations about this run.</p><h3 class="Heading3"><a name="Test_Case-Runs" />Test Case-Runs</h3><p class="Definition">Status </p><p class="List1End">        The status of a case-run determined by whether it passed or failed or is in some other state.</p><div class="P49"><img width="30" height="30" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr4" /> - <span class="T2">IDLE</span>: This is the default status. Case has not yet been examined.</div><div class="P49"><img width="30" height="30" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr4" /> - <span class="T2">PASSED</span>: This test case met the requirement or ran as expected.</div><div class="P49"><img width="30" height="30" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr4" /> - <span class="T2">FAILED</span>: This test case did not run as expected or produced an unhandled exception.</div><div class="P49"><img width="30" height="30" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr4" /> - <span class="T2">RUNNING</span>: This test case is currently being examined.</div><div class="P49"><img width="30" height="30" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr4" /> - <span class="T2">PAUSED</span>: This status is used to denote a problem with the test case itself that prevents the test from being completed.</div><div class="P49"><img width="30" height="30" alt="" src="file:///home/ghendricks/workspace/bnc-2.22/testopia/doc/" class="fr4" /> - <span class="T2">BLOCKED</span>: This test case has a dependency that failed.</div><p class="P49"> </p><p class="P49"> </p><p class="Definition">Index </p><p class="List1End">        A user defined sort index. This can be used to place your test cases in a specific order.</p><p class="Definition">Add Notes </p><p class="List1End">        This is a place to append notes to the case-run. </p><p class="Definition">Notes </p><p class="List1End">        This field combines the notes from all case-runs records for this case in this run as well as status change history.</p><p class="Definition">Update bug status </p><p class="List1End">        With this box checked, bugs that are attached to this test case in the RESOLVED FIXED state will be automatically placed in the REOPENED state if the test case fails or into the VERIFIED FIXED state if it passes. </p><p class="Definition">Attach Bugs </p><p class="List1End">        This field allows you to attach bugs to this test case. Enter a comma separated list of bug numbers to attach more than one bug at a time.</p><p class="Definition">Assignee </p><p class="List1End">        This is the person assigned to run this test case.</p><p class="Definition">Tested By </p><p class="List1End">        This is the person that actually ran the test. This is updated when a test case is placed into the PASSED, FAILED, or BLOCKED status.</p><p class="Definition">Close Date </p><p class="List1End">        The time this test case was closed (PASSED, FAILED, or BLOCKED)</p><p class="Definition">Build </p><p class="List1End">        The product build used for this test case-run.</p><p class="Definition">Environment </p><p class="List1End">        The product environment used for this test case run.</p><p class="Textbody"> </p><p class="Textbody">        </p><h1 class="P12"><a name="Glossary" />Glossary</h1><div style="text-align:left"><table border="0" cellspacing="0" cellpadding="0" class="Table2"><colgroup><col width="131" /><col width="140" /><col width="451" /></colgroup><tr><td style="text-align:left;width:1.1757in; " class="Table2A1"><p class="TableHeading">Term </p></td><td style="text-align:left;width:1.259in; " class="Table2A1"><p class="TableHeading">Objects </p></td><td style="text-align:left;width:4.0632in; " class="Table2C1"><p class="TableHeading">Description </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Action </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents">Test Case </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The list of steps that a test case must complete. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Alias </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents">Test Case </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A globally unique string that identifies a test case in conjunction with the test case ID.  </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Archive </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents">Test Plan </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">Test plans may be archived and hidden from regular searches. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Arguments </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents">Test Case </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A list of parameters to send to an automatic test script . </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Assignee </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The person responsible for applying a status to a test case-run </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Blocks </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A test case that blocks another test case. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">BLOCKED </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test case-run indicating the prerequisite test case failed. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Build </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">In software testing, a string denoting the compiled results of a period of development.  </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Category </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A property of a product that is used to classify test cases. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Clone </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">An exact replica of data between two objects. In Testopia you can clone plans, runs, and cases. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Component </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A Bugzilla component. An attribute of a product. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">CONFIRMED </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a case. Confirmed test cases have been approved for use in test runs. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Default Tester </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The default person responsible for applying a status to the test case-run for a given test case. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Dependency </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">Test cases can be dependent on other test cases. There are two types of relationships, depends on and blocks. A test case that is blocked by another should not be examined before the prerequisite test case as success is determined in part by the outcome of the predecessor. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Depends on </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">Sets up a dependency between test cases. Depends on lists the test cases that a particular test case requires to be completed before this case. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">DISABLED </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test case denoting it is no longer used for active testing. Similar to archival for a plan. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Expected Results </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The expected results upon completing the action of a test case. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Environment </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A list of the surrounding conditions that a test run is performed in. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">FAILED </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test case-run. Denotes the test case failed in the given run. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">IDLE </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test case-run. Denotes the test case has not been examined in the given run. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Manager </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The person in charge of a given run. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Milestone </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A Bugzilla object. A property of a product that implies when a given bug or feature will be fixed or included. Testopia builds are associated with milestones. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">PASSED </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test case-run. Denotes the test case has met the conditions of success detailed in the Expected Results of the test case in the given run. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">PAUSED </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test case-run. Denotes the test case has been under examination in the given run and is on hold. Used primarily for performance tests that may span long time periods. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Plan Document </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The information of a test plan detailing what the test plan will cover for what by when. Depending on the level of scrutiny required it can be very verbose. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Plan Version </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The version of the plan document used for a particular run.  </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Priority </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The Bugzilla priority. Test cases can be assigned a priority similar to bugs. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">PROPOSED </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test case that denotes it has not yet been approved for use in test runs.  </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Requirement </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A field of a test case provided to capture information about a requirement. Typically an ID of a requirement in a separate requirement tracking system. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">RUNNING </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test case-run. Denotes the test case is in the process of being examined in the given run. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Running </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test run. Running test runs can have case-runs updated and implies that there is further testing to be done in the run. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Script </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A path to an external automated test script for a given test case. Testopia does not run this script, the field is only provided as a way of informing the user where to find it. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Stopped </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A status of a test run. Stopped test runs can not have case-runs updated. This status denotes the run is complete. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Tag </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A user defined string used to classify test plans, cases, and runs.  </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Test Case </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">A list of conditions and expected results for success for a particular feature or object under scrutiny. Test cases are associated with one or more test plans and with zero or more test runs. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Test Case-run </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The union of a test case and a test run. Each time a test case is included in a new test run, an entry is made for it in the test case-runs table. This captures whether the test case passed or failed in the given run. Each case-run should be associated with only one build for a given status.  </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Test Plan </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The defining object in Testopia. Organizes the other objects in Testopia. </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Test Run </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The instance of performance in Testopia. Each run is associated with a single plan and environment. It contains a list of test cases to be examined and stores the results in the case-runs table.  </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Tested By </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The person who examined and applied a status to a given case-run </p></td></tr><tr><td style="text-align:left;width:1.1757in; " class="Table2A2"><p class="TableContents">Type </p></td><td style="text-align:left;width:1.259in; " class="Table2A2"><p class="TableContents"> </p></td><td style="text-align:left;width:4.0632in; " class="Table2C2"><p class="TableContents">The plan type. Plan types might include System, Unit, Integration etc. Each plan can be of only one type. </p></td></tr></table></div><p class="Textbody"> </p><h1 class="P12"><a name="Getting_Help" />Getting Help</h1><p class="Textbody">There are a number of resources for getting help in Testopia. You should first check out the FAQ on the wiki for additional pointers not included in this manual. If your problem is not there, asking your question on the mailing lists or in the chat room are your next best options. Please do not email the developers directly with support questions. They are busy people like you who have other commitments and cannot expect to be available at all times. Besides, asking your questions in a public forum allow more people the chance to respond and might get you a solution more quickly. </p><h5 class="Heading5"><a name="Mailing_Lists" />Mailing Lists</h5><ul style="margin-left:1.25cm;"><li class="P50" style="margin-left:0cm;"><p class="P50" style="margin-left:0.25cm;"><a href="mailto:support-webtools@lists.mozilla.org">support-webtools@lists.mozilla.org</a></p></li><li class="P50" style="margin-left:0cm;"><p class="P50" style="margin-left:0.25cm;"><a href="mailto:dev-apps-webtools@lists.mozilla.org">dev-apps-webtools@lists.mozilla.org</a></p></li></ul><h5 class="Heading5"><a name="IRC_Chatroom" />IRC Chatroom</h5><p class="Textbody">        <a href="irc://irc.mozilla.org/testopia">irc://irc.mozilla.org/testopia</a></p><h5 class="Heading5"><a name="Wiki" />Wiki</h5><p class="Textbody">        <a href="http://wiki.mozilla.org/Testopia">http://wiki.mozilla.org/Testopia</a> </p><h5 class="Heading5"><a name="Project_Home_Page" />Project Home Page</h5><p class="P51">        <a href="http://mozilla.org/projects/testopia">http://mozilla.org/projects/testopia</a></p><h3 class="Heading3"><a name="Reporting_Bugs" />Reporting Bugs</h3><p class="Textbody">Testopia is still a work in progress. As such, it still has a lot of bugs to be worked out. If you encounter a bug or find some way to make Testopia better, please log it at  </p><p class="Textbody">        <a href="http://bugzilla.mozilla.org/enter_bug.cgi?product=Testopia">http://bugzilla.mozilla.org/enter_bug.cgi?product=Testopia</a></p><p class="Textbody">Be sure to include steps to reproduce the problem and what browser you are using to access Testopia.  </p><h1 class="P12"><a name="Bibliography" />Bibliography</h1><p class="Standard">Copeland, L. (2004). A Practitioner's Guide to Software Test Design  </p><p class="Standard">        Norwood, MA: Artech House</p><p class="Standard"> </p><p class="Standard">IEEE Std 829-1998 IEEE Standard for Software Test Documentation (n.d). </p><p class="Standard">        Retrieved February 28, 2007 from         <a href="http://standards.ieee.org/reading/ieee/std_public/description/se/829-1998_desc.html">http://standards.ieee.org/reading/ieee/std_public/description/se/829-1998_desc.html</a></p><p class="Standard"> </p><p class="Standard">Lohmeyer, J. (2004, April 27). Open-Source Bug Tracking with Bugzilla. Linux Journal. </p><p class="Standard">        Retrieved February 27, 2007, from <a href="http://www.linuxjournal.com/taxonomy/term/8">http://www.linuxjournal.com/article/7216</a></p><p class="Standard"> </p><p class="Standard">Meyers, G.J. (2004). The Art of Software Testing, Second Edition </p><p class="Standard">        Hoboken, NJ: John Wiley & Sons.</p><p class="Standard"> </p><p class="Standard">Runnels, D.L. (1999). <span class="T15">How to Write Better Test Cases</span></p><p class="Standard"><span class="T15">        </span>Retrieved September, 2006 from</p><p class="Standard"><a href="http://www.stickyminds.com/getfile.asp?ot=XML&id=2136&fn=XDD2136filelistfilename1%2Epdf">http://www.stickyminds.com/getfile.asp?ot=XML&id=2136&fn=XDD2136filelistfilename1%2Epdf</a> </p><p class="P52"> </p><p class="Standard">Sherry, R.(2006, August).Testopia </p><p class="Standard">        Retrieved January 23, 2007 from         <a href="http://www.rosiesherry.com/softwaretesting/show/Testopia">http://www.rosiesherry.com/softwaretesting/show/Testopia</a> </p><p class="Standard"> </p><p class="Standard">Why Software Testing is Important ??? - Good one! (June 6, 2006). </p><p class="Standard">        Retrieved January 23, 2007 from </p><p class="Standard">        <a href="http://techiecorner.blogspot.com/2006/06/why-softwaretesting-is-important-good.html">http://techiecorner.blogspot.com/2006/06/why-softwaretesting-is-important-good.html</a> </p><p class="Standard"><span class="T15" /></p></body></html> \ No newline at end of file diff --git a/testopia/doc/Testopia.dia b/testopia/doc/Testopia.dia new file mode 100644 index 0000000000000000000000000000000000000000..fb9fb5758976100f7004554d290fe379e40d147d GIT binary patch literal 2875 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 Z`}nT>p#Lnh@b=@o{{yawB_r^w008f4uh0Mh literal 0 HcmV?d00001 diff --git a/testopia/doc/training.odp b/testopia/doc/training.odp new file mode 100644 index 0000000000000000000000000000000000000000..b4e9c333c54d72e042a0b191cdeaed2eff1e4248 GIT binary patch literal 304596 zcma&N1yo$Yvo|<+kip&Eo!}B&f;$9vXK*LD2NEE`U4y&3hY;M|H3YYyd&&F0x8J_= z-#vTJ8RjzgR(Dl(^{=X{t5xJ-V6j237h~JtTQ1u2?`**R>*o#daj<c)aPxMuFmZCS zw=pwuvw=9Wc{rN0LQGt3Tv;Jb7LMi+Gj|6IM>kd{7YkS5``<e%|Bpt2cK-V!1nwjt zj+Qo7?k@jcb>(Dp1&G{TO-)?b{)_Gn(Df@b|4jtk(ESHG6Eialdkdf$hzpyUyNk;! z7hVqbFd!9qgjeQ4(64`h>;Ih{eBkN-WXIATV&Z1;znOWZ|DVkKCn205PVP>CBHaI% z5dVpe_&@aK<N~n*H1~gq|DP!T6Q8f0{ohLa|4Zctf!P0lQ<41#E^Qo4tSnsF#BJOh zOq^W*hloElbIfhpL7>+U3qY)5W9H@#$i&9M{(oE?{L=sa<78*&<>TVv;&{u+>f~q@ zrJ^JQMj}K4=)iKal4>9jRQBu0y?GtHDV>`iz!$8Qn4%a6G`BFLtiuWXPv9n{<E9R= zbn`TEu>gsgLrg8m<z6{dvoJCDb{@760)g5d<Rry3yq1nT5dE+%8hQ0=sj1ET$kRgu z#VN(GJYa{qe}%ELMy-<|=2wyZz^%;h<`d1h&4h~I^$9?_V2qh(s(mwWGMKZ@P0p1! zFTd3cf~G|^i4?#@6qL215CuIc&C6v8m0WAMYr1=0WZ0xCdAb9)vt7?t57|T?AJ1jv zQY7{+|3*j0$iIId6BFaFsYyda6AhP;nCMGKXBAjj+!t{6vXz5~wU@9;J~4`+!o<8{ z*zErx7#5Z!^2V6g$8B#%E>YUbGP;jmAw{$ay*4^Jnr0*ksvfHQyo&Cc2%Q8gS-_h5 z*?X()bUd@Nq|2q^d8&oUegCNRvq9H~;=mUEIxDDOG}P3Q`HZhEkY6@vmd!I8G=Azx zSYWZ4Slx!2gkKXjyrh!p6nY*Gcp+g&&4THk&3N%0{Y%xUj<5&~a;UQ!_3_z+cJ>NG z#5%wwW@2Q`5}`tiBzi`S<l*rQC;fh|rS5*%(S(-uPQA|%3Ugo3|4h=G!bxCod#<Zd z>8`Xl6w&Q+X>WAgsKJN3ui?1FH5K7K$A%;1(HDc0Z*5Hb<1e$7jKw-U*1HZTjn`iG z;&}xqJSow6y+{EOg&kN`c!+*OoisXZ)1^T&pKtuT`9A%$FgGtZx-I=thJ-~sG3stj zl+H~WBb0Ct_S#y!j#~9uGF*QC-1Yad%E&IUO@6=g$y5RmDuFm^S?jFmOf3wt&cvag zq8iBo=9KhZfTkGv1iZ)4#LmJU{b&<qo<MP&U#ZMb81T9vtKH=u%N89vtwK&Z6A#-v zvRsE5VXUBrAU(njBr3{faLaG45ICQLoht%9aJKUJ2o{J=A>~XVvq`f|dptdxZI~a{ z*a5ZjFIpA$yoLd%PEO_hLcDVJ5c|r$?`<T02D?dc8^5LKBKi_$8;$Vuv5%E@me0`W zAhP5T%{7Sta(0N_FI$yRL_kg!<7|y^o@%-*e-@_*4HHikMIHlM9u6D>jqLGT;}gmA zm^ZK5fLd<%MxG1UQAkgpfdp><{v2sP-)4k2J%H)EHrp`HN1Y&_#ER7w!)}6&<;+X< zJ3RqujQp-Z8R9qYycO=TGqT<0`5aqou6xeqK08E>5r{>r;MCL|MKstF*xUl^VC=8f zikW;Y?9|$;i%Scb7O&nx<A6~pR5Q;}mi}!gT*fqMhhqUV0ZDSGl+y-teiySs3VV=a z5?F_b^2c{yeY72{NpQJcc8$ZbOkZLl<^8`#d<Wg=4QL##R}%#=l3}g;u7YzQuhvs% zGcZ6V=MtMvRHC-L0zM=<<wFKI%1P&zur!xj`au*3b3ey_$SSAgLk}ASSP-Cs{`c?S zqw@(#H1)IAT!mq^qW02-g)I+!rg`NSd9SS07L?f?Dtb^<jF%VdxC(FLn0r8l;q$Lq znx^{iP~1XqS{FAQ6IQZln$y`$pjVI6eWluioOr_>H$-AOeN1{`Tf^#grJ4?!4exfo zi}Jqy&_Eq1aWW`432=>dFeiQh5WfDZ5ECaK93U?*Kal%sMtU(@jyl+sNItK|ZrQ`h zIdwi9ACiqUuJNiQmZ5%FuYY7JZZV&S=#p*A1}6WJ$zLcCxpjQ@_y1AH78~{3*yit# zgRwJ6)DOnjQD^BNwOwJM{Q23DvW)yyO2Ml?ZB?jI5)`j<AJ+ok2N>)BVyEm9eN|E_ z@>Qz#>R-PU?ru{evP!OP*TQ$D4ix_}@iRpsQa1hH+zP%{QW~Tik~9_j_hdN1mp3Op zIkzeDhsV|rU?3(c;6ChEI&YExvpoYM7Au_YpIvtv#NgN75HH6<g{oe=vj0$<p~L4{ zJ5>k4{x43vO;UJ-1CCOx*6Ft#Uq>2H|7#x}V4}m0ulqRvtb&cXQ?+l3tB%kUE5z(o zua-lYn1mC59vMDkB1ajRvaqnh5B=-9(~9x$bkR`%KW)9L9%vES`6OwL{dT<W5GkHy zDW;G0RWtLkqfeI#x$}lAf2^g#?rQ$Eim-8HE3OehOtZ!aaQ$jSS*}OBEARd_W0y+% zLGd3ph2@49CSSDY&Hfv#tQ<YIcdfHgEdj5c*_Gg?f##{twV0{b{<S$E{n=6F;QALo z&i_{Z{~7~t6Z?~FtJtf5hO!q%!<(CKU4Zv$)779~YAfLD)o#Fm`*Z)x%=;z-vKX#D z*m4hus1LK9YtejU_@~-`Ppb!|ec1M&0geG`yd+lMDc>YbbWC98@LS}0XxIQ=r;{-N zADPOLG+i^Q2{0M$qcKgtdGg?$%fIh;C^!iY4;8YNUiDr<ILQO~JD#^?Ds_PY3RWBx za5<Zv5u=iD7@^9;gjxk0&`{in+N~Ls=>CrRyDy1-@Adv!dbE?n+M{2Gh+?*VZWkU- zZHZCDQ!v8u#?EkJmSMH1amH)o14)4Eaa-iP+3#)}x;^40FF6ggn_oU%ecC-V+r3U6 zGvISSyPp*pmUub`Z0lOPQrE+#jRxH6>t}kKRsCf2(NMMV<?_Dul6(KfQ2Wnke8;tR zI8tOhX0KNVHHB<P<I(r|-SdLLt)Gt}ss7m+wE(T-aX-P!S3#JpGvwp7zfDv|q_<qn z>IljK56{YE&1}9$`e;1%4|D!>oex>fX8<gBaaVYb&9ulp!N2u=8riOXI)eq>OL}j% zn2~WAx$E_$Q&Q6bQ+OnT2NXt^Wstp4QOq!bLOf~KpCTxZv>Lb@+bk&J@Iz(P^ETjd zbU)yUFdHUB@P5E&$C-eDfb7^u8I)0t3#q7~gk60b+W5B&=_&_o|Er^^Zol)iDs09O zRKNRJwdpef&$CmhXSSVx=Iy4hcJ!lIfNqs$ICl`S1#6&$4d6hYD|?)m?VV8qj3&qd z38G;Vh+5*g@@d?mzt_GG7h_3bMCJs4>8rH$vPi4vV11}#2sQt5wfP~Z^9?cpPI>mT zN8Bm!nfGnq1}BO@kxa=|K6PQ(QBB!vo(P4UabjF`A_UXbw;vB{Elf3XUV-VSR+a8{ z*D*pYHEtDDBzauMJ9R9|wu$`t*p3HxiYZZ@lz@Tp4S1!YefcCr0MY>-Ydn#V<C|kg zGsRxMra{5Yhp)Jo(a>wOL$82goYHwA7*~p~;AHv_;1PcShOrEK135@{USZ)8c@Nfs zpA#-g93(B=*+`t<J&t~bk>0iH$@i*+(#}d4&h3aD1PC*cA`D!k^oEieR-Za?9M@SZ zp@7#uz_t#P?8*5f=sX!8pt#m7Sym0fVzq*$o6%ylxL&7ED!$?HWKB{oQf5!$5G$-d zo(`g3VBinST*|F~sP-)_*-V-w*=t&#qWA+V-~<30Uik7nqhWv~wmzNZjAaGu`HH)b zEZrFFYdQag_1;!V(d^=hUa!bmL8B)vEls`>%c_8#!%wt_RY&*=5`PEH`yEnZ%?lm4 z=tVKsYF>qU+oC5R!hbVM;d_AV=2TMA$vpPql}CnHIi9)2Zy0zpa<3CK*SdpfsEGJs ziPIDLcYp9J<%i~)T$M(dZm((CQ*eT5n|RHb&_AyeM$?@ssB3c_!r@FpjfUfMeY|pL z>#O$)fK6JP8Cmb#e{oL7*C7GOa+C`8y5?MFdVQ2bK#Obd#LFhE{tx)-><<qQZ<^DS zb>S3;<^KJ|wdV+i>$r&)w-4<AW<LOw$bFW~!;WH*37|Fikk_AB^hc#t--PdnpgR47 zxFQq!VCqH2S15Gn8KiS5`sW$2-GsP=-D2W?(;)6Tzsf@Dk8A{%FV;81Cd2!={rZj_ z{XJUi`-mUQNLbP}9u-#FypT0$LmkAF;~2m@8^Tw2Bi}F!3wY?`KBlLprpCuViz>x6 zGrl4}k#BLe)7s->bTpF89DEKJFrD<K&KVMj4$s$jc6P3-D$H8&0Ew&!r@lIfpGbx_ z9;7q_XlI6{&aq?Ouu~xwO-|z>f8;zO%Cm-zimk%WXT7zAPTQ>ay)NO<+dI;(E2GY9 zMz}?`bItc*<1bc3<qNurS*F-H<HAB9fM7@ZlIzP{mXD`HiTB{Z{p`ov^{%_CvqQ)` zzNbGA^Hp=3V(CKO3C-f6h$pytJpR%!^`l0bffM1__6N%M(0U~$QPogbfMr1`*T>JP zpxMfHZ12f+rA7hRaFp#Re~__2MMLMlqb_T|zbm*m@@loCCV<rFRm#Q=$DGn_X4bW| znKe*YCWo;eQ6#RXf1>d=Q)Dl&_d6x5<Xj4WBv_2}<4^(<mHvbCxeU0!Aim*zj;^rG z0T=gVH0zDI?T<dXZd(o%ZJlNVeF|Va!t%a-{d#9mEk?z?{%5r+2JB`>kodWWh5II~ z?S>%YszUZ40YDdA4|u#fuv_2o5b4_~BH4C0ol$wHgM&NjXVibuh!dypU#JXBGX1bM zP|d9ITVW>cxX7bV%6^@U&hc*mdKXJZPSmSWMzwmB@fqyZS0{rzC5=JQw7(l>P)tXr zjs;U32FxX>l?pNQ$H$WQ#gX`0p<d{ou2pQ}z*G!!G=V6XKd#6*+~Y3hJ`J1UF;`%1 zJN9Hg(De_6A=+K9u&jBXgoEhzULEHI3w3k4;Q`p`Cp?-h!5^eoUyclsPof+DU8o2n zhv6f-{-J<6>UFwh)U0u~9y;@i@)9j7Us;6^`Cz%WgodSs<%Ign?>lzHHm95GEFEpg z5c8JhFo!Qk#3_!CP<aG0>$ZNPuSbaK>HSKxS*9AD8muJ|@tK_UaJ^)L=-tfJWJNND zr^LPG>`;Gw$*j4ZEJ4_PE~=X5w*yV5gjJ9s2(u=#n&S<tK_d!eyofx~#}6Bw7+CU@ zttg6B8yz`d3+yEejuM`(Gqkj8<fPAMl@w(2z<sYhGV__M+%Q~;6@SXxPN1H&I?CvY zhqcZpR)!D8OupqMSCqHNE&YUo<&?_%jtn>ab3u9!x*xYah<TWmOc+@04Q9UoqL`zH zE~GBkwNv3b&*wW^!BR`BwZoy$DGEi-_npUDVFjDqx|%%)ErIrN8l-PL4EQMR3d4%# z-QUjAgRorSAv=&2EFIoogEyE>TK%h6wBs<Ib&T#YI21inyps@g>AhP7BGvAcxDIul zAEFcZ)f28esX1#oWC1xWc0%R4{v*5_p9c9Nom#$P@s6Slb4XO=QNkXpIW%OY+u$&; zpWx~v-z#XENN$&W;b;amLI2p0Fz^YD^o~2m5hj*w)@bfaE7R;NTq`QwocfA}<mQUE z(K$^PV4;jK9O6MAe}G~q5uC5&V_GB+4!+#mXEL1WXGY0pFr0y9=GNa5n0+NCC7TJA zk3zo&)~9){r9-PeSFMxMyB`)Bm?EE%K7+ZUkb)(y5K<X>U!u=ap-@d5#lXpFeBUjT zk-8!l6ADLWoE9S;2`KKE>K|=JKYAG0ziplIn1}k(>4YJP3<qhw#=m#;*~QM6vAU2K zS>UtRMy}iXOH;f*x+ACVrl4=IEu20i_KW9$#>(3YYg0{GKg*NHWSGF4>$+RuZEl6T zS5YmMiguYEjEP<!XJqbEHCBq9a5%SxP`$fSYZ<VXJ)*(khpi6s{7jZEC=pAT;<5|H zRI(nZdaIy86))fiFTbadUUn11!9OCQXWCR?H0B-tG>i#%BuWHg>KdDHlh=#4VkA(? zYC^(Yt7pQWv4UNQ!kH`lk!!D`1CUGwM)+7Ml<~iKhC#lgMnhE!pC9{NJLtr_e0$_t zqZR4c>^NB9gQHT97zeTLS23z^$%Gn{>Zl{c`uS}8`hgJGh~0C*8yAPMZ6KuCNCu&4 zV?d<Y!-%zGexHr0XlM?TU!eKBGu`Ez$qsm-uM3x~-?~zBbTI9YPM_Jv3U?lCfn-T( zGOSP7<H?U6Wp8RVHpDAN-_mT8bB2b{yF2g8OPn4-9g13>PAd#n;_C!Zxq3j8S`Utw zkzS78m*(a9h^wL(sN|YZ^@G%CEe{jxBNaSRJs|X|UhfOAs&MROmKuWg@)oUHc<W4R z6j*znMaBI0uI~3D|F89m;_)Bq%!p2i{ot1!0s>Hy>9En5?l1V~i-lIVLry8#II-%P z_Q1Dq<-PR~JgL66FUm8+YST*UM5YLEfpXv{!ed*l0he$-a%o8Fl@BB^YPG%mHhbWb zGVTMkIMFq#>7?$CqpXa!lXrBpI%sgve+Bqj-x%jML`MbSXU;Nt*QvIL!{Lg3^{P{K zkdZr$o+;Jb)+;Bhym1Uc$%*AfiRO;r`QvE4VTa_zp#y07R5j^qpVbV_OT`A)K*A^f zaAs#aoE1geWB<u*M;_arUJN+UszPEri*Hu$cBA(tu2iAUyvTL}yikG8Cr|m*8W1id zZFPd8(;Q%<fzl1;1paox?0#ibIw-6|ISh-Cc1_FmInt2hE4w>(*Lb(h5pi(QITZ8S z46ktq&8(0-M9w{;VJ%_T$j{bnc;dLnR_Xwk&6PJKftLt}wEM2#zI4v!XiDo$;sG@i zCq1RKMQDY3!Bxt#8x%E@Te)}O@u`(Mxrp8Hg4kP5<Of#mfTLPjR2%mr$meP_Je($N z*+v~ko8wCrE+$o@;;LyFKdi8|dL4zZ_2qh?UFlz%>u#waHhA^|Q3a{HUm%Xrr1BjS zsvyUnw@K5J`H(=zo43rX9!g+Y3vweCU@=&NLyxhfvm0^ae=yZjG#x%dfls9xE%JuZ zPX`8Hjf*pcMz{BEjb6fe!Y7(g&iV$zlev^RRT*6TR^5&b36s`fb~eSj0Y;Wf0ukX- z8(<BF5g*z0FctsfZkd2eo;y@NE6)97E%9QO;w0&P1&x)h)@L(`KFsMN6UpG-!p(PY z9fqeY+I8}&n{?d&aK&Bdc0{AYD4C-Kw-ZodkVQvvhRTb8-w*YC`2%QjC05n?xiQ~~ zt6~e=r^vBPRzN3@Vq&zhW)aR>bnYG{Lpqcvs_ad!8E$-YstYe^ln=p2!P7bXDlTT9 z>JJ#6iNA^<f$0Qk%)fG~mHL5*avGOOeh=I7T#Og%WDxEm;a;uJ^=iYIKKTOaWKJ@^ z+!Ci6o-b00Lfmh~Vfq(E!OJnf{KR1LMcUvG{Q+jP@vq7$guX>4lOeOM&3f$=o{8m6 zno&iCNe)s214v<c!0P1QT!Cwpg8ma)D}fpAD(?=mOhzxWX&R+Izz~tAy!K_ln!U9S zba%@i($)g}N*N6)dsIc15+LzY2}CoxVLT<?{BKqdIw|6<q|yV)xlIUJg>@>BSLv~r zY~fP>=zbToiu94x%t<fcw#os_v4g8<u|0k!(`sBDK4Bpdg+op<U^;SZR*NgkLJLc# z&}(xFV0I!_@ph8Q8(EO#eVGokzKy!Na!oHWbdB$f7!U{dWAcc!*brys3l99Rw@tOK zn``u`bfVyV>&Qb7Q(FfZIa|3p2HuZ*jXIk_4|GQwe!-Bs;q^{+G2^s`FW&?-ax?)x zOcz_4IYR2N(SC!=So14q&8;xWJne9@z721&>~TW4Al$gWU3U8i-uk$)e(zv0_NPo! zBE;#52%etRG=9e$Kj9{#!;smF0m_5U($b`->1D^7Jp8gZ6dsOgoSY(s=u)gXT&O!3 zSVbl?uN|^Xe`#|+A+#EwzZA{YPVp_uGM%N`g<9r^ZK#Px_lYRspt75Lx1QXp1QU>$ z#SYFVWqylc(>T5wY$tBO>O`efgG9WfFbbBIKK@Whr_lEup={Qf_r~{NlDABR95=ru zHj0vHBOFSXNWd?2`B1e}mEv2a_0C%=E{|vyx0G;YG_5iT-chb7-ZBB%O&m}4@?viF zcca9;feI0>Z<0P$)sssfWSE-c3MljyBa~e`Hw`B6HcYh(yGaBhC$|Iy!{i+*)<j1h z9p8DLr)^&idciE@A$Ly_5OA0f8Uo{<+;;BZ1C>X_S1k66G17TbYqSTKX~Z+xQ8)@V zx;N_=$wHd#mNphv(dKN(Ea4<D0HmHVQNPiHdx_vPMq<AhAs2a#HR{AWzSB>%d0VlX zSxIc8pR=qW6Usvow6;Tb5A>1J#?Na2MZ{%L2qE=UX^@q=Hg3?t;2ydjq$cu>AB1Zi zvJMjR@nUTUESRd5B7ZLZ6C7TnW`?*Ma`J@U@3$H`ZtVlnrv1_AzUUIiemR~4(-t55 z@>Ioa8?GJCmdlh;i3pQ=#aDn#5VrptzJZ@1qUn-z#Ko?>rWZl1mv&TuiBHTOH4`y; zPv=9l>X3lMsodQ1DNAZle>yrDFORlfIkWCtU9*G(2w~M1Rz)R+lyCzyEjvkG9s{we zol%;GAELj=Pb|3+ddq|w?%->IjCI?RsT7@K0#1d2dUl97{NdD&o1Ec|&?_uZwQ{Ic zB=dY@PHHh-VIk)KYQrsO?nWt6!uJ8g!xy2M2l7$m0jpT&T6Xx{h3Ft{Te8BSwQD$H zpZJg++(yb=uZ8C+FDo1P(6Y8VRT^$_mzU0OWnb<n`~gGhVDA{aEbxTPeAKyvx>L2i z7yVP@CO<Ms(dHa5J}pEK4k*p(WnyoAX_rtU!}&weZEEuD;;_=o?jDP%o{M4$ie4w6 zPfL2wYOSvtUD*M=+xVX>#SX&yGfZyh<%~4b-I~etvdH}EqaO@#roC^8eXBn(c*@J1 z+<as8M5g+Io~iRIc)_&LN^;cM#}%jMDX>#q#N@r3abF=q*|$7BadDwGDw|NQayy;I zjS0Qxh4#OHNt<+Zxy{t(>hZnrgL;s>(G`xBj@ZK*2+G<2HQ!oO&k!JEYAMk-1>@$* zcp|N<yf6w66X7;{G<!U5tXMO3hHe8`uQg!}-Zy%jq4m|+ZU4=Mkg&P?Eyr`|6-A`s z)GSBY_6GdgVZ3rlY0pmggL3kp_2<$v#QUS<Y0{@w<k7bmo}OG9;4aegxv|x|oDgVe zW`n;AmFQo$7DQ_aSm0Ohf^p8ICBRE7AS#&|`g9tFwx)X0a;<1bHM1oRWz~`JpXt=l zkG*ayYU=E^xB?RhRQDTjc`zf{FYqfY3V@o}T1~X{KDX&g@uHcFOLpiX^O!mia->;W zBylmA5EcpR1h?6^@|F=Mu_$jT>TF2Q6YsC6sePPY2r5)YrKVNrs|RLqo?a^fpl1^5 zO$=>6yrWoC_-EP<_pi<3rVmiU|5~X?Z6hdDbg<UBIdC_twhd(Qhs0bt{mm#r2>v?L zhN|nj!szKLSrrSw(KH}zjN>2;1n|)YyDCbDoVwReH4|N>rSHAcv|_*WEB(Tm;jfsN z1`Hm8ruAEjR|`_1En&`W6`jj_3mS`UCW7m!X$^+F$CG|*Dis;44;61qfF%vsh2KAc zfrRWbhfFhOo}SlreUsPq&kaIV*9<<oAQ7Y(dWhVAHw*6sFG1aBq0zQ2)nbyIeI3@g zt&seNmwAL-E^*owyFb+C?lnfMSA%iNkJHll`t|F3mm6{zW?=&oa2S!QlvEh0XWf!r z)E^|rrZn4HmLY`daD%-d{xOQFLUP?n;-*bmLQc+vIaWYLox(aSNUNYytqQ|SB@>gd zq%X{m?5>uhKZl1c*^^fUbs2dCY?MgbjB&R0Gp|-Chdv3|<>qe#!|~e64pJocxHMq* zxfNkvMP*u5qym1hk9xWJ@!+OgAe-@|1~D_m)N!vETKy6;$pTAs+UFzKw;GwYEyTrn z!bGknWQzScg&q8xv>Z3sk&i4inPmn%apzY}y+IyGf*gM|tn=YL2DxqM$L~rx>AbHN z%Kz2b2r6|eUSA2&YdN4-=vJtDhqd+r+mu1J4x<mHd=M{~?6)&MpsQXJaX%rySbAHx z^2I<VHSF>DP#c|F<1pb?7TwlgjP)FtL;4yW=Nww<u%O6FOPs4M$BK5WvhU5!!+0^j zaVYhqW{By+ha(HyM@ywqNOWu?Z1@0j-c~3$y;gey|Gyp%%e4K2gYL%*MT&I>b41Jb z`RtU(*wej*M`6~v{3L@Qk;qgP)8F)}pfU0PO?+PGm2KEezF0kjj$Wbcl1&g}^mjMI z3LfQ0WRxw^JO5%V&$?0*2JsKQX$!cDt{EwayD}zltRNY{K77%%@bih#dG``Njs5y1 zJN}(LgPwS@ay9ezU4nr9)tN6@R?8!r4NL@Apx}*W>YfZ{TmO<M@9lz$f<8hJ;if5o zLzJFWalHb{BRJ?*KSTdDxV*>mGMrTv;6Os=H(57=NA%uA(Ct%Z{Q(ZBIr8Su`E!f^ z_It$>Tr~<7VMl8m<uHv5s|ib6NeqLnZgnd$_7&giUi{TH2IhXcL^?(2?3wz}2N(aR z_1kB(2P_b)-Om*zXE5FS&G2tW$2d+j@|h_*lz8_XAB%US#UloISHI+8N&IBtKIgS7 z8Fn<Kof#Ao4Z*p<APP8a6Xk`Ji}U!s=HFhhA<U=j0#b1wJ3RO2ipZE9WL<v#VeSKg ziud00xPAE`YA2wKX@&(!OxvfC81?HcqMeTXK4#*U5mifer9dB#coEjq-}yAz%XR(h zjzE^5fANCB(eS69|M^y&`*^0vhc!1N5+2$-gOK!_;p}yd3Et)(EMni5b>YTqaVdo{ za{w>=*SsU>7=Z)p=PeHY?|uyAkiHHCWR}M~b}6X=9!G|Ek7s>{r(H%5=~1`)Pabz2 zXb=3xi_c^qALD@{hGb#)%0DqH4j9xSf1o^dB&WrvBN>!TF}p#HtdoNb=!jIGzs13> z0-hPAK>w{f>j#EbZtrB=&w|h^jSceemd_FRR67OSs-JBWPye2eL6fc?i)pHCIaX)h z!2f7Ui7%qC0LHg-EaZ)zBsz+a$<GIlL);NDpjv<_uJ?s8Iwl5c@?fgii615bT2n#k z1nxy(3pIkH_1Y1|qql~fR1(yTJUffmDfFG7F_7$A*Ww3oH%x!%WHW)B{LIe9K-x6U zuC`rg$A<@&$Hm5HuX)LU@6YiOkM^G9R@teQbpanf=$p0Dvaqo5jIE3EY>f%xK=>^l zf25$7>^0=_D}6e_LJo<AU&1PrF26GV>n9>wzqR#wV_nodgClDU!5eDB#ijO%#>k^% zJ85H5WvU2U@NUv*aBs{wAh^vFC`e$Lq|~lMx*3#Z`gChDuATJlMC4e|7c;}{U8S>_ zTs=?13<YIyq@8udNZJuXi*iT5A#4H6r{CFgWZjik<5_1A(SyO*Pl#;{SJ(@+6c8Kq zEGluvu9Pe*B-tw^iUp630<3bf8)RNuV8wMv%+~F^pu5Hp&b|F}6FPvL&T8yfS8KH) zDbO+SBrKMjGAJdlc0TLbi$0%dW4@3pdxn^$!{czLp*7L!7GZNp{D*JAJS*vG;O=VD z99b4<E$m@Yc81t0nZubQZ;sV~IgzvPEd_-b6n*y$2-qT9%!B7%h@T0f+FUQ_v>6mE zWQQZ}Ya)ASMY(xH8o5;Kvu*3u{jJk!6S{Sp@Z-T?K~X2Y4Lz(kIi2s?<KLhvU6xyT z{ZC`73k#N?cO7CW(9r+<=%h5Z!il(v*h53|8qy)nAu?V$6O^e36;Pqx$Dn#)<N9;F z@71V6Kqj{wuC)L;_(eh6KX$hTh#Z`pGlWQE-p<cF-Yr17zx%pi9LD*bA0j|1hwP@u z_XaJ3^6z`2cd<VqzjHG?{8l=cpTUek1>>pYt;IYH*Gl)<pqkj@T<EHZK%|UbP^A;X zyFq9-^#-{NcDeCSg~Kv6zmn&ErsuP1ZwQo6l^BKN;M-_EP*BR2n+HcHJRFQ+AVZnO zrXBZpaJz4N*$`H|qx}iW!W|mYT)@RXFAX*aQ8L^?<8y=iV5jX}E>WL-7Ey?@h`)5! z_PPawgRSP|e7Kb@>cm6zdrwG20QWjvN_X{qDV`C^6WP6!E`bn_;{u4<QD18=f4Zo2 zQU81Fr(C-@bzG{sehfNGU`6AHrse1N7`hTAR7o)h`p!QvbHL7f?aAa?Gzu5kx8&RW z7=cPw<J5Dy|0`?NWdaO^nhSoGsva30lanQ9xS9g{O+AqXm|d&$z;nXJIci!dpLl!P z*-WBxt4l}{Q9Ssh)D{%K5s#RF8tj3&vG`eE66nT!`}2)&q(Uy8Z5)<VY@|D>WG0_! z@7M9E3re$+5NS*0OuLmgn~gLczY&+&kFufy^cxOhKCekM`~jwsq26t&<$%6Uo}MLD zD-N!sjGMe{q*1eR5Y;5FkL(D1lgmowoZrJFQPs=e745WB=)8{ep$av5jvSY+%<Pvc zXL+dYj~piAZ{YU;_Z-cnwJt|J>wWgoasT9P`LWE=6B3EOI&lrKJBfDCc)qwkGphyD zAoM}?T&pMDmW`Xa?SSkHQ8jgCCTXVnP@6RKHHf^`TZ_{7?_<wtmtT)|XQvjz(iQVc z{`KtaY?+~-%`fE>_yW86MhCtV=<&}eXOWB`ZF#IfDryB2O{CmQU=MQxgS;Nf)D-or z@Bt;X5B%DB7mi;zI~bdEzpx(mB#DCPSOI|DJr+G$<+RYMDx)Sxd#$99X9ioH50n-s zxkQOxFr8X@Etelw<sPwC-!|_>{choZEMuKmTWb8X$7)c@W>{WY0ghLsw2d>$+r-#* zoUD)1g<qGIOX>BQd#)^5<FZ=Pm%5GX`MFsKG64-$kG}aCO`J)AC*Qk4WlXQ4ah3*k z4n{@h;$v2ZfZ+Gh275GLj8FQ<Z%;N2W}GTK)4A;Cu7m;zO@M7tlvSW618Rfx*JwkN z(lr=~oB8lyPpv=Jx$pONXUx!A$CltPCx@T)HXB7yF`G<3ywa!|++uz&aL_WAc8-E` z8%@3jbLJf*I5#4PHOmQzH7P&qpA~DyphG=TJigRTE%<&bn?i*O?MVbhrL52vz)JFQ zK0~*PQJL7qjwlvAI~KM-L7?Xefc!p)^?1_ZVn<FsiKXo9b0*v7p`Mb`&Hen`;z)Ms zb{h|nqe|R=+Pm~*``U58eI0)P83Cw1y4<OXkGxivpO)n9bOn7;s$^c47-w`lz+Z0g zjDC@GQ<z^<G<n#83UPnhjcM>3mylZgh)C3~5sQxcA)UuTKvokEwJKKeS*q>eL`;Y! zDsB5~D;MeKJZo;}j{C)9_NSbUhIbV{@Y$bRtthv`?qfRd4um^@%&k%}+_JE@!=%7y zyG^XVo0oK2*l1m1TmYg3Ap2^hQzO(q2|hlAL;lj)^ZbK<`VM|0{VfB92-I3$^Y`K5 zVFebY(N&ecTF)-lByq@C!~*LacKMI}5oehd?|s+UceyoCM-+MIvc){29No1$^%RJ_ z?w?Pmgg1*w&v_R^qh?I<Te{L#Eq9XG-aTq&3U8i*T<g2>_1!_uDFwdyt)GzQ_~j;v zJ#iZ&54A%=8GJlq+0O%NJ|z{~AiTRrW*6)j?pnjABoSrDy@!TnIw7mxl`o1zSTF!e z*F1{DfpF4aufa0bNPl2I{Y&~o&x7I)oX6?qC*kgmPv7tWd;zC4o7+e%=^3P1EANil zeji%^AvZFA{N<r~Qf2uZLz?0KJ9A3&Bj~&LW#T5@`I)x+%}z=FF37c*=_d(P+me}J z)odp8r?y;&2xGBy1}10pM*Cl1H{<cnpmV|9Tjy5um%Lu0Z@pqjMJ@+H<}X*XxqpbX zP}?8&`KR}44Z{B*z&Dx3k)<WG8t{CO4mmsFGUz&)&Fzzsb=f2`Cb%mQVt{E6nFn@f z@=wG^<I`P$TEtsLIg5#+8`|<bqO_0$tyW)|&5@W)0ez5pN#9_g(IWTa_>A}_9&Gp< zv~W+Cp@ksO!ys$+JEuQW!=YafNnwbAl@a~ooRFm{K_d#K|FIClBXl;lQASrO=pE|D z!#Z4*|Jj~hP%*c`wH}oBCKUBavTIh4aIhI_KyS>#N3<&zz$gUAobK26Se}PRg}UWj zR@sF7I!hDO$h`|SH9Hl&!*Nx3yqp2ZI5(JKl;vMGu>~C9ad~U&Qul9IY?xzNC>41k zV#-KMg%k6S$#}+G1YRYb7uRbr!~>BD4l|5AA2K5ZrVxIw-yK7|tV1mDzais=R6K3v zcbO}v#~g_)`~oR!RT*O49E7h~$k{NU79s?eegD3orP6KcWPL{0OY94m1C+S@^$S9I zTv$|Zh{E?bs}>oH_ke?USg<IGFiPjK*SX%3KU$%OY1mV(uI5<z=w&|g#{%R^)8-k< z*9`=uQ6bNfn)X^)*pbC&CCLH2nNsB&b<4b!D9)XhPOzY_oA+TPK`>!ge=>W;v&ZM9 zkplF(99MUS!TjpR1y5?~@k56MU-*n2qAjjIYRg}-)Jpgkn>xI4aCUYcuhOYxxWBt; zbTIqqa$8Fyk23)u`6a!}^m!1ij?4(VXrhSy-Jo#in;Uu{#D`^SL4|G3v9E(7Rc%;! zqiH|m=%?9>odZ_(a{ApZ_`Kdih0I%yB4cfKGaz$Xk&=kq#{Qkd$55xagC-{(dIMAk zY<2)egJ~}_>PToO9bN4R5HN{IhLyv@W==AuI9Ogj%O;SMVk6Q)_Yq$to6~{NiB~cH zQ}N!uwwBg~IUSeh-f=@1$bkiBX2#wT2))NY=<yw<Y9}C|<ihCxsmWZkrvQwqcNIw2 zuuj&0#zve55Hzrw@9gBf8Xg3P#waAj-W+OTq(%tA-<WF1u%QAu4R<8eoHj{FN*cId z-;e~XUe8}T<a^Y|`zQXs7U2W7RzCWw7c1eh8I-p95xjHPU`>;_FA_<#M*)FVay=hL zVsPSV&3YVjxB~4M`lKU1>Wr2wtQ1H|F#f#3!z<6HCS%R~OU;=Z@US4_2*C%~<4pU^ zhcq(C7dEz<n4-*RGun#c8Mq8s*hVCjU!T-!o+X2Dhf@y>|KjweWmakVvByIdHeLO? zjRNtGC(m!CIgR!|ZBAG3p0~dtxVUtu4y2*;y*=VWY)+>EkASd{ohFYC@eVgX+^0N{ z2!-neAXlCPV129{r613fJaXN=&&(Aw+ch?q$^L1%!KUyqe3sb%VNh_d#s6NFQG7=D zD2Vwcb3hud+50sPOGQ9h(;sR3+oMDwW23qf+mf1ny6XBOe4Fuku0y*i=7e<CVg|B5 z-fc3TCX_A1Bu|(G6wD!T-a;OhEalWX%%NLt`cD1n(L1%=ZwgM2qoO4csvEVW>qQG$ z{h!@=-gfg~ltH6@gZ}~7$9oO>fm~pjVxqrx2{~SE!STxI88oWuasna@)QgT$;e6{j zEI9(znMh7|v3T~UjnVlJLTy7&*MI$3Tv7K9U6YrtIs0=$pCJ%myQ6v=Ou7g}SVMKY z8O#q*^L4_vXen<(;NSkjr)Ot%UpOddxU}DZPSOQM_u%mdTX@`@Pdp=`UQ{oR7`@>% zu6A%i5X}~_R{%f_OssjPyeiFG7SBn^5JPKCh5`2x<`fakW|w-P<=YZ_el<_D<Z(9? zMaIO$<jqgsd7PfA2_6|U*pB<?KDY+Et5%U0p~=?S?;{I^Y;P|9<cb4QH<v_iF#3ts z9I>;s8Vqk~g?0$~O~>K`Criv%nue@jCg|O<HqS%ZQ%FK#8+S=j4U!``?I0|`zJu6n zPRyB3#!A*=K4$I%rAs(?m-}LM-(%fXseG}%&SLO>%tO-u+j5zVWuPh=d*Lr7vtzr! zey@r@wOBR}gNdL}ZS37i%TjUstz|y={S5JZd&m-%g$7-+mf`#bGZj_-bso`a2I2Z5 z^SAcJF-H8hXs1<6MGm}WPPhhVU0tdZV&~>#b|p(h-4GIn#SR!!Efb|Np7y-ORNsn| zuf9YIKu(26Ntea~p2WcC_81p}cz$k}lRm!B#K2+^Fg1j+#C68IjQ(@ldmp>-7gz)R zAd8mOl411cgyLyM#t>dAt#sK~7Bj1tW*tN>t89Y(Ly&jdrb`@WihOg4?|q8>drG*2 zblPr%s;-SS4@_XmF8JM0G*%~H{`df?vQY+|W%`d2^L0799O+_mVxqA36m_!kiI)Y9 z>P`%Qak;B}-46Hwe|5Uw1CA&PPD&&Q)nV|Pk!zNp%UEKUBNSbkayZ1x{8P(2F3%!o zH7T@>V8^ehu%@xBg&5zIQyO`E$?2A*+|qg91pxWjGz~|f&igD!f!b}E-`~GaT9lXP zi&)*xXhL{lUF_B1gmj6uu;JoVFRSdX0tYIHl{esTk`?KtWf>5I7xgPr&L3O|qxlRt zjtVF|fSsa-C=`QYB5OiFU46RS>sSL@mD}Gv#w1KJW}njEM(0l?ZJVw*0A-3EjYM2+ zfP-#tJkgX|O|^m_J6v2^=(Dic$SZ@S3mNN9Rev=PTchw?JtD0SB5M16{S9RvMVd)N ztMOM3C){?zba;20=&jHiPxOdfC`(8nVc~ud!cQ^J&uGM}PMr6mqHF|R87^I*4bUEt zR`^U>LC?SfcDfMoiU?#(kmpx-l2Xi#J#PkTHvY0sc7rReTA3xyw>FxZI<6mz@oMYD z3@$7i8v8Kr;pZ!8>x0VR{2WflD%wx^EtX~!iFm>XP%MWyPJVReZQhDxq?T21qg5rJ ztX1w`3tCH#p3}m9;*MZ}*`Y*wyg;1(8bpQFMzd(m0LKTz_E|2X#rZ11!c6DzQWIx{ z&>@hTCxwIva)i{HyFnQIJ?qg^e<;pjslLT;_vh}t4>r0d(#E566TNLA6JIfzU-RLu zGOvB9Wv>X2i0#YJ`a}!9(o}8hB41C=X7lQd|4P0qw}EQsiV3iE3@*l-veNH~Hxb{N znN~W{-rr};dE3$>ql1^cGpr9saAG7}3*l8Uc*b`D@nXSgA6SKfUqNcuqoQ#UYlxvc zoaS1dDlh#VUsk5Dj~i{(;c03Q?_M|FzIj)*skfZmA+WaD5X*2!Kp*xK+n)pq-FsR5 zz#BD1_!y$gcM;EUmBbt5Mkg$tDh6OsGE@_MF+zgcvArTOUolXB>q7(4;${x|y(rp* zN@BKfc}#~}!WGiSQ?bK9<dy&Od=!vUiMuk})Z`!`$#teyV+9hFNJKz6K_@AT!lo9r z*NRLZ>YF%>cF8Dnx<9};esVdIk@UYQm)S2xWNU{$Lok{zGC*j`9fj_plcmNmP<o#a zZL8Odr06TZSqqnifvqxa5_iaE&Ww-(L#<oumdf!BMrH5XE>otd_s{bAFfx<Y0eBr| z4k%N&2wgTZY;QY5o5f=*9m4Q2!$5rMspvbMZFBe_&SbA$JwAniqN;I}Pn!UZ969|6 zYR<MTn6l*qLdot2VVg6OvaGT|671sLNhGNI&rV+-M|CV7fEcB~%kIt}?e{f1-|r+s z2~3(1IX8X=2Dk?5DzR$igdvvERAHhC>bLpm)!t`1t@ewhvvyZrE4^@C`*mN(@`>gG zx=BE&iKG*A2A%pq3L|URiM2P?|KLl&)y0&>%RRKiOkxm}vJKW>tow_NjE_3?tb$g| z_AR84CJwsIe$Vw~^#je&FDk=RU-$Y42Byv|*z<}VZ1<eHX(|wZmhCX;@@e$&Onp0E zb3U^ETOd_+w!`bbfUi9{8craJIj~z#m@c6|t%r&8xXLQ&-jB<w18T?A7k1x+Y9yOT z4Hz(SGc!s}Ox(WIJY>-dxIW4<fP{<$T6tKW{DO3)B3wBD5aen(j?^yQZ!5UDOXT?M zcWQ_`sgmveJw#FgZ()QnP&-nUC94?&!4&FqS-DW9{5<67r0SYXWT|dZ`-XYVsA~C( zd=LpjMzCHEIHfOS5Qey%0JRsba^N+IUr^*}iU4i0R=0<uJ|nV?=L?if2cpQtN&FeO z&+GU$;QQJAfOx(|+p5_dC}uQP7>ewHX*EYxZapn-;@d6zSZy~yvDxQ+QE(<l<R@tr zU}>a@vkbjWGydQg;NwWDmT<?qN<~F^b`6|R@(wU?mnC-FyE>E}3s9I|EMPh@jhnSS z0JBL2QmoA~>WBbmXoz_?q&GA2VE-0@iDq(m9@io+vjWWKmU_z>TqTH?zUr(C!Zi{! z5;v0F^p;LwLF;oJ98cxP(!t=OK-*^MmA0W2!ic#deHx@G;_lO^Q4)of$pJe#ET$>H z{M9}c>T)znA4Bv%ku|;C*{Im+_;z-}_VL>2tUo>^;|qFKH)ojgQIgeCprhsRw%vS{ zHgTB_kO}S^eB#pY);{`uem$Dr)L!l9O+ML#RXipaH77E~+WK(2uJ15iG>Z1_F^7TJ zTCNXs8OOGaZF#}VSjVp%oH}yJlr%IrP*OY!S*pe`)UfNe0KAXi{(yBavCw<ZQ+kFa zv255kpr)tY0cLmv9V7SNir4}GW?*c!%v>eq4B>-?2s^7y2X^F8u^At2hSrUIFXcr! zyhNVyLUb&?i`TyFq{ejlSH8ht3D%{8c~Lu)(3J~cqI1VvMPIs;J575&9CqFJ=(uiu zF?E#Wl_Pa1Y^jhGbbs~{&)Zd&awj41-&<aiPkt)_NqWl+Q{pM{f?eKhOoF-mY-7`v z!Y)=9E}^;+o{$7`AT4;)&g=GJGX;p>zVVSE<H8I^S2{i_3Kw9_8!Yie@9}ZuNE3w3 z+8>EC5BplAjEF;k`u0~7&ZvF5Y1x8_AbiYHeQ_f)x~gROba(Rd2=nX?yP@MK#-?+6 zGK2p<3}J&1%^^YP*Wg189VJDDnOl89B2R;AucbsTo)=Q9F^<K<-z~ID-(kg7S5l+5 zcB6u+E#54cOLr2mZuU1zy(npG_m%V7TEmaGSCdo@l!7hwnqQ;Q%b*&lKfD*KGBX<Y zwTS#Hs^k&q`!qX=yb;Z54Wkc~#3n-CbjBIJP=bgjIzU|=z#h^hok30n7piO1rz^Lc zRTo`@Mjuom|27AFRdPuO2P#ZcEcNk+n*(QF`2+ZoW$OZ~NgBg|6=Tf08FnNlH2QS) zuADC1rplrtg^)nL^fDFqJy?$Jad@rV-sYWNeK^rG`xeE~`cYgvf0NA-_XY>SW>y2a z<5=D|-&1{>F%?_pXMDM3?^RLIZ2|NBJ29$!+7|NBGr)QKxu?nV&;0V<6Fkqy`%mFh z!7|rvAY$nz*u_8&t>Gb7I>Csl{Q^BXxu}kxhOMHJ@M_ekaUzCWvcp79!pp8NfX%6F zzrkYL0t<eDCa4J9wd~}gQ`Y`EeLiBI8S6BSoj`BhYf5eu==1z@b8yRK*(fx`Od*0X zFd!{e@ba#SPT<-z^Fu3G&URb_O_>|3=oh~*a3o|@uMzaSM!U8wkmpJc2OLurpMl4F zY}966E)1N*`xZvQwg4A`iM+q<D7pyjHNifAOH2e0IbIaV4b~-czn;0d^+%3Jd@>XC z5IT_@PA_Emj#ODAGeYOz*0Mk?8e+H|UsID-tL_4>7?NogvubZq2J55!j{fs)Lp7YS zyX~aG1Xxd3L`SJZ+iGDIfo0vsB}I8(7S`L_n~>H}h?jucOpfcg^a^Rq?!qulT^1|` z1_pn2Uc6i|`PN~WG@=o}T577Nd@OfIg1(|zOxw4m8wE&p`dtLtpc?`1WM{`(J9lfH zjTsVSLOc+7+fH}~%vV~-C-IPMuB3X8cZm%_cVlmayt=}@sEk?Vo$f+ZH(E(cW{_TJ z>|%q>Zfh~AF2}W1b$oS+meiutcW7c<7y*L#4O~|$+c>Ula)I!fcU5>QRH!aI=uo6y zw_bjQ)zxP`D^W@M8iCYs^+7g`#_C1)l>yVe7O2ZDz_A&vJ@|>69@fN4P9VI{(_wm~ z`tp>H+CE9zy~ricaz&USUj#{`fjEWKrqNdmG!lU9=6@5?Tz94YWz$)LS3q!5R7R6f zobI-hm=Tq{6lJ6mwL~C7Oh+O@Ne2@dSy+T@R`2XpO}M%{3^6GHTj*n7MgpBw+qI9# zttvtpe0QU)=C@-&PJwv+vbWkYY>zkmy9wP(GvCxChjsx}VrDRjwga*h$;=M);h93- zn1y!J-fm{^X%$+h$V)J6_dJ!hTj9o5tLgh~4_Npes-Ya9j?=|*?0?LFNCJyW=m>6) z7cYAdv9gS6R=hg>Cq~(fn`~%~p^x8WjuxU4RUGt~dQ^<Dm=^<hS<I&1t{puQY10BR zZOT%Htb~yvP;vr?0E9kqD6u}%_vZ1aZ%MOdFEQXn9weMZM+4bMjQQ$kn2p_#Th9uk zrnp)cZANk2pXLsiNi5|H;1yrU(l%N$2`c;fdhT@Ki01xVsF<+<_Fh|VhiEa+(I(Ep z6}0kEKKReqWp<XrIS2A^<PsGHd0ijtAF9ZNn@s<*(JCBdC*k7W64}><Wd<AMtMJbd zYm<Hdog6%@=YY<-%5D_vEk;Zu2$kKTvAmNA4IJYIk|yGFgi~jlK@Cu|YCvhT*W1+* z@7sXqTxo^wSm3N~_u!SH99%-b6WD8Neplw;sk&0*vUh$PrQ?w60%T2u?m1ssqpPbC zUo^=><kJ&^>||-7F|WG+`Oh>AGb6&+Wt?)x`}YEMW}u~+R=m+McnQP{hUucP2WvPU zL0a!_^fS@e7<q9O*Nh*l^iP^!OFqCOs((yen6JruNl3tKnWAK)qeEb7WvBYPHTaaq zT9DQ}Aldk5nV-{E;neCK>lc9)Op;{t)_EykrqhQ*7W|PZjq)oz((yD4iI>R=Tf+iK zbwyxLY<dc6Wo=LlQbbCw%jpJK59IW?r_z!}>vlpYqZ}f@XV8Pc1eymDr6`r=J~3)K zM8~wp%*UKe{nO{?5i0Q10**czF$t{XalKniNp4+A?@UVN=;)NwU^Cuqgz)Qxg@s-2 zjUybveh&C(-Dr7Uk=A_uXT?NZx;The=H+7liKi;nJ@0A&ND8yCapc&P&3D8YT^T#F zvU9^bfXV@<1wRoOA#9`9G!g6mv4_JHQDs4YVFFL9TqXH?_l4+*6Fd1&^yP=Or$SVP zoX8{2qaU5CK~7EKZLRKLd2aAz2v7HV@a`o+Wza*3F4lZ72dc+<w>HVg)4uY`1x;Wf zp}yl0m0w+MtEaZ*3B>zO1Aq;l93QGLBdzV2R9^HiZo4l<<NH}bFAQMGRBDsbC*bsL zZkAnGSXvsE2zu^J?<;>L`gRpyv>ZfdCmPrd1D6Bp_BR>05EZ{+9qa$lym4Ed*zMj! z0k>mXN&yHIjL@#Rf<N$Ucr3^>nbqzMF+8W_9z2~JIVINpslR7OD^#~_TQE!5nhvg5 z#6H%gwlypKNBVataQ@@KqHc<2KrfJFQCmaRqucnq_}F%g*1Jh3)&}>Awb(p<r35po zPrZ~Ef<OkHOXOYpN*iMF#?hrw;P1ycZB^CtxvsmV#?M*-?J`wF-Ux6!_5&IE9e?;$ zpW|Mr7?$R_%U|f;rQc1fG61#i&|?DlIi47+#!TysUakjc7=gMH5oicM2R;9o+Q&Ub z)%K!1AN%M3;bG>MG<?n#yc3DOiz^H^MCn*0xBE2&J6GgLs2QmXZRGoLz~$Z=F0e~D z`_H5X?xe@LhAYmF<pO>mzAnph`?Snw{mL?TNM-Q33LKx$#=O}`hx~;MunGTDMODNg zXFl@%rl*EKH7oXag5n4~$ic+^xREuT+TTbbztur2#VruXsV1uAY{KuhhVJ9-$OFXn zao*YULtTb~7sP(f3&iK7+LLP3>=d-6a_<LB-Ezwb%aso%_CfU~4E!2fIcmBl;z5pX zVEHq1m>Du{dHf#QKR*66Mx^J1WTWYSpnmW;EClA`pj`djB&y-UK4<#UsG@jIlL0K2 z%ANL|O3&pviA%qv3MSIiW9H~FPA24{79n5Vk!X^YICBWkSKXLCO>r+(ihd?__KRKa zPS1a-x9IRth$WhP&Oe2bLs&&67Qp&=K+BzktvsHN$ja!n`oxcRrL0Kuq`cVSczwI_ z{AXk6<x*^OSiM+9Z?wLlcOfz#o_<cGaeQ6G+jk|O+s^?iho~czrTY*`w=`8Jx`e|G zrl@ExTmpBlq6Y3K48=uw3lcbt-W%nV5tXFdV_tM`@Hbc!bPunBEMku?Y;6h=qA@rl z5u=VvVBZzi??53HO>fnLDL2YidigymsBCZ#^>U0m|53x%ilHHW?|pZZ#lhTDQ3}Vq zj$MNa=%%W;kEet2ko}&j7*LbjVwdAueTn?I$$aZd(}QfV8|?qZ(OIxX)pk*s?v!Q# zK?J3nAteRr?gnWXy1N8P=|&J3x@+i^?ye!FLy(g6JMVY#1Ln-|#NKP)YaNxn>x{ro zU%2;{<WD~%NY@JRB~pqS6OMM57nXfg@4MdQ;pxuSel8GFcwwzA!OE0j+Ole2cgR1o zt^eE?B`mADh|i)z!Otk@=uAs}ino)i`0DCgC?ZZsw(VNnPpKjVfn^ijDuqrg;t3a5 zrw*UC;5)?|(!#fjJ}tbWqDC=_x$GMiGj&9BT;@j|?P4Eh!hMnbq(M~QX9{`JUCr0# z-a+kutc~!HA<CKUZAU`L!~B3f{3{PIwdqxq%7%#*w*NcThmWvjYkP|kjJ<bG6Y!pz ztP*KknXYY&hP<ap;d%(fYGm?0d2HVRV;ua~UU)2LsA>mEVP$4!qf1vBeh~!aDBwCD zns07(ox+SA+3@9jJ1+-91uBv$+(ixXocZh(7AA^pI5=qhngSjlPISm!!qA@yJbuq| zxp^lsLegG$a(as|)k=f0Qigf9k(u*1uU7IrXDo78-v%3fuVK5ukSS!f)m<&6HB0OJ zSw-Hcl*z9oDuQ@+=D3!|rdRGc{#;0M?k6xHp_DvV@T#V}qS7XEAukBEr}fx9nRf`Y zms_4kin{7^IIs%9a%Y)cw<YQx2BB}Uk3$Xg|AJp9!tSSfyo>wP_b>9Y4sRD)CJPO+ zRV7-&U;Z^ccO#o5G_=_C7=D<yEE`64gSuA_`Kgave`a3W3S{^8Env(S`!n6IGBKqi z4)TOd0Fwovx9r!cB5RsAliiXa-nB%q=8&;nc%QY~p%!YXhFIDSKm-n2TWm~8-of@k zzB+|3w_V>ikP?2MRQHA{ug^2Z%=9<8-2YmMiT@|$D0!e+?G$ukFrhVGsecc~yL*MS zAE>3?C)<9chw68Rh55%p$Ui>!*I&b$RJ(;3jz4^mdd=VC_aL$H=HeI9QDqja__+g% zODrTu`p`1L$;gWvg2*513UXws1mAx5j;f-<7rXV!l^KI&?|*4_hnaXDbLYZrvqTVT zD;T}5@ZikM%=}KbOZmOs$GxTJf+Zo91-JEArU6o#-LC8p7ERF;<%*yD)6tqBa*KwI zC@~I=lGAgj>=fUof!6v+B%Zp5Kd~3U^OUBviemd*u@HSYbbG5*)zs(Sp=y?QzwCOE zImoPggLuUY@7ti&8<!@s^!$KVobi{k=5WDZ%T-d=+NHCP32wc;Rh5;ea@9(EXU=+= zpcWesNWse}pSj{hQe{-1d{d~>*7x#u!s!4|;BTq;VEu)a<gSKyx*x0KTCp5%;}qOT zfVx;!(?ZnvZMQSIhDfGAxf1z~^*1aV&sFymTM!}>rp8BnZJwRm5{`wje}7)qzB&Gv zezF}CAS|mdDxDb@Q61*=yX|FyLv#yrHb1?{al_w~gs$2O@Qf9Um3rOhT6Y7hLVu6e zngvxp*zPt2dJvF7W}?@T0PcX&!EWlW42xWM3cl_*O!i=Pkgtb3g;p%!8Y4KJo*LDG z0l<LU7#~kgkyz`cM2$Us8Xh>2sN<u~b_b6Dwf%s$%$gSC69pQ;AROPABDSbvhagyH zbJdwq;kYSS(h)o&o~LX;P_Y!J9YamN>gp7If>2Wb>#e>sM1tV~!@%x;tDo`Vqobp% zFe2mL_0T%BMCeLJ^)#JO^YQ6d`p0Nu=_BWr?Z!slt^lkIwOgVX2ZA^G79^2)2sv6Q z)EGs<i(mN0wYD(QyX!dwQD2&Lg3`~wD~Pt4e(a+88rH9CSX=El?+7`?`{<T4OJT=H zAumTp{#NnEx0bg;JTFHGWo+86#?bmcys;W_@7y%vLRIz-!5~*Dn_mj-aGu@>Wo@xv zYt}Ga#}|9i)za8y?#Zn<`SVh3v|C?a8Cc6`Y6&)SS2+CFqGH_Bh05wf?+ON;VToHS zA8DS6EtZNw!s-!ag#levT->?hmM>o$O?cd?ud4(Plq}@X$e@glj`%4@Qd|6zBo}>S zcW{u1Z%8RICJAdReTE(a^mR`RPk?M7WrT{P+YfE?4>-s2>-?=0qRog90F+e1Um*e= zSX&|==p;fQGt@#Nymy;hBPRUSr2^WB2zLvK-R)}rpaqZlwY81<5J)|<Q=390Q~Am8 z><?;SkhLsB0uogoV%IU%iY8lG_VLzfC{Ul0V_oSi^xr%u_+Hx6OiF{GzO0HUn~moN zC=VA*6C#QL55b=LN1b;lJL2902C^h3wM-F3W%%zWMTeQ@X@)?yl4Tk@dk437x~olI z<GRl|JYfxFF;K)rKMgoeo~~#yA6&2Aob)hl{qS|atdJA+Gu!Wt<3anobgt4}URl}r z&}+8@1EHbZb+v2N7n|97EaH446OAPFiDqi-9da?onKV`tH~81cd-2RyaUeP1tV-(e zl=aRvIEB!9sK;z%CYlBYRtqst$LQsbZf3B|K~hU<If~+g67zlq)$;ey`UjRjFndGe z4z1|E_e8e-B{xxQl=;-Qel#G-qa5PT_U_$duVJyK27GS}{e!>tK)}n|QR(TwyX&?C zHF^O8Hh$#yb%_ScCi>eO0><;wNG<FO@<@}$?V&VgAxrP}YdF~_P|y3Zf_+X_8V;g_ ze^a>}L;*dD00$#$%GR&am5Pht{tr)GkxF5)QIB?L=m-Zg-<g0F%D+GQWIV}H7?V_l zH^=zaQdBo<!0}<gozEratAl+R0m_Zd!eXaFEc!u0y*N%`Y?iOe5OcSmhPIRv4JXV< z_@9TcQ(%{{wC(gsjZ+h%cr{H~DLZ{tS~n2=K`Nz&&Rc-1n~m65fFgK7JrO^Dpv^jD z#^pe)9W^ze{-E&~-7IoNuG*^J5NM!;cDH*o25~aul}J<yIu7*#rCC0Y1!_)dCc~7z zd&}OjQ)hEN^pSuDCVKv+`b9!)F7*+c9x8OY|2`#?S#2}~oSA#a8zzio3)tVBJ?bAD zATaKzFMh}03|6tT?PK(XYQM9v6)GaSdFQbTsv=<LsUy~`R?QQ16wyRPm{ea&bNsJm z7&L6HQ*6`|COhd>Cu+%vC&YKLv)?o-#V;CH>dnEaY(6h1JA}4SBiOy0%4J~^MTlqa zs<#{q(l`CHz;|X#9^Q)jkcCVk;WT22#(~Ml+SyTlqr0{j!w0Aq;|barvg7q3E&>9B zTgp7=Gp(5Ggl=*#Q9yMsXD(Ea!(cYb5$4g6HE@=GSNz9ZIvDb|NT&n?h&9@VfNi~@ z@nqM)DG}^;oqR-u%;wU<oweFDaKlEBj_-^j3b%YIFDeRXx4(X24wkH7aEgW*ET*(( zB?>q%E{^*K-xp{=mDZk@60Th*hN`S>CD#$Ab;bnIMVqrTh36JZQH%Sp$t4_;)Cpwu z2JQ4P)50=dflVDvzPFE0PaLbw+V5Ns@;H{{I|OTgFwv5c5jqvA>ufBAWyF8c-Z3mR z-mJa6Yn<QMuJ1ql5$WgL0f{=kO9=Z1Z+(<<cW*e4<cBZT0wE3cb)$SK_*_<wsi{Mk zavmOh-j_f=$M+1ao@VC2YNTeZObHdKLxKZlf%n|ioM8o6Ti^TI&r|zUd54%RsX9Cu z-wJue>|^|QNs$s@OlaD=?JR2UFIFU5wxr+&dLqB6EHF^^<j*(QzU>=HW&|b}3VCbt z;w^7<rj-_@^}&xLCK@}Nfm6JrG5zQneoq$<tKXl*NS`hd_Fu|whE!g&ap->d-feRr za&NB@Neo*9ph#{S(p@L)vsrpUrM&9tV!x$d#A~?5StClPrV(d%xq?jC@xna83*M!n z3=Bv^aX;kbm~Qe@VyCS#_}P*Hk3f6Hb(d8D^*CFT(LSlPeLO^PMV&?<dkqo3RrjCA zlcRG;d-FvbM*BL4v)6s3Cc#MlLi#tlKb3RH)XT1g9AAXN9H6dUUUdgL{%!|Uk(&Is zP{&l?on2oh%2rf6jOjY@+E|;*7wE&e$c5Q`^*Tkf7(r5m6p1Nr^i0sQ*lVEW!eYKG zti6^OeQ(L29XUC`2&ECY4#|RDekf$cQg>QoyZK%hM?&XcXW%@|Mn`A%=d)O;mZs+4 zl9sM!yn`E5Y<Teds=!MI4R<#=YU!yTeov>%=@Ci1E5$brCnno~v?ACiUAv7*Fu^nv zFW!toGu#@ya^GG*`qXKD+h)>>UnS%h>V%Hgp-j#H@H*(<<Qesh6oWh+2sIUWqO?~~ zK*$zuN{RnV3Ep5sU9`f7ll#8C!{ToXp|i{u7W-Ef3U(1`YO7!3LH^->u1*%n8J%aa z%0Js4f&+-f<#y)4h>?$taq{)lhfDZfn$<-9_hBM1vW>+=$zUPLmJqrsvJg?$v6J|T zs-uX3az@IS6iH=Yj&G^t(ncA30SGt@)r({@Gc3z#CFL^yFhvX>N;k!?Z6O+w^ajSm zKFXWfP%d=f|N2Gz;3)i1-m?`dFkURRLpwK1U@dD#*dotiP{Ik)i;$_Y!};Ay*9d@s z8j;I*>C|bz>H-DtHcDtZ5C}4_{{Hx{CY>-rTqY##OG6k~`NQ9zwhOaSKo}x3(r~4{ zjRg*a9f;NF>!K7S2D1kbjp3Wq;tfjRNbuqf`yC8dms1wxM;JRC-zo$xW3!|o=Kxs; z{e!HgZm&;Qizh+jz{oCnv~#3CwflpWVAlrFNeT;#@w4M5M*j2`5<+MmRky5(8$fC= z-!=fWAH}4x6=R<pv3bF?-PF_sk?RWpnZpiBLHG$QGci9$GXN$D$1W|yZT6r2p<~Ly zU3uD9t;BNgYLfng6cGOB=mIAm4m=(kD?OMFy)yVKOB^2$!>hxHe<Rszl;WeFr+uOF zO8$IbxU|@bg?AMeSk=P3qM-6`>)Gf6K^i$DENEMBT8NdRps>Evc2vzsrqgk`#d&95 z5MSPhWU=mX>iVshw^U?f^FzIs&B@|n8j`&f`hOHCV1^*=ZgR}_ZS1S$`;G97x#`1& zRl?UUp&7tPxQmr`z*DnWTpCffFYw#-I8*D_EK3&9GG_X%wH_EDI1dtnW!Ke>t)nJG z)<1$dot4Re+2Pg#2Vc`y11l?}DrCd3Af8#C+7V)7MNgmhx-(6DitQVXgBrh}t>CWI zGcnCQeL)f=jiYnw=uyltf+7<t+fhU3L;YVis1!|C2)pyB!FI?t^k49hT5S3-SXvUt zW^v}KTi%zL54y*y#+JJdu!)Wq7`VD(d?v{Nh$RUvt%dT13LxnT>A?LwSp^T)xn25v zKNXbseDaPkgN)s9t5@4Nrp>5^_ZLw2uTeuEYEPWTxff33;u7kaLkD6@BGHQNCgZh% zX*P>%9hFW!w+`aT{*%FiE^>~DsdMC^uB??iU1$RAx7l0)mY)|S;-~U!HZQ5V%pZb* zUwhz{c%gN<oR+qcfGrrv;$zv+(!7wb|E0DCVN%FIV{vwRJ45f*c<pn4|NCtHe&t{& zq^dFII1m65?LA7WjoOH3x}Kea9u1u2ztIz+pQL^X)>z~(_xm>OI1NY{bUb%Ob;uZp zRyBz<Q6T*HzNaMX%Q*-+sy*D=W`6pzq|2*<XEm#i%cozyM2A}Sr04LXe8V$zT3d^i zB0=a5&ZofFii(Z*kh)0#HVDP6gVyU2^43oSRZ{{t?a^4qBLxn&a&l62*}m1L7c;mH z0KE$cT`x~BWiBlr`b4+|N%>truXmMH5wwVx&u*bCu;3>8)rPvAzHPmYliaMFd_Kv_ zLCSBCRdALgG!Ls$ZW6c}5nIncMIcQV<YpXXzTlcfUHhKHPtFqU$SIs(0brUPt^Qpb z#t6+wc+D#AUEGO31SivvWCRNmicU6Oy@D<i5>mhg`MI<%)7l86chs@WvQ%gbKtkg) zXDJglXFuA5)I1kw-MbL1wGs2GeJ_i_FQw8gQ}{HtOEIIbgE|5;nVO7i?w(aQ6_bNg zQ~!cq*~sZ)1vJc5Bcwkkc78mLA&p0n0#~HqY7KYF@>=AeB1i^CrnVrsr7{08z58#n z3jlU}T4$!uV$HuP(hr}~3>K)sS_XyJgBttGCsUj^L_O>QgXNoTEiSG|D(e})63+^X z1JBpV>!)yJl9@2!JrIS?z1KQ?Ka`tGu2xp256_QnOD?S83pSnnnh5pw>B=Mj@}9P% zfBSY?29VH}JAN)gJ|O#B$oPx!D4Rh6C=mfzDyxah26;7!&yt;bUNWc=iI&jeU1-We z->ySzOyCkU^|)o#dwJl8C%KZSyvAJ`2gS@u|2rr(pk|)0U$Or@;i9HLpOXa3toK#7 z%mX<vGiggECVLcZa&d8bQ&qZ?CKp(}0zLH)<^4B&o5of5{1;9GsfL%-`<Lu*n(=Ez zZabZ+@Xn0v#W!n>wx2R7i5uP)WSfzpsPfOvU}^oa37v(nE##Auk)h+gz$#t*KCD^D zy_x5+2xpf%H_pEfM_BiYieH$f>i&fV)!-dc8gsX0fRU!p{Hvanql}=9)?`{O%c_Wn z75B33;bOqw3Z`PFqZf}+`)CKR9qZsS`ETE;=rlwxc78vT@OmYF_UAtArmH^-1s8Ja zYM~+Zf@h)#D~m)*c;dQgqs)}$RWe6c?rnF~0l5%$=mfV$h4U_#XXM>cPJ;o^gUa_L z_eUlXZv=nm4AwJn`ONE{CXKv_sHDpd+hhlrE2jK@B!S4@-8f!?F+Ss9{I;XGz8wuL zHLK!xzL*+@`PgjVF9P6v{Ir9eXsq~yLm#IIps$K_AbEx-*Ba;Fdig4y<?$&lX# zzWn54DtyQmdoPYFJ7`v!MN_?>?trrZwox{PjdIw`lv-T^HG9v|mKweAQSoL9MFUQS z?OZv}yGlur!)KRXp-!Q%XTqDf8vl?`hY*_;x!8HYHOHrzG%M5v7nI7ynfn5APDwpu zio#lQm~%B_Kv>RJfp;gMOgbEs@bJ^_4<34kz=}IMrVqzCe?fqIzDsnqw{Z+Ef&An8 z;iN`6lOOl+zXDCf^V<Heptm=Y2_wLV4B1~lb4%DNRjK`1-i0fQ{rTe)WV?LZ6vM|M z=AeTx)%YLj&TcEzs5P?G?ea{vZUkX03GO4?9TXM1OYwhgo`?eG|MEi+La9-B!TlvE zCCdys>eM#|&86LGoQ)D<Yf+r7fo$H#eZEMJ4Z^&h;BiL|B3R#Es3)Lz^8l=YO0NU{ zMLp8oLNBAr^n&N~yJ|{{N(*v>mAT%dT_>Xp#EO@ZCCjG2B(_>0JRq25d32|m#Y02} zd%323H4VN|E2F`1EB%fM@0vqq&Fr+2)f3V)(dU7hH+VR_`kzABF`f>D{BO}#=FXLP zeX;tk^Do+0V7VG1g<Z0$C2b#jGI*|lq0f}H->NiPRu59p#RJLaATH<vq^DvDv;-S> znh$DP3;R`qElm6$M(yZD(;j)0g@Aq}tNPGhMYJ#f3>XOlxLc``$}#sfF67<GlW><Z zN8i@5A}hckIQbqsK`p93b;N$-tZL86pL~bVXq(!~_gTT>&047S@dlU31vn12mXBzZ z^PJ{6Ft#;3iS5g`N&O0)2%Q#1mk$ra;CTX6X^QJSQMOUovtoF=8#6e<YX=~1JtfYN zIl!kmn5F_c90ZxR_=2}rtze5{Y>vHi*k5rd4K+=>oEt)dl*qKlwGOAbzPuVr@uRV0 zNIzgE$I%LQD;#k6Q&urJ1Q+sJBC+Jzx11oBHg}Z&)7K*XZoS~+Ixpv)ut|Pru~N5k zZ48|1LebJ4B>g(rbPZwNABavmWw%QcoNYN|O+{u!?g{vJlj?1YIE&ahidjj_E|pq| zaLuZlI3>H{Z3EcmOcI2<yHB3+1rm%MN07g`D=Etz&KgZ}-_<Hb;_fqRQVFSg+@idu z#2#=i4Q(?+Zl;O{Jz+r<<$+E!+Z8OI$^H?x&THno|JT+dD74MdI7#?GZ@S9B;SnJr zsivIybQfZyBaGt>2ts9ZPzu(o`w)8YhS{76f@;OfK0b!ydq<n>dc?hW8$V=hc36nZ zitFE?NB!<uG2_6NxJ-|ylqN!Jz^zeZQ$!biLLp*;%1g!0VsQxdO3=I6iOJeDr*C!0 z-e%rsHf7X5#}qbg?_Nl_89S)ZU}x$dL}+WWJ*ehQbF4|`W*<vIP=5t|$IM6Uj<8DX zc$G943UT<6XH~bRBO72A2HDC1av>MU;j1XqU$kx}K)P3m;Li$1h^~KoUP~O3E`4D9 z;iy<7HmU2k7wO2b+3u^mO__K31p2hI_2+R19u#x-oc}hiB@|VZVAKaGLbnVp^w<u2 zIvAe&$0mZVmn67fk(Zegb@}}lj}DO@J;&~1pkiMqc7Jb+PJ^g~nQuIOcBo?=1vx6S zv;Kpr?q=B%{@42ksfp~Q9}WJ5OmN&ru6c{5KI(Tg{!X_kymG?b2X@snHCLhWw$?tJ zhvZk&<<{_<uNKsjO+y=^0oP>O_iD@~VtDybOvec`Wv@mgepjSIm*4gH16#wUP80&Q zvbSd&kLTJI1wwp1i2mQ(x1OL`cJUe=$_gmco&eadM16s}2%SumkN2Fs8ikZ@Db)dB z3GPSttAEi(vJ{%PG&PltC4Fcchd+s4bJym7Yr>@1&(sSRBQ<wk(2XQG#W0-%DqGz@ zWg3);Q4*kAHCslMTmRb?r-OqEr?<<^nderNGkWOSi{*ag+3c(n@gciZOko07?cLpn z{xfN|AEUHtG>AIh|M&&P)KJ=it_0i!z?-0x_rYP1akd4bDpoOIdhIsCMY>yaDhdw~ z*k11onDrv>chpOmEZ#!0f5Wxsm1k6qz%nfF{6!>p%(Uy(KOj-eh<~E)DspTzknhTb z#^=!NrwwXP)QUZ}i*YP51g(7vWr%2)hL_5WF#~6#6SM<?X6+LHG@7IFtN8KjI1Wh6 zJ{wLS`U+v%{DDAB*CRC`Gkt;?@3)&NbW~XIDRJMRnUAp!msWy3f8n#8SS!Qr!SgPO z7v0=KoBmkg$ksPi1fuPeEgb4Ka!<Mb5>Cvu2J0yk#f<!F4P@q_20@2$9BqpHUA!(6 zXMaaCV2JvjJTf`EbA?|XxeRjBp1CB4IZp9Tv72qFlxfaQA-ld95gq=vno8R3Qv-N< zpR<iC@y(f2J>N1aJ;c{yGceG=e{(Vs>y44$9(pwL$)#2npC!#JuC@)aw2a=phZiW> z1<BlnrIgRrswBP)3vX;<Nk|htvG?GWlPcPfCe^A5^Ck{pE90kypygYXLlrKCl&t5o z85PI=d4?XQ{b9rEd`0!G;<F2Qf^NbWQfB^M2jeGvTFCQXreslRV*A;D^yC;~{2&@; zr>Vc=vxg!ff<D)G;=p%vwWVNyz!qQ%xPE@Yf=NC0di>BR?-c&`DYm9zXS>Jj#MLOy zygHOY&9wt0_(2EJ$8a#?(aX^{gzw(YEizOG5f`A6S`wbE??NHD6ILfj+sa$UC7;tc ztIFEk0Xs49KS~zqi#6Pm{ko^f!yO9EJ`-tcN;tbRiQpIyRF`U4l0o?u$wC%8bM_ds z^bH0lhvUE%m#Dng=fA`OZ3fj_|IeF{9n*Id@RWz$<7j?yqRuV_4dl|FtNNy9%6ufX z@)kc0Q5ip?dN1(_{-h!3kD~(zp;r3%?XpV8!KPM{#W%}=fv{IYzt|gKx4VDhnSx)B z8!ioVnw4j&Oi!gP3LmD`r-T;qaL6>^vfxZBC4G#Zzjh3={aEs{2;U#<(uCdej&0hX z1ev<<-eRkXXmlvmy-l>f28inj(;W6^IS|r^N+AnxSf!%c72+f%C#A6R9-WVIY-Cnv z>6^Vs5sKfsY;_DxmuRCr4(=@no1En3wbloVZDWb?UQ>W3g(;OakxelE*oZ>}1+sD_ z+!eA>;W@CAt3BFlQeO`bm-jymA_pX1lU7w!LuNC=4{o7MJZ%TUg#oDCS%cP?Q2`iW zPlp2~wNF>7`dAuKh0ZNNIjZ&H#k%r@R>F$QeH5)$9YAXXkk|SD5oF3Vxh%(Mwvr}v z2@6of+;o;DYF6jpuD<UWcPCD>^nvYTc)uvdS(!8_6aLon%=Y>$g9C~v*1`L+Qu=MS zU4uLywA>Ug<r61YK`;A!W%&6!G0Xsv*O!i;`VV7&3q}h7Rp#8VzM`~&TpMLdMHYF_ zAFxF#wQ2{<VMKjDZhz85xj+QNE)8p_16<_s6Sbz#xC93zHQ!*a^(_k!l?9`KhMNIu zC4_bI%IsHY$Vs^##*dS<hb(sqs*z?O0J#SqYJj&x3V8a~{tODuXM~H5jgIn0dKp&T z->w!XFV+0rG6~dAm7tQ{{WKyDExj;ZL8EuS5~&M*VSETHia^JiiOJOvngyzp>(doC z2kk{*f?Vl)$q+_2-TTJ<zqS_rG;r|nktx;J7s0FPcI_6T{D*%c@_55ZQPwPT<d*WC zB3~H9mqJd4Fo*J7$0enhxUrpBIj;&=XNtJ0>$xhnE4Nf+^8810NgKi&n+H~$VT7#= z6)dp~Ta@0{;<#t6NWLGkm;mhYUg6EWj&OEG&v6J)Ka<zD|NdPq))=&O!m_uBN>s*z zjCN3&30w*0cF>MkFQY2Y3_DMgqt@byU(D3<O<WU~-c@)SVr{vtrGa%Ozr$-KT1wdq zGo%HaTY$kYNACTv*&`Lck~ULB#4*q?(OCN!jUgLM(|fd!&FIR`S{#l1F2IPWfCt`} zAIoiVQ|fE#Xg4@*C8EC_Ck9FFo9M|#^CBtDVH)f;bCK5_dGBBj6`WiuqX1N~bF1Sv z%D0MqU$Z~+zsS43Hygd1vM&#_ku(tSfvOiu3rvF%1X@K;cz%9VCf<-!2E`ttSyx#- zg1_t9$Y(ER-&y#qS5G^GPiBK50{&xY*>hpd%sy0_&I};Y9sxZGm6i-E^OtB37114I zZ=f%R=$FWREz4}H21us~QdDOJJ|nR%(t*TB(eIoKvF)~P#in(=e-smRXq;XPPoo8_ zHJXw9el+bNUq;Vu?&+j_hcnD~>67IG=F=xkF7U^#JxI5&T1e<A$N)k(CR&1P3K(lY z3+NZ1nyyzXz2MmXr+bq~UcQhvicHi^Otuv#1rGK!hNQgG;E50u#X;SH3I?#vCF>J> z1(nbq{ZhPvW%~;0Y{^7du1#}1Tt4iTJ8hJv;kvLLTz+g=B<=IDU7+vZyAi>g_(AY> zHDS-gyujWS>q@aIkRNP9FNJlI_ztHddYYe|Wo*_a!kM>w7|xS$Btg#E9-iO4n8p7s zE57fIlFK46v}`T*?JUMS4(0WRZe|t}PtN<^8o)FN)xDA?$Rn`1Pi9&}Y&6}^a-$b; zE~atX5qd`Y&?aIeF>E#drVKGSHLn%*u;?_T&ccN~JG)-FQ~|jSKocB~)d{G<<NuWh z0HhEZq{Ng*g?wh_Q7yTUnVeAyAUH@G9!pf^!Ex7)xoOm3KnGxeyfPzBE3?a%=+m5I zJKHEO^c9c&C5fCiz@X@7z~p)5^h=4$EErPyDt=m~W`uhW@}f{ISz@t0iVv0n58#pO ztIa~W2qoTQ^?F8>H@q89kA(<9^fdOFHc<ccfo(@t>7YBi9NWX>Z|Adg8D%9kkk4?G z=JpNW|HS)t@F@X>nFP65D~H6H1(h57q~+bZIPaQyD>OhK`ikCn^T+QrJM`Z<jy-l4 ziXbBB(a|b36!7_E{RO!mT4^!ld<`4>8SeOjwMLuwlZSoBAi%y%OM@5rr^pV~Mdm=l zXmoYrPCBMrNV4i`t8D=K&HoA`tB{1Vljzg#yMUp+FX4=$lhO6ae^eu$n~8D*)uyaz z=BUc^&!=$L0Z2g!dmzgh+&P?kB!DXFS^_)_0+*p>{8Ff9Mltc*8g~{WiI%YgeC~-i z$TrDC>e5JW%Xs*X(U_`5ucG!>$$R&W)Z|w+W%@ZeKc-F7G%^Y3M~mptMKS*>4UY!} zyVWF|t~omS$3pjEphK&2!O58V%vm6ANFi_CmRq_ryeuz2+lrcFj>79(`z27kS%O8+ z_hGk*sP2V#JxhG$;bBsC1ZShIMlG)R5c*@?46aQx-Z+lwVwCyN+3Mi_YMeF>-p-F2 zHpyd<z__U!8J6W?J-;vR!Ack^#qC~HiI0Owh_GLcy-BPBho_$E%#yLaF>mA{^5?un zP@o72jOpW(;mawH-ywo#Jzt^Y<=+13cymTlhyDVD1zgKL_oHMz3XnHTi*3TjjIPAP z<~~pN43rBI8^+E$j(Q1rTL_#+2d<Pjhgn2pFVZ!}jg8jx>eERL;wg21n8z_YuNQgH zZ-`Tz0@iR+s>;rhSJ<2jSYyJ)Ub$G?I8^dH-j;9Mz*WH~0lnjWNj$zn2BX0#rw9EZ zqhQ5^U(>CDCmUa(h07VR>s-8R$UmrCVZyT{orL6T|7rl8Qi0s2?s(Lz3iGxB*Vla& z7>@s$dETd0R#&4LY9we6kLL;o?MAL7aA0BE*mv!bq6`%e_CilfkB<a}&1XE{85x!H z>8$fHdinRIyz|O}l+k#FVSjT8g}B5=lqeEG_cra&;cal@x9){x?c3gDu_<N9j=}V- z1GfQi4`i6yk|MZR>85;x-7eO=NT6iHi}fu&`Fbq}$zJ1$2pR|c%pNp|s+h^I)w#S~ zU*7_}V<lI$2epR}|Lrgw>gpbQbr0fSY;9x!fTuYcWDQqqA?5959m-RcDYmnvl4MUd z3@=-O(qE&m{@W58IJV7OnX5F5C0}ULxPpToJs0=-j|Y&Xz@i0U<H4i=eqMA|T|QO> z=t;uvd)5lyG;Q34k^4Az5~&#@c)J@*a5~pPgr%zJ(dkznY9|+#L+FyEX<P6Sg4J9K z((ko;rx`Z|A`5m<d$DpEjobtgbY!HH)dw1{!resR)nFIhikRVdiy!VZPEH=##!G~~ zW%F0ciG-0F+aJ@w#ur){t)$|t8>j6`V8`-1T;5eJyUl^kV*Gj6rjRf$=)>j;(I47~ zRp0=jJaJ_k*Xq%W&_#|#?TH`PLYP+ugp}KKvTQsp1eK>_zQ`#@V2vng7q=)T>B&pX zjxb+fYCt7^9HiYI{|Lb3)oK%zUGLgL8M=WP3|o=_lt<Le$}JZz@$dN=*9bSP>eAP6 zO1CWjSJ;DPGI=y#VAiATuJRR3r@)T78g_-9Ucf3V0aM1)wXQDrBW89lU!_1lmVqz# zQpO6Ofcb<O#%*Ud)!(}zB1gw^F={7%&4SN&c)C8qB_I+-fTMVnV#>wwk4e2nnt&N3 zg&1IccDp!}V}z8sNq`wgPGrGV>c+?(1mJKVxkGIYqlxeD#f-ZRO|H&v6y9x{h>pm? zB#9$552N|*-D_sf7^ao8T?@c`*a*HD_#TioUPr9gmw`P<@ExaPM7*sHua@#c2a(2= zj4upRS^~jyBqD3Ma}y-dx^#6~MLg8y2-j6cLuxetbfHpNO2QP1k$=m`%~g<F8uy<P zH%9c(AY~2fRgH~^@K>Mb#9JELTHL@zEOLivirZhBpR1Q1t8>Jhe|jy8OQd(Z@`}nz zzxJOT)U)-Cu^X_(>O8{e?6otCz-oNsk?s4z6fj&-WI~U>hPJ1kZxqDCMES(NyHH&8 zMSX0ov{|&{%T)OCkfJUjWm!{v$t9pEF{Kbe?`Z*!)bddRemCLLtT?W?xQ6XDJ4Qvm zcaI@Wt)B7?++nT7cxZ6%DPE}(^b?lc@G{Ubt)_cLb#-;sdRf}+&lkIo0+~ws>QeZ- z+EEZ^WVsX4kFr#reoI8Y7IDQ-*0yk{F}`koGHXw-Q4PyaPF*PyyEke(dbjeQMR|hZ zNitm9v0Qg0!@Cwy#^uI74In9!*k}1UJx*wSr^u7-L$lrAIS>KzVtclX_Cy?7<rn+z zK22xCHJ-S*cnqXAGtAUCurO+o5!*06j+t3Fd}a<YLjwjHu7bou#@@J~nN(%!=3{s2 zDQ2UU{Hi)0$HZ#$h>D-V;p{a)a2yoZ17axhyjs#o&s1v)g7jCzh@R*Rm&vmTxWWbh zR?Q84&c=#Yc*xq_aumRJ2AXJSXj@4CcOkQKL0Xw4H`<nBxC52Do87n2frZdd511Oj z6`{^lL)b>m&f@p0AW}~|UiWlE)3^NCTbA<Y@eDv6$?{t>U4MB)l=a$-LLE?QX;V5z z8Z4qnXvDuQC}c^3){$=k07hbQXJ^N`v2VGOb)InB$%xL<b#D~_NQgK9dHK?x6+yt` z!+&jG&d2{w?78q@<ckvd3`!I@_pEFd3OpwnjfoBbo*oX2nD-Vwf@xM+Cj=uKR1?g$ z&9rc6nlf}bU-?>q8UFkHW|n172i$zz>DM`W6NZQvd>@mMiIlMPq?oOvT>uYu_w79W z`Gjq;d&Vpg(!;D%>flAmr;JdQ@`E&_Hio;vVcJ8q^o+2=kIc+n_LAT#n8Ddk-)H_x z^7KHyIPCWN`Xq@pKuqM1JAIFroR?DFmfM5i%PUN(Sn<S_pD(VcaWL<9J~$QcLa_Su zjKjfUd^b;T43!Y=7tjmUZAn@BZscR0=m#<_2S!fUvXNrueVPfd5a5+5s_-E^JffxG zz0cEeE@0ro4!KD5%PT```)@=Z-V88*+Xbkij&p4vpDRraC(kf7zIc5Jx~GqrEMwK3 zKb=JtBM$jefT@ziCoap-l{UQ`ga@f<c3Z{x?9UjbJ$GU|BuU#~aqaC63>X3HL-6*y z3!xRoZc+;Y0W^#(;~K8Nj}(ZX#L;d3+uO2cd}F1@hcWMg`#=KRv$Hn$kO?b}hZ1M` z*0M4xGI(kFG|k{fftp#6KH1{E&idxE8y>6N@8@y4z!bVo98{zWQwkv6>9xe>;V(Ih ztBC)A)j5)K5QXTaA&^~gnxmgf{U1A~-%s5>gbk`N7_zi<+`K>6%r%~O9ul|^btw&H z{EGa$iD`eQ^eM4yAI9XxLmgomoe&*v`<!ZjFg1VZaJI?!xSV;M*svb=ySF}zGqq!! znbU}R3qzy{vGV?5-O}joPJD{QP<!kLCBDw#{p)WZIqFOa5)L%rX|qroeBCYUA>G*o z&69+FN`%#mU<6A)$WK=)3O6^ExRc1esI3w7cF(hWhXiPBQr~X>YhovTI$!`A$*eeT zQV=!J`(1qVThGQ;)+wy{M^UPKNpo$nEtm6Ec$x7XiMh*z*rs(4d@I_M^KcMIFjVf- zM20JC(i}|L@?MCZ)I3KWqM?^MeJ-*(j9ZvCS1A>G2*W^f9+Ww=t)4)DbFP(gTwBfY z+<3b-6ho2bo2ATuz%uU3xYYYgeUfc;ftZpWA1*XqG;|7dt2HtuZh$Y3GeK0Q{%K}< zoX;sh1;O#)11j>|v>p|gc<!-CJ2GT25Z#OdM}W&D1Wvv`Bt3DMu9{D2Kk~?EJ4mz3 zH^@BgcwhZS;Jv^dLf+wsAE%4_*9vdd#yPjSd&+6tm7Khm(sNzYOK%TRBicMBj^h)G z9yRMBUde(trGP*i+GuBIWqN$f|M2TnoWg$2FhZoPjs-hVc06n?W&p?!$uQrc^hdQi z%Y}ObTU;TzTJfqNCH&~zDDpZK0;GDBiE4QI$j3LQ%NydS7158_Pn#Vxd4XIGFkp2o z!-NPZ%>MqkhtOoKE!p0N7-_h2!dbC{S+b{Z0MlF15M0A<AxAqZy({1{3-H8=fnCa~ z<2v&5(@L?M;-p~-hEgMFG(XuRZ8LAStT8hq_Vl_$rGQ$qyeDe89>xB~G#J?H6ZUxx z+f%BXE3TL{>Sfz0#X;z*f6q(EDNrwUrXXD@-n{j}6;gz=cqY&5p_0~YV@rVQ5nY{? z_FKfrBR5nRjAxUs#T$PRN7%fe?Mpf}=gduW_$cgM4{eul{eQORjL-lb&+TmH{CyAZ z`HG#0hz-+fpllf}51j)llB>I2NT<fCw9xt&OQ3wumvtf!J!(YRMJ2}6kZQU9orMx@ zWIx%Q{^0*1O=~*&m*_>y+`~HCps>3|2#6+w5-?}k^B#c`q*)zG*cCO>i}bYUhN6i& zlfa~UrfeojdajFG?dv@5bxaYqx_jxf!%AD+8|+e`Xxd8!nsluc{Pa}IO}|aR#!Gz8 z#>v-%7oPApU)dfU(fS`=;^R+fBt&JTxxY~#3IemPI*`WVxn_=k2Un4)0VlK20oNfE zFVL*8g+&59$u==BsWqaSw4^nq`4v*B8C`SGGifl6Moz$<*R}l?Mf7~I@GD}#9FZ?i z59*hWC+ketnvjo;SG;wmww{WT7EG~k@q<Fg$ma^9%f?evQ^(R+QEhfv#I_m&^&9td z9jfZi=<K)Zl=ZJii>!_5%&D}w+Z(z5yU%82{F`JscmfE|UVPXO8JoU>ZPdOszDj4e zZIhcgFtz+#WN@Qsr0zK<1FjX`JE!`n9aG}uTL6|{0971Ws@jNHNL<}c>c&3687ap0 z*-W75eJh}>;^9O=Vo%%PzMW7H*b>0J%~1(VY4B53A)M#ons7+tOui8sq`r(1<_p(Y zl@ain$N&;TmW$XNKNqh`5xu^ziHdDq2!_e&e^mf<Q3t%V5NkWt(UYY5Z1y(XZZ~Oq zPQE4-|AUGaQs3RxBfeaXFCQ40f4MvqfU7WgM|GLMCGKSUu2-9Sc;Wzb&}&&wD5kUe z?)yrLsqVyc<+H%lb=gX96y0qz;D)<rQRI4fR^s5z&n|QUyG^*TEEh?gv%;#;m{5re zG=|`YSZ#9Qt^~+UF6m!*dFHlCD;wJUHz8@!>X93~6&nIm3SPk?{@UkmHVP78kKC%V zX@kOfbz#(B6l6^i4(1XYCjW9u07-b503}B3p`^HM%w;<xn1~WX@9Li&$)0ZF$-H4i zc(yMJ`RUb|LA4M1az*bqpXGT#UU-wsSiYaNYt`fcEv!|<mM4E|a(s=OR|eb)@7VA2 zL9Y`$G2rqz`D{@GN+3ArHQK2-;aZ<Lc33&sI7hvU6+Nt^he#aN%VN(#TWdHjVk6_2 zqniuO_br;que`cEy`59?pIhXjqcTfJTF!MEaSPTVODpmZZY04oUP=(kDpQZ9+Au&) z=#$6!!c0uok@bNwJMQnrprXQp_nd<VCpF3NR*goB#NcIbh+RwL>dmcse||Qk&Y*h( z)3`AE*VIrPvb#pgE<Z*ig?48M{Yp3l`HN`*)ch3^ht>cZ!f~O2fs&o+`|H7I$yI-o zl5i2xE0|FTwU&8>t<P1G&M%0FON0E1Y6MkN3Y-W}eb5GmN4l&D`&T?_UYcf;3s{<# z$zZqx*N;tM*^a;=V9-eCH8)2Djz77a=iujB@D`ra3ON1$Vzz`Q`RU=c{q&uJQ|8X4 zU$}p+18Lvf-n5R9`)c^P1=CuVurncjJ{IJt++TD@$gi8u{y`?Wef$S?Fr|^{G;0W% z^sT;j!SOgisC!=3^mJMS9*4Sh8>@509Rv*l^V;$xxUfSMhhWz(D?aTVXY2^Mn;7A~ zbE#x+wEx8XebZ};b$f0P<PJrRYJUki$t4M(`e%$Zw{G&SRL?&g^kRx#WJl+UYHtOr zAy&nGXd3~qaocM-J=O6LVE1y0rR%~VI6|X<ZQ#>J$-+nxyHKKytww?{>9sr(pQID= zmr`nfej_?SErU*@sj4$86jcSju?E-<iAesYci1!x4j>0QP7bV{!pU6duf$!V|Jo&L z6po1$7B__u*!?c#%OUhaaog3V+&#t(#@XXO`W?|F*^nK5<|7!*IU0sZo8__q@=G^L zOR`!pP-=)r?R;BF6F`sE$tML?U!9*DK!V4FKZft4{_gJk?(<WC3+uBZK))=F`{vjB zNCX)gt^=*zfevdB@M^4Yp@ImTBpN|b8?kAgi8oz9RF!qhsIJ?3ma{=+t_#*F%PX8P z2rM_c5@|}33ZEVQjXo191K_*nw_nej`k)~_@u>iOZ{(?Gt}9zW68{<3o0|wbu_A&# z>d@-jH^*zKnlXX3aP5@FvZ1dLcr#qD96e)=F9RSiu3@n#s{6pX6m6g|l_xr6Wf=!^ zL$Q}Hs}y06$Sc?qSf>t2qqH^(?tT7u8i47qwU_xK_X+7OE9SS_@Nn98@xC`vTF8xy z+MERop+6*L_11gpP+hE0zF_fakO;{izEODOSXR@6^3guyn=>4}QPq3(afPanM$ZYu zo_3_;E)e)@xAy72%ki5W!Ogo%Hwmg+&+$w9?KgSVaZ>(Wgh7(d@_jL?O<@MRS7BJX zIf2?9;#``e->xz^*YKO2jwF_h5=-37#F0BeY&-58NeLsivLI`DILW^?=XVO@H;V(R zixeFjf;Ge{GR(?G>^e5z=M=bxR|_+`wMR_XkWIpHyX`hK^cSCc@B=yh&Z%q*i^#bI zf?!xA-nN(yX6_W6(t73OzwAyo*|s5n_CEo6b+$C<S-h=UX)_YlD3d(+_!+C^iugL= zSKhexwUq4CC{isSS~f<LJ|>207<EKd>T<G{;O|B7N_2Q*6q|z#RtMGHi{*aWN~N;s z);`r~c%U*}=&5>soFb*vD(4%#?Qmurvl6wNPe|`Pj*=iLQCeMo<<u6#V)B+unya+e z6>l|V_*<yiv&buTX93{Tz~{aiGu0SN22EWjaoFOvf}*eUXpbbTeK^ev!SvnPqp32O z*=>4t!6r!Z57%HGDr=t}mYVP{kG5ikXNXG&iyz{UcDLHn6hRie&ibcb=1vr8jR!CR zsEUrxPGPNPm?=REbrQC^+aAt|c*zcAazy>3=-!n3r{0-!T32@q2EFoo4nowDnUp!% zNnHZj&l-o>MXT3;aIr@<UBI=bt*Jj@WTbZgRPy<0cgQnQ4Gp?4pAYih?fFxry8X<r z!+a%E*5Timcy^ZHeBJtHF7@wwR<$&%!T_$~R$Be;>_WPTVNK&)NmP-dEgLTat7TNT zB~S-ve+VkwNt~9qjnPf8p80p<MNIt#B^~#;i24n?IGSKRcMIM9-|uohx8bWx6?MqH z^37&wA?7P%W{SP}XLg5}k0pNgI?r1Yvk^xk-sfq#4xisqvh7=BE<#8T*w3?)zExbT z|3>Q#as-R{LH|DUvid&)D2@TYruOL)o|Y-@oa2;Y+AY;kStjofW{<Tx`nN5klCBc$ zI@DV3!rI2p^a)F~XxJaYWIwRT+iqHK7AJFs`xy!C^XB!O$eunHVt7fl9dRS<1c$oQ zE#b1(9^uMVPz=~+|BAZZOQ|i(Cc&N!)jJbKDHe0r9KbMkvBUBEjI&ChYH;z#U!0d7 zoywoACdF>ExTLI+<Wj6j2c@F)STq0E$;He2ch!`5TI8ZM0+pQ!a;t8JLdBZXRleiZ z`jXGOs&AV5X*EAQB16j+!D^Mu!r6LiWK-FBe-0!+NrXZacc~28Nm&G{7A3%SUs6ak z`zt_rKPc&jL0Jud(6Hk+@IYYSFxfF>MF$i1Dt?cko=~PS>cDOcaP7#?>Nw&suhjCo z;#bThhqGSam;@R^_gk1-k(Q}98r(KFTXYrJtYWoLot;U7A(KsFeVtZqH&^O*j8$ru zqr@(4y%hC5)#YeoGv6dfzW3M9m!e@~G701kDM+>y^h2z7l|C9_mh<G?SRu&0fs&`s zEiqf^)6wyeHZlQkK^fz0`>ET+l-E?k$Hiwtwkn;uqUUt@J=z$N>Y9qXL!zy_*ERGz zu-$Zjvh?Jr4Fuyk=WA`}dWp^`cY`+E43GJe)p^vG?V8w<i}U3O-FK}^cT^LV!D|L# zpX_QczJ<>5>1v*nc8skl2((?UV8Bk|ETYx)-nT#g@E*vH$dGJtUgjN<UY_3zH|7`K zKeqIt6UDCmGxm8--FdMYa@IzU!e<mUMeQQ?#F??yeCa5ZZGiyZTiCqxKy4W=xc+R^ zlGRuYOUc^qOQU`r!v7J2$;Q5R;MoS;h8YO%)HIg+L?`+)qL=}b&=W7?)e(<X6l2@Q zHG}c81oZn2T3=d-K1}5|1Cg0Vd~;iM%SCVmvD*Ta9hquI-`f4v<6O1gUnFty3hgTQ zlhS1yRO6^oiMK(g^G9MFG>?6f!Aaz&i({toxIx48cW{(ogXdMn?TDE%%pEAXwqAr- zzJU~Tk}$m;qi7cnJd{mwpfq%OE{+6sg-Id8hRMGSf=f!H?i|@ZLPV=;+}=zmn0F&{ zBsrOwsIFY2P!+~Q`eDe5H3L{M4dx-Z#qZjd1zoOG%<-Q_Sg=jzCUZ=l9zd%zSP@fC zC*zw>n4e9@Cu7u%Y<qeBVTmgaz{Ck(>MydIr+zb@39?s7^;lbeoyR{42tT;w#?U?p z704Q5A!tEl9O7v|@=7kuhS0lm8N?;s40_92M)XEiYU^$ihO2Mi=ql#)#l&D+Z=_SX zU9{@fnL^$NY?({IuX1rX^0ce;?WWH>NUD_{ed?sxhI5N6j;JXH)gD~Zs`d0qeq8Y1 zVk83l{e(dJBI%`7P4*9T<SZ$xMJhi|qPD`PLo!toQhgL$wxd0+84uZpd|FMaL}30( zwT!_?E;q9;T6RdXRIUyqw#2wPv=w^|xwewYX`|9L)n*u*H3xrlw78@x|MF7iUMf{c z(kMlut6>t!iC1(T?$a%wS~qEqZe=d#7r(o%L={my29F=cCW+svzaEXCr;D)B4cim9 zCy*1uP+m72cDG>cK6R#doxg!*lf7{TYtx~isQQ!el)Z0el}+Mzw_?4fE~+%EZXxmp zDfljHhD(;<iUqNaArpKqo2l=|LmMTH!$2)HhbOGWqW=747$H9E^lm@J)Q#lFIA6#v zg8Hr$$<~>{p4dUarBWp97Uhy~Y*tN|aPBj&8Y-hg;ww~O<wmV5eH2*Nf!0%2rszt5 z8B`k)4$)2w7NV#Ka7TRSa+PaF4J}c1SxeGG2v;Mh?60AY83n@69E*L>eQm9`jkY|l z&&lY4e=V^6;}SXknjw?^5K$4AAw4F%|G*;jWr+Ciri4{*Jg(LupZnjeC1cLM702J* zxSMN5RgR;?zXjPz@_=XZ)-aLpxpvk1*8VjRY|R4?|0Zc?XGhlg;3HBrO(&W*?RZ$b z7DV(3QH$>ly0ldNhO`Wt!ko=KHcOBBJwx<}_9yQ`pmQMLdge$=DJxsy(%~>--K;l$ z3Su{e)jFQ=&v5D3SiR)|5$&pcjIDMJwqY&I4kD8h%Fl!juJ?Rb<f19B{rB5|-N-R* zbusa3Nk&8oQ|0Wtf)tiG&Lt8n1F^cQL@ar(TeU^8`TC;L55>o(1UmQKvmR5P@EKqM zlL|@?wpfOpyFZ+tWqmQAGvcJy4Yqi*0A;<@RXD8miZMVYJ#4Vp;znH6Y~=_!!s;cL z+=zPYe(ry*fkC*=vK5SgQjHtKC4~DIu^96J2Vu!=7~{=&T>(~`(&kpQx=_H}VDf-p ze9XM!B%F6%1uMSi^qXfYR?^Y_=T8NV*Hcek@MZ`Z$3l*X2Qbz+Vq4d<m`@|`g?#cG zx9n6KWG(#yzB0R!ffWX1vJA#;4A3>bDTtwd81#vYZNQm@{^9WU`4Gu}B+g3eVDu`> zXu5V9+U6;~##b{@1g5f<B5~KV>)^4}Z7XY@rJI0Vr1<Vl=7^-NhWv6TLQW4^tZkZP znu8;G%{iWYAp(P+A@1(&xgk;HaGul~tNDd6Kk<ISPT&sEv$<v@DS@<YL^W7=mxxqx z+4Kk41yceQ6|i?Hh4ZaY+z`5Y#zrlBiRgnXDg>Q`8!5Pj-9I$|h{`<6JKPLoJXFP> zJ;g90GpE(Z^4oj=Nc>2HKgVc_cdzZX7HLUav;TR#jm@*TOZ-VxB=uQWu+x0KgzS5> zWw@|6OHmA8lYUNWv<7%4?%Z(c`7NGfuze+}Aj2%BFd9qIUotVotgjYS>)%{BST*5k ztM<)tvHzVU6_rJWwHGc}h<eOr?XXuuQfisn#<1-iRuUdKaoC1z`)!V7{FZWRsI7ZH zC^5NyL-(D6l3*v)yjR*35t!U?YhjpafX7IH70@`y$O}4Bo%U@jB%zE!oIr_1W{$jO zx1#7KJhXc4mE8YY-;zO{2d<`TUY*0ga^|qdwSF}Cc*&fohAJC#pdjCeIJbQdMbBV{ zXk}zcfj`y|`b^&}MjJX)UL@KkJ1vl4Ga_SG5+K=LTWM#u=~bKhc;c|=%s!XQ@{Nf{ zW;wPJX74*iaQ|i!x1(QrE8d}7YiaRFZ#(7UPZK)N5_vE>Vrjde#x{zwzKACT9~~QW z+4*AK_Vc}$Ml2}t3ULYTD*NXp^kMHB2S_n7K?!zeCY`oZN<AgXbs-P1kBUasfC^(o zH+ircHE6cB;(Vi|D5ph>$rhONG;H~XKnG#AgWinFf%>VRDi!zLh08xuknlJ+uX$G= zF{A#h!qS*KWXwghA?DxvM0j36T=vE%Cq;@*U%3X8HQd*1mxpw~m*ePXn|2*7&d2|8 z_7y;J23eRhxVyW%1cv~@-GT&n*BRV3gy2qa*AO(gLxQ`zli=<SH|%ch?p@VMT~qXY zfB*fr>+APkLvDDu>{p(BKhp^ICC+7?+ZkE582A_>I=pq>5I_xCDO{y*&M3xz%RS)z zT2?9-ud1*{M5CvbyrjH>M*iXG@*d`-n2%AKH+wPbE#6{5=(tgpxTZB-8v}3xC1-ID zqtoXo2Ics!5D9i+iB3Hvp4-q);=1SlU&as-WmiGC3j5)&pG3Um^^!AoMFlGAcKJ^< z6Qh17?9bWFC!S9yI`b`)vY4`k#dAi7%u#4gM7OR<26gSQDd>aKA=6I2)HOhqD+pGn zpz%Gc@!LM5u+4zRAImf1yPOVue;+Px^b~eU(f5jJ!5VYp&?Rykr6n~IutNBurVSbU znY_Pu{<;#6!ml+!_MLOI#-x71YOwTC{<83`zn)g+RwbVUGmTW@rc@eqv=A4y{P!|N z#;qB5O?C@&S1Cp;J~)SHzIV1dMYeXh-l&9m3rjBurvfoP+l3$={l<r}Y^lC6W^q|c zDqW&MRub0iM$r`<Ez4Bt;Z>+D*Ak-CkMnwWF)n=5*;)K>lv|V5p0${wXL!4=7DTnG zA%^j!-8zYe+lN-Vf!IFy%XU+${!8{e`)#oLjaZqW_dMD$JLgP=alaX#5I8Cn-H78O z*|@03de6f~uRmhU>oMC^@|92OF_@c(r?sR_5P!BDJR-nzvP21aT<QRoE5SN$IU@Qj zqba=2w5anHfqqROVW+FiqpQ!KkW5jNyUk2Bl=-H+cX2(Y#S{xNsBkhbJ{7sQ%Mr)J zul;P<zCz+D;S=-Nh1UnuUrkhKUWXP|m+Arfb@Nm$`@>Ky*4Gs}K6LO>L!UGlTI(Y6 z(RY*zKguk*kW^6?9cr$|L1nc{%@_+1s$qm@@K_vh)-m>wQRWMu1;gvGzkaZBtC&ud zV&vl%?ENm<?$c`dbXzCWPf9jH>c5|*%N)V-mF`Rf&YX@peil}@+&pJ<PS8zs>2myW z-ow&4MbWJ~ocv%8ZB(EVNENC3$!;q&%dcCAbIjubWbD|Srkz@Dr{>Yr_XJ%1Oq@G% ztG|&T{0ABF<nMLQhX#_%rEO)aQ^Xy%D-uT;_R)egK`UOFMqqkCyHL}7;K&Ai2al<& zb7UC0InVw#k_VU7;CZ~il)LVK9=27Xt;&)Z?S;>|Yo^ned=i0UceICS?}WV$rv8RH zbChI6enJ}AIygLRKi*8U%3k%wJ6(ku7rGpg;Cr*V&{yB=aUs`#*q0Nd5d5!~M|Spf z7jLQ)6yy~)ONMqYL77(BUY2u^t5y?IQuvCiMLm#y97_**FtZuHUVMiAp@#C0AnkaC zL;}V#7p2>W4aE6!s%-m4(wMa>F0w=4KCcqy^Lxk-sp3I_+*7sca@tO2@fI~nO*l4P zxpv1$Ua*-etg!=Go!3s9)fnO4?|WptrcuZxKnkb#H|=Yyw-C>n4Z)AM0+?118Ij1y zWKX_TNTOYSk%$xfo$OqGDry9uuDZS@1r~Y>?rN0wL{symdHF4$DMyZ7`r?q5G5C*c z4lw;I-;qeGE2W8NZw2wsB4|xx?FWvWn-*t#?dU-3+1eiLS1}oEfl5m&+~~dEl9s&) zx*toLCUzH1=QsI{qC<#Bky{{D-85TbF?K)rx#Do${neL^zD{4g#%#9D=1NQ5L`+Os z8UHV1P43-E&BfG|8hKv7hKb3h%XA6P%&5q8+n>X#r&iC)A_WUie}6;6O2!hIZ&g3a z+fYvAoSc4cs~glg=ABq?GC&l9kYvyM^!6r8I2I=#o<xrBD6%xE8CV>*ZtS3wXRp&5 zTb{o9^d4qa4v?s8Z=gsMXiG^+iL0qUl^94rK76gU<2&%bwz)Pye}NXs0SSAz+#H|H z#=bss4zWHQ4}G&lM+>;9@ac#qC;TuG$oHC9Rapx9;GEs+ks@{Pwmbf4m<?HD7hfIL ziJUdYtVOWW(gug3)H|B0D5fjECL0C#JKeOz>NSkMyT+}iUengcc_syL$FU7q`;&M} zfBmLiK28!7CCU*IInRgVCu@r}&&l}m(@Uxwsn6vBqP?~G^4KAxcir&pEST#BH9&xT zp%GoXdNH^=$Nt3_I}VM)?<Whx#?EdGLCCu~H@ms65J{CRHFdr5G~vg@<7F0p#SJiN zJECahMo+e{rS7uwqGdDjdE)H+p`Goa;O)_Etirn8T7tKL%WfCxG8&A?gCM{fFn*3- z#`jxb!5>;Ig#RiE>r5E3?4d0x3V|x~J^z*vnNr!>(0cOlB1-#n|9fd|lOz-F*zRI; zM%Lp2IEMTO!#Op%m-A|VO4QuRj#7q3?D5}Hg`(xyWRS>L@-{Q+p{|bO98XiGqs)|m zmyE6T7q#74HQb;-Rj-!)K@z*Gt(UjADzetz)Qoxk8-l})_A?>8O}@C5KZn<wcbRJ= z3#H^uUna^oB?P-U0vg;e4_~jMV58w0pI1?Rj&BK3k5P6T{)*tocstM4n#qtZzY-Fz ze&*ZVDoV#UVwC#eb=&Tj)Flq(7?cAo_`(EB?OC<pc?o~*AmaU(RlU!btNrm&#M_hm znTS{|d20`D{k_?a;?wCmGaH^CJga&_q29do;fFIt=hzY6teTB_ubUoB)}`OIu6t$h z8k&szHvU-n54P8>Y*<Uiu<S<9jBXyss%x)%0r(6^ETuW^LL%)x>$on(HcuZg*~$1j zT=2_W?x}rfi@AZWhbv{|uuCHb9YEgp>;!Hv{ny1<k%<O%yh%jbivnoe-K-`lM@7$i zMSlj5siv2zCr~%!o*$K!r#7x*|HW|Bc6Q&yBKY|ZP2jv{Ia??$?&xS}KcCeSX#t#7 zwzlfiQlU68u(CRLBJUGXY$verFJX_dj*h^qiZKa@sbEOLYLPvS@;A%Lz1TB}P@2oP zUlp^(X2~~3S}aDzpBt=pKn>N6CQ{1T*Ztrtat@mpEW%a0&7G{yy;gm4e5<P}yZLgw zJXB+gt&!--OS-1$Kx&bP!B8{McvgK|YW}2}UZeZ&SC)WA->s-<537>)>ikryb;;A0 zO5u_-^v3;(bP3{^eg7P3nz{<@=Y43ES4tvlYy`_e_@YqIxD7niVmXS3Q8Lq1nl?_3 z>iL7C5OQ5`hR;z~kUDGPQwrcAjM?I)O4xadWMyr)3Z`?rL9qVR{8P7QAn(Fvveqnn z3b@s5!GnH89XiuaSz6e&RgIk7>hB3AJ2@K(8~I*vw7$(r=j(n47=?TL3)08b$g#@4 zh)ZPu8>@!<B6_+DxThXb-0UWeVSka1Q?5*uh^kN80^?(=DAjg<c-XWroHDD3Do-FC zn1fAWdr$iQ<n~LKcw|zcFFp|MMscNxnJH`&!1o>e6?sMJF+ZEjs$q#*6SG3*sJ&5y zkmm*yw=29tpCrV&1xTC5<<oE%2v{=CSd5_#&~GnL>0BYtRV76Y(|3Nj0D3k0HR1EV z!YuBPQ#dX^fA3DhZUlHd;xtdy+s%D9WKw20#|0nTF0+u`!C-xifYo7=;fvsh<zOg& zLUGp0G!$|R5<>~lOa3~6nmgAljDA?GE|2}X6<N5)@>4<Iyuq`^#ENXyY47H9Xmqkh zWKxf|Xk&By09hF4EdRL_Mg5jamJCStV_I>8`#oB@?xRgfp*KJCQ_lr8KH^spsb0wB zXkaVs@9DDpUQX-Cmn_@53-+uVa7%ow5aDo*MxLTwahQ61$2R(?vkS*3%}m6ElsNuX z);pk&yPI0(1DjoQ#)11HLE+<NGIU^xC=!2+7EdN8k2iiqN~h^{37SLo2I}IKlv*Nx zE?Cmf`{GK<<D`36@QK|gQ|qEep0WKPZkjDB7;bV3cR1NehOA9_2jA~#LLo$FG=$l{ zUuxgaMI)Ih$!0WZU>~1;%y~XAVak4`35d^rD3hf^c6+?!mg#KS4d(%xR_(AAEH0V( zIuTt&mxNT=805G7=VeCq_C_Ni-$EGRDD;H}i;qHI4a|lyA_mQ=S4i6^>)=1>vE5}w zAB6#oad*6p|4WuuP&{U8!vJrWe#(!l-!nVNsG`Wl^5yOlj%niQPpq_tQB|UUxzyp` zvifTTr{L9VG~nXn%^(4Pp@Lf3PVQB#ud0o_+^^8n7Vmnc5*7+f;&tCoMpfHt-x$lk zpa~0FzXtG^Rp>D*2K6>mTd6<pc7^{+pXsH})g_5KtNpwkzfjZcT(8U#lZ^Mkih_+Z z2iMqsx^aY8ItcW4Y`7|bE@rE~ko+WV`F`1T=?gF)7ReKdm|!)PzgL0d<@M`zI}$xa zZKLx#+aO%d$cbM(gzxN->#J*ue|fTCws<99&N$?@l`&IywKNpu7PeKY&epEU3ax;S ziym#0{hI<cn9jpT=<yjiLhhBiv2O1bm#3>A-vZ_h9KJm=``n(OWOxlPgMa^EdKeVx zg(q1+<eAS{`L3jBQyCD6g{@mmgUSBGqJO5$s!CSG{aD(M<Uqpf_Sx_5YmlGd$>cIt z4VSI$p~-1+aft=WUV8iE1o>P#!-GK0EzQP2^<zJAo}OLJ8HX-n*7P*l_^D3Y7JF#y z-9WXE?LhFkRn;6SGeK1($g8<oQfG;a{`hEiV_2H65I_Lzi5^SYYzP29ZT!u=Icf;D zC@hISp7bA`>eSBl2?Sl)3XR$_Ixc}RRPN(6GJmi6n;j6yzo?onYbKHpS%`Q(ZJwo+ zh<T(^eKgTB9#~!Dpe}-K`MKGP`>gb(u`am@b^=x5`7j~Nd$);_Wa)EeXTytpsC#0u zzr=0bX5ex9-TdEUSoFxoXKA&q`oEUaB79ib*#V|!<3=6u{@DS()mP33>D*#5bT456 zu=8xvhlM?;l|R|I+NCK1&jdwh&9FmLDKLYQD4Jf?&^@>*Lu`xWHVa#gSyc`2Qf#*> z*8`25WmZbY8G2cSxC<xp$|RE`iV#FC&k<~5GwbO6uSUO=N2SZI8RRTE&+O?H=-elp zm)7<~_pF9(B^}qPs*EMP7qi4&$)2S9)?Od?jQ;AqK3m2Uu4HnnrUu^|b)S%+7Bdk1 zU`es=d}5A^T%IlHbaf;bN%C0m>OC#{o-*LN;<x^bt|rwuFwT210Po59p7%J7e8mN- zhtZ0;XW4(;<15Ngp0tnlk5KOVh{cwWUuw~t-Q5F*HO~afFdbS8jZ7EqsO!D%;PpI@ zQE%@BcFmK*kKyAt*)1-aIkel+1VwtBzrK~u?9UZT9CFqFDyeqsUS9IpRj54;_+zCP z2KA~>u}Dl7u~&~Vp@fjSMHzx-D!Zx9>Xh-p;r;9Qd_X(2m4jJM+oPmX=0QUW_@27F z1sqF)_N9C63NxI=ZDC(piVveC_o&E^XoHb0i$m4B?kEIV#|7ClvFj1Tt5j3-P65+6 zyvs!C(^{AgSh%%8Y~uKA@=_vUtIX~o=J++q`C^J#iUzrQW~ye%*)>=X{vBmU=IhOw zSy@2qlaA8I*8%)*?a<qV&3Vs?&Bw6h_6Kv6MjY6anpv?kJro;kICGnM>*?#vN8djs zMJpKL7HzKx)aC>{#ltFmD6TFn27U(jB<wBGm+ItW@fX#w61%ybG<@?q<a@G#Ox49W z`WecL@AvvRZf9tptOJ|zzdVOvG~S9l7?F78q$XE==50DYGqn^%X1jl=FFOsmq7C^= z$D<JDToTCQ29)>{o>R-wLMe{kvFOPN6&s4B#8N^YX4(F$)}HWe)$L?a<UwJ05OV^R z7CB!8HW~kn9XILeC982my8XhmLp~phq|pHnyqS%0Jfby=S7ji2gQbzME}S2V-~b-Y zs1#4^l~Rz7Z3{`|AN;&?hSc-N<E|LCtD=Jp$4-mwpi>4SNR>{%>UsCFRt$;+6%p-% z_{o0h+)E(!)o^o)8^k1TBM&lCSv>CFVLC2<Dm1wo0MQJbU{rLD!0OmSt=dO{AOvF- z^2ubXi3;w_X=W2<nGT^*Aq02alvD%qGo)FIVrH#MC~I{G`h}wTvS-6rAwg%xdQF#O zZ~d%*96P&rVQrs=WO^oOCR8f)(tATh8PZyd(i8Y6+dp{`Ni|;Kb*(oCbnTg0Y+Dpa zuV8JHYJTf5ZRBQtLYlE`3Ci5MB?%*jS`SRn32u#;fCH-=fX793p?s6}c4Am~f<U5y z$jA;bP1h@oUpv7WhV8Z{C26K%yG+3=B3uV2Y^Fc5zAW>p;JDwBU!P8SzZ!U3yRwt! z#K`gE)tWP8^C2I8lhqAoMALs|OLw@s^Zr|yCf_&5hUFb!YLxsHMa2nFm>Y_JHOZ<~ zuErm_<#zWJYu6>4q)t59LrpO}E02AiEu#*No)S<Yr!h1``c`BlSS2s^>^R<NCjxnr z$y69hiYEI(J6D=y?}Nh-)HSyY=uq{A0(4rk2tp?D8l@2Xm2nco1o7qr^J(C>EM1R3 zeR>hJF(Ze0A0sQ=CVKVvsMrCi*DuJW5lz6MJ7<PLoh&z$IHtd<1%0G%uqGez)(jj^ zMwq#qelgO*qA;455xsTQj^MPEw&l&m+_Sgh5D?;!&GKm+a+jiS%Dz_K`&SqGvZK#t z^eB)h3F9?ESKPv-aD{w4wMC68YQsCyuSw)-r%ITCfTkbw0DYpAB2V3-P6Q*!AxgXj z-bL{joSMfkq{#g@X&qXXgK8lJT)4e9+@vSXKMA3Z&Noi2$SxY=_z)(#)?}Mr+C5AA zP6y@fiTu`8<KJz8J>$S0aHjQlK=e6oqkuhm$ej6F^DdwC!{v}5j<(}y9V6Nek+3mj zGZ1sev8C~zLprbDB{;QJ9Z%;5xl8w%2{xWZAxv*Q=IPeqaGir{II8uCY9_+<bh&iv zH!5{IiD1nPiASwg=EamoGX7^#bmqlqx@y1{+U>V$HD8;RXoMACH`6`$1GVWT;;Dk? z&eyw?<JKX-u!hKy(XxACwu2nv;;E(!w9SeoSIgqB1Ps*grh7@Tn`)8mu|=gWrcvTW zE}ICOx*puIjbN}MAYw5@aPr2{p{DzyL6M#IBjOzO{br5ioVWYJ#u&-c#<>ndx3f}m zx-=hgZz*EcYrOG?7M(pzzo$Dbl6y6S2=F4)7k9=c^{0WgM6o!|4mO%L+`vDYcw-p! z!{6vp1O*pO7gv{5Kg_l8xaGp+1AD2|<p}uHU)=O}<+n4mjdQ0!RF8>CiWbHdVoez+ zXrJ|o+UC`#^um?-{B(%;iToKVScK2QZAvmSYGyJy>$Ng}T!_cnUIzOp@7x^cr?M{= zrA+6Pm79)r?sXRzQ3|lQ5g#u){T*A&f^35~72*#~0es~fCJy>VPX*D+<>5_T0C24d z2@_8_wckiGq2CpiIxUA-X=yL191D~k@8b2!V1aa|!h!3bMtNF5?=L?=k?uP4&NV_) z6!=~Bq%<Ifg363zmR-y586_QCBFG}D9(EN9(3lMrIKhYLVJbU?Z1x0_1-Cw^SMvSL zBm;-^bW(YXv@fvZYh!I;FJAVRE;Elqwvy7pT9ScWOg9%%g?ttv+w-=xrEQt5s!I&v zU4=1l2(DPSDQ*Kc{rVU$4{Za%VdqLu6qp*r+OD;tGK0Kw)9@2iK{b2c4Royhcq>Uo z#otOLwlvc5e_u?p4oDj+qoc#ImsrV}Pco}>R8LSEY+)_kY_28Couh4U6Ws$rbl5?1 z86m@Yg+#deKUy#)n`E;rNLHf&Auenrj?es9l~a#1HPfv5e3?OU=BzY9vO|w_tI4Co zr$y%{a4AKa6Qg}~hTet)@$5`#nw*CySnd1#5|Z!3GkT`0YgN*35U-BQ3__P&hqkD7 z45|tCRh2pRX<#r@>kih$gGnXRI6s@sG<}58&n7PKm9K0%2mK-CQWuEPW>XK@)*`o! zfSmwK))QbCy3S$$tg(-@sR|penL%n{ypdAYF+{+3TA-I$jT^yZ{XVoGuToQ8ie){A zm&JK~PHB?VwitaHuvY%C1)*Q){}l|Er{-v-qnv0(kwYCvvJ4y!USbl(#HG!~W#}{1 z$V4W<2$dyCc(@raEL^QQW;vGHWA}DoM*r9o!%`mxYAC)=xDXHIYDAi8$spAbV=ob@ z7J<oCjZ{~6Y2H|U++4~M2JLem4C?#@FnkLgo9XXorYk_Y;<lVu{DQ@}na^Lc04&n^ zRlZrlhK*Ajd2TH#*~N`TwcoD&-qnG*osBGafidGfgDHeT$;BvHSMsf&h5J)#8i0G8 zy#W*MK@lM%-=UFBXF}8zV2lhJY{qZ1{U;}n^wldH?^@ogBawnv%d3E@Idyw}GK%Hs zpQPyb>25ws@Y08{-3KwUMuC>h8{ff~Q;hzCk}7?VAY3SlnINQV%Y@(ad3w}O#};$d z9;f8WpOWQp6sju?c4F_cZG*UZi%d9SM$Pmx^zn~MPR=`UxP%u0(>@OJ3KIJ+P0L8n z!$+DjxRgW^D$Fj6dSKERNY;r#E6I`M??(vlURxWE>WO0<a^8?vAtvJ=b>{)JI_e}- z3&laT!#zto2^zJ|ID^($_*Tj^*Y?TbeJ^85Z?t;nS*D0ByyJ>(^4pQ2Oyg+`ecvJ` zBWP^s$fnG{x>!JcI?cihC8^e^z;M|Woc2J*$^E%JJ3+FPcM-`@lolm4ZY`)pag6S| zJhSo*dFG{VuEAQ&7FfBAppe~=vtJ|4G2f<h1P7s!C#M?MEA@K=0<5`9*D2dZUN0UE z8vX3*GS1b<C0!-nw?^kVk$9##^%dHhvky%fcpfL61Ex3sGJZGpDvi%z5z)w}h+dP# zE9>*d0@v+XQqOWvveOijj1KW_xjrQJ`$dsSub1E_F_wTSl*3(Z4r9zZE+XKqSRC_X zEp4b3y$a9)l7Wc3@}_;6lg6l?@m%%^W8kAHRv~y9YK6-%d4X2FmiUI~0avaVg}aQs zdK(*83?B0Uy3Rq<pFcvN%HiURRP%^GD*d!F;TG*`*JwH%b*6SU6%cOg(Y9!1U3*U1 zW#2H82Wz#TKaWo*(W&EAxL%b~$Lj+=^9~|H`oqcJDX2sOJ;_Y{DGfvIzxK+9t;9F- z&!AO!OTx)YpjRQDXSMEuM0a1Ezo@^eBOQVVHJ&lYs~TgTbG8ad;$p{CDOoxM#EYez zjsKbNgRtX9QoXeOm9zKS4X^j<2hp1+SY+|7I{f&KpD^)lEBZ3nl5tSl{6U3Znv5^c z;SQ?JhxMjE?-yUN>E01x@O2ezm(f0_YY>_+^(Cobf4c*yS1LN8=Q7YlhY>pt&dki6 zH5I|=2<aBcZq>uD_VLHzf1cpeHi4WXH|qQa$>(O0;dY97TPuV{L6(yQtPoy56s&E9 z^$-}$6>UmCiL`|_7H>gO_f0#8-U|x~1t656Z;_<@$`fjb9g4wen_w6>5r*{gKpd1X z{ue5mG!|A$jj>1>W{7q;HNmC~r7dnMv8d!alOZnJIrNR~tG45c5IMA#bwQg8oSVnJ z_{Ir6f5CVP@tpgO@2UyIEUB6r&MaM#ioHPm{2i!{2GA%GoWuCYDoe$$FZkMz9VS&j zhpy3<B{P3Ww23eoQ@vm9fnq6~%UY<ckx^cnwH&>h9BCi|i|YK)-owl<%3ARwBkh8H z43Q;{FS!|49r2K0VrDnXbJbJ^Uy<$nQF1!jIdxg&h};SU=psG1j@ftq+4+Wl+4*|q z(_@ngW_`UY4R{&*;w3eyqGLff=DRn^6Ma(MIG>PCJGbb;y(Zi3Og+*a6mD&t*mr&U zylzMEpkFFyTxQXGpt4TcwET4FZr)>_3?cV(m=>t9*>HDhj5tc8srl_c7_C1L`wT%y zr~dT^r!C}<=HySlOxqynQ1|d+=MJDnDe4|v-87ynG|mPAI>74he%(q~CVv*0Ca)eL ztJ)GVE3ze_L`&zxZ>}U4Pp=m!PnF*wphgzgG1>&bBz&fb*x$#3VdOqA4|#Cokw+w{ zOUZ!iIDW|ny#Hd8iAs-1`Lg0GQm(@4SJw(O>_(3nSU9L-@iBV-cPtwo(=~-p)zin! zzT4I43l~t(I^H};C3?_9kUG^9&3qWB&5b&0-`bKwHu|$QgW$I@m?h$!d@WgfwA5WP zeaRElpO8HyAHWjlr4W=2-yidA{&)jvihvdL)%8aRJ(_X1&8`3E5$KpK^CtkWB?NCg z`FN?Gm?H@EMcG!`vSMK7LD2unfy!yQNke!DqH<9}R3^&J)=tCgxsOd;?I&yB7L8Vg za+j^P4pGJWsPu&m6?-AoLfA^upBzJFmAZ7~ml;z4e+2x;s2pXo`J4|J(|s_QKY6f0 zR-G+fbm_Xowhh}i(x)CSqtdI(wQRylXHENxmY6<xCX$1mfi{w|n_MYvNI!<WYWbQ? zEJ}s<ERA&88QH(YlGl?6)LZ1z=ZJ`!$45p+Xpa(pkJU0HQGUWB#+H=yXFb-((mFMo zX2WSeNKd_sAQ0;3>MK}U{q>n`u~etq+j$)4D1g;T{mTX813-PY>z#MkjP&7}3XA8R znFOUourpr<RY^}9hG(5X1r`qd@V?w09+b`l!&f==;&(3y8=Uu)wo}2_h*TVFThVK7 z3EdI8X=vjfn?jpX*L&0V^XXrB_GQ4Gr4lO_vXcN>=fG0cKh*QNqasel>P@t!1&KvB zxfupHN!j?n;bt;ck0Aq3#5v)(>-~-jMjDnPMjCfzKsQ|&casjm6|p*8282niwMT5A z`jxMvRA%K%Afs9^E{X9FD8^DT>QR~R({`KAIOGyNwdILXHl(4)kdKg19V9{Q9?+u% z9;>d4cocVA`Lsv3i_<5$jfd4m!LmB`g>A6=gS||Pqz&{$8!(H&o9CX`4xJpL%59hi zi=<YGzaWE}sVLq3h#HM0k_9&G3?tp|nP5j9TXK(DxlAnP125`}m3X|z5R{tk%TYnP zG<nwSPGewXPFHKXVHd#op?}>WvL-mJifPaLaFIZoSr*&6mlL}1XwaS54LlB3Zo3pW zRmWUfOMTxru+P@uCXtV1+UVqFhjEcgK+M|O_;Jjl#+huu@?ZI)k}uS1!)*3)(jBva z6?U|drIfJHD=yCc{K3!hi2om>*apj|I$@*CnzCSoF~ZH3&!hc%J#`p(!ze31eJ)x* zaIki|yj0{@q1vzJFIw*o3!RL1kwr{6tS}hM6Mi3gAHFG~Hi==e?aP9}NBiK*ckZ39 zatN!|O&_;|KI;9<Cy3%T9bYSN*%H$A8*&`zbmjXx^D2*zB<_;Bu7udMrZ~F}k+eC7 z`YHe^X8d>MhV74~Y3u1V*4rxmv5u}fJ+rfn?pMvVmZt8h1vT8SW0mEqO#|DTd1a<U z5HjEF%v?^B2C|4-d>%^QQrswe%Lq-kowysmqvGVCROToO_>lhfzE#>JdE+rxZpEYK z+2Rwr&@;U6V0g`pI98RxD7hKz>XG~*EWmWH??OB(_34)|J$O*j>MELSG*6|3oDT$O zQ*d&He*CKuZCaYrH++d7=>6HlnL>=_b+LJ7<PLrQgvHmp=R3XC{`=~p88=V=4y;Q& z;TBBx+Q%-I<R5tPjRp{{RIVWxy8zo^OU0hmV}alG6uNpO#u5Ch7}Y0})CF6gX;3q0 zi8ok>n_0GDO)QyrH_x}XxBGsJM>L*mHvo8@rhW%OmuQ#BsaJRdeZ9us87f!N&~~+S z#$`g?g*?H?>B}&yIZgdF{)|vP5ITUmVI1mvKmQCNQP%)UKYjXe{;7)F`48-_Wg@O* zi}^9SSa~}S`29O;8yZ#DG|JS^DDR?E3oVXZu@~`TKvN(7sA`V&hq2TrwsN@Y>Ej$j zG|GaicL~!%9l#oOIQEj+3p2mJsDJ(KDd4xASKD|sKtopRrNHdR4zRKs$!s>g=cN7E z1<02;kg>W6-4Y((wp2=O{3}96Xd)ofY37aGiX=cha%%Z8jvcNk>>fK%Q##s9%FM=k zo7|!BF|TLJ<BM1LYTs;y*cT3tuuPc39eca|sPGo#Kaa$7zmDVK;vaY1BZ{3rNSl|A z?!md@$THH)Bv){2sIogqX0K2u@=%q4ooxl4os3TDoX(<5R>7+jh@suijqXK|^ZL*D zr26HZUH%WG*j687Yaa{z8doxqQ9zIrP9l67w*f_Au?r4e6+eoGQ0N<7KjEg(O-#Ly z4?Rkh--_gOmzzL#7+dx`#`6WD;)vzi2CRraTm?!$#KT(L_ZEY+#xiI@KdBWQr1_-f z3rfJJxcKT1Atd+tH6DS6LDB`Sa6Qfng_&e?TML%w^lY<+9opLyE$9c+jOu8APoXQ3 z^e^uF;i-d?!tlF{&`}8%?fz1${0^C(C;!>I+?@C+>tZXbWuphCs5tpTto33Q<Aw;t zyRU7_aZ7n3BZ0&^rDuTf1xEu~F}ya-=V~A>CW{=K<nS7oOy%RJu?$qkw;j&nsU<!m z?M{eq1K&cJ(0J4#<lH?<TNym>slMX-VI93M#-dZiH300Le*WwDB`&P=LH%bh@s>wf zv$sLG`qse#akap^-a8iNS$_~KgF4LsgR-~#cLXC81dZ%I%h(HG@!Z3?THjdc*T+Gk z7SymG&L7;(OP}}pdTf&5O}r>6Pm(R3KvjsmROCmp0`1X%l!~lDd4YLXRk(l?N6?&d zm6<g16SR|jFb_Gsw2(kcsXai6FdS8YM7%L9Fpy)6%4V=<am3WK2Vs=}HR%Q?Y)^MB z)dCWOB|gvgmC_VDjc65Q8_M}@Ls!#Kdh;v3$|CQYhV3Oji*X<tz98iMlzUV2ayCf* z4)&^aOUKo+xt?7$naP@oowF-xtKl#{u}?4hv76f4L|;^nmm1FF_5QKscCYJo+Fq8j z*u0c_Z^zOwOr&I9sGW%sk=dv)(|>%;cq$wjN{OX<oO~%wyUXz}vPjEz41pBPZNzuz z57EDM8<mT`3xv`M?U`beop5h~W)vH<_h&izbW8vq@_)OZ^M7Q<GU^;4v@B9Vw!2|T zhTlLUbBsmdHm(Kt*Tzyc=f#ugU^<SWni@hbBjZkJzk<I7$18rBUSuvZD>6w>Caj5M zhxeda&RxD(Poi_um8SJk=N1wJQ)<7jL2OR0>Z-C^sRR+p=2lc$nAoFtW!i~FF_0-0 z=9^DH1N1@ovL3Rd=RazLv7zaESQbI~-6D+NkZ^2c2786f1h#Pq52K?d%FyqmrmtAk z*>i1{(jdV{!%LGA;sp13F8b)ue>J-zWxi}ps%?<zcH5#*2_zQfybM;DZwu^SzSU$L zf0bk@Y4m7g>>a^-_wI>D5K0w^*+C6U`{S>^?jIw~hMT3777-;C&aQ$UTi>xuFgIPf z##ReZ-br!JKq#FC2+^(+XsW0~Q=*~BHn1O#YOI-d&6JYghk)F})g%0c&K41+xfO9) zG0;J$p6dCYf6<zD$;nw}OLmpvB*-Nll*j91&~c_3_fxkoBBK1aQ)gw8m|&6VzJlT% zOC|y8`O_5&jjo1T#xo^hjQZ-6Q#F0;3R&WOde%%F>^-`CG?3k1w~Pd;r%%f~Yrz8e z7h85>-?my4@$-e3F)%3$D=}F@f=^XTH_S7F(Go2!H7s&Zo}-Y$5Wz{7f_6F@)sl^e zT7eksPzuqP1J-4yW$y`h_V(O1tm?>b!s5j}?&q?qF@jLXVN1X(GRZca4n;q;CTqu} zbmQ&v24?K-q?tlcKBZEPF!Oh5pnnX5FejA|6XOnqW>O((m1pu1tA&Z_98kP9qHr(D za?EB^9_OK<eJAI?<R4B`;pI~rFD$*#qx;&xqDV{4V{B%NVN%7)p*U*Kbl}4|F8WdH zKt>Bil-~V5oXWZe4UHzt=@nD;<o6J&NZcn=Lj<rSXzW^(s%4EcYLaztVaOH#gXi_{ zT>qIR7J1`aM`}4Q>IQ|MArAuaL(HF#<o*z`Kr(;xhjz@en15A!u%V7!_BKd|FO9_w zZ`Gc%EU67+0dcg_kY{*RWBaPF=N<pz__lPtg@px5cwwy!M3q+s9^;jgB%fqvHotRB zOscYWeYuX4TCFiO!l#}@ee?8OX8U8#AM+!|fs9VPwKMy0Fq|5O-Z&oWG!3Zmd_y24 zodcG)(irrjv?6Gk^q~HknXPi;(pjiKGd9pamQ}w{jEc^}Kk2Kl_$zv<iOUf8ybv!9 zDN!QJ(|v15=8zUe9H}nQ=C&it(beoib16z|*0g6vI9%r~+@NR2Etpn!em3Qb<~4@x ztCvCllq#l4fd)KQ{ige1rK8>c*Nd|AMEqalzt>Z?v`4%&6?6^!B%;OMg_QW>t7^wi z!+dlq|DDtiQ|;gO8=zj0W{6N1Zem0&izKj0Q^VaFtF5=Rm*{CA-nhre%)|aS@LT#v zQ-SArb`|Cw?61_Y;)k0-j7VoLKN~KChBWS)i&S0%^dHEe9DCgDg|<_F>oGHt+_q9` zD^`837E07+;iTO$;iu6r+%@LzO5%rTU6^+_DakNVX@n|eafnaAQO!5zEX1g-nQ?MO zuAUQW-6KxG->O2isBBz5VlUYxtj+S#Vd2MZHxQBs*b;4E0h^c-sXZB>A9}cK;!SsZ zgd$>gFbx@n2Gvz0&I&JDd&T4T9ZicfCO*rdq^kL}Abt>pFf5W6hrla7UXNk445yW4 z##-nc@V6{N9rv`wL1?`1o@G7SRhjX`32T$Pi>acV$&Daq{6}Ao<#*ndDaLEdCw(<v zxYIKm$_1`{Qsd~|9Q-~7D1Bcu`D|6U+kJLLh?pHi{P*0{%+x#$)MMF}&%%@OfDa)h zqPh}eU(4EZu)`p;e9;FN>t3r3?VI>jE7K&C>Y4f`cke+Kf5GN5eSAfFtM1T$D`IOq zc;h(2SzgRoHlMH8h#O^hMyS5QwGH6xm(aDmW-@T%UL#GBe(6rMh4dQU+M)fgA7xAX z@GbTmuEFcvZ!y+NWk#F?P#bm;$7i^-PY&%9`qh%~Uf=s#Sl9+GxBSsAp%DpwM?^5d z5Lg%3mxQU;mL=#RP}#9ILmS!a5H?~ZydSp;rRRO$iWORr8fmAL=FGMHJL)T_Ia7p4 z3bzMXY-%3NpP{3e)SYpjY%dtmN$>fgdU5EUAf*VDo52cT-w7dzXR(VO2;WM&-LFS+ z+`@N)Yk4eaAK+Nj6Kk233Zkw@=+xsp@!%?1?eT<lruR7cuvRIT#byS(b#sTUzKie2 z^329DK8%nZm&ZlL&2J)P9C0pV5?C4%^9?fi{3K)_P_wblj~`M?nHa@$ViFC`J3JmR z6k&fi8<wf99PoG8+Qqw9fk5~I?`F79=~3_T$Ho^o1F+x2`t{Mu=v29%(?dAp;Uv#! zUkS?(a3GjE0`>9ua>_5l(BP~)R`~KD0va+#bBrrU`Tq9F);u=$(Fh_q=O!{{LdvrC zZsFL?D*X!LQ^Kk$+rw+;$GsGvC~u^Io6OKr8{Ut7)Mg6a{?Ojr+q>d}Aeb}Vh^z1l z2Ph$Ra5MT<;1YTBQ3#|=&lktz&o8*t*%~EW7`T7luTthcwd!>H?4xp<Cz@b1jp#7Y zBgAeR5RaBc(q<;<nXq$C#n^;XLVSo^qo64;4$qldks0f!bASbD#+RmsVX9+5kJn`g zNq)Fa%NB~ncOX|NyV>%Jx}g+9PUrlgx??AcF=)8$JV)<6jr;SB2f1+o!t$TRU3`7H z7q;!c)L(lizdFCyvSl*d_>LhmTW`evoN+oGfjIt*-MR)(_Pkr1Mb_dO&fVv=VX(?z zilnfuBtP*x!hjA>;Yfsr-iS&R+lose3-rW)xBL?_q3z?$^f4>oE|>67Z@Ef;FN?J} zxm>xj`Ng_g)jp|rzA{-WpP^AJVa_nUZ>6Y5{8TZEeh$5Mt4%a+-45aN2sj6GHNuIj zLXJ(bI=%}(o%O=IO3M-Wt((REB0s6(?>weBQk>Gn@4nx)HXvX|Bez6ClWVPLc3u^^ z951BA|6VUr&T1Dw<$MrHyx|?Ip<0!K>hOaXLmhKyhCoMj*a#I9Z#NT!;1MiH{RQXu zb`fNGxBBS*H~7%)G5FH5%@e2znKgWOo<@^;4tYHy4KuMW#nJqCRBGRS(h_AUDIqRr zT9`fB)wh^6yNvh>yF=DR8x}vkn?q3k7%GX>eKhxL^V!}#_kDspa)|-?X^yom&Nz>^ zG!;kYRh(pRZLwK#C0~Gf?7_z<73N}RXW5~dNh)>uZ%~<lk{rung=f~yrMkbnRSF`E zqn?}mjQe=ZyTl<ZZs@D_Kp%O-un>^!)&3P;6wgPfKr`j5UMVT6CJ0a8588wPt9fi5 zC*Qo~6N=cXD!b`H{oQj2r51w_$$}eZbtBJ%c<NK$Wb{`i&h00s&igp1-u<~M4>&L) z{^-Izg!`!XPb$=dG^K)pRO23X31qrl3tQ1BGu(3ZX5Pa~AL;sB0ol=D1(!gGc=R!B zv-Pc~#}X?C`Je88Wcmy_22uHC2vv601!J#Tj*|QeCti?wy=JC17yF)=YHity%D3*I zFUf#(n&>VJ6_3Nz^$@W)&Ct1@Uj!=1VBO+Y)Qi(>&x7QR8hd!3bz!kK<+DDg>jz(J z##+dJz4|6vbVZp@t|phIC(=Re@Pp|Pol-Ux+3Pp_(B%u(+H5lS7M+NupY<b=Q%+?T z@(Fc+%y4Qn99u{e3Nk_}WiXp5;L<=5gN#VUnIJEJJD8f8Pp*+<7m#%e9^A}Zj09E0 zyJ##<OkB&aA_4bgwOF_a0~3!A=LX&<J*u@;MwY@ZQ}zKvXINVf)89m+e71k9PQK%Z ziysu`>OFxd(dzi}gt#^A0+C8?I=&?i#c_pCRkP%Z9OI-eAub|3t^Sq8sx`)kx3$CD zBE_!kH3m$;ud%y5H|C?MIgEw~`l)8xN`GKyV|tiwFu?S+(tmw@*}jFW&7|aAHlP6^ z?4!*oyS_mV`VY2>6-<F(4*xCqCaHpry3qvwJE4`t^;c&_-NqYSd=NtVmC|bT=;dl0 z74YZoU2`HYewy=z=fw;y^_S6;Vv(*S&Wy#V>0<`f<n*dcc59YBJS`)m)1BK@-Ya(s z_Q`jzDh=R2bprz~zLY#}>-UG%K>zptFy{jqA`3mqu;mrc4ZPP?Dh~I9Uat|p5SFD5 zs!-gh*WL_;$3~@@BA+lBk}mu?kMlfc(}`&RG~;oloDS<vyE~72Y<1hjjcY@E^4H&C zAUxAZztFYoP56u@+XvE3t&(=_yLG<~V!apxREeqZg4go_gjMwx|6?Y2go04*oRz0U zg<rMlybC)CEJKKy;VSPnh<#7C5^|r8>n%rzs$hg;5AoVz7^)~iA%}D2$<B=u=cD(_ zn0V;IEmWYcg+`c^PIT+zD29pXUOt^7WGZ)K5kSjNkZeyDqJD55@foboeufcLCOWs^ z!E7x1HiQ`MFRg0%dX%!hw@_zcnknzLCG(g=ttC(=$CG{{T<AOh!p`11KL>32<xqza zy;}Rs&d&OBy<$afbwArvrcS88v(99<p&IeJJ4J|HIF92LCa65i0Q9UECY5w;p`@?g zzT=^Fm3r!nQ0Ds!es#Y{ciwK9*{AzPVPT|i>eeHDaYGkZ1Y%a#JBdlf0Gs>Dq&c=D zZp|3}p`WJX^gscCe#PdzRQaVCH%HbC5B#W_@1~zeE|0cRqkmvuGG*RT%xJ&ka~!i8 z?Pu5|+QhBD8D?g(_OV-YEm*a74+}lsr|2;WwyNC2QT6lSmOF8>O2cGQHK%6b9qxW6 zif3^EoWRu~57aKiL8eXrW`QHetx(`<*vXAu#rsKgyU{w_JAh+KSsC33^Af(}U{H*m z?L;bZu99H9@$!QQZ->p&pE;ICP4^<F>uaYzf5i0=yUETc&C$!0loi7>M+p0+jn>*( z?e~g#SjoVKiayi<-MaC7A+g;DO+&jZIRW4*u-GcygZsL%rHcC_)AEn><lz|VHK4j& zo6vlZ1Ru&vfmowa+m*ekx0NX)M5<8r5HJ4A@@w05S=7n1G5LFs%@#?luG^AW-<yRt zsyi)p68PL`lTaOGBb)XFN9fI{b2laX+#AOPD-|+A9=BxGPPqu+C!P0ZRAXvl$Zux` zj`XD~4mqPM$E&m=O1AT99bbC<+ln>oF<X8ac%M%`o|}*^ZF|%XO~HLEme2JG(zXJb z<aKhmMPcjgRHFxx@_TGb$7I*i$8_QTLI>dW62i=*>8%pgoim4=s%<3^ha(QC82Gla zzA#dxzUsakc#YmUUI{PA?byXb$wzQBcE6&RWf`t_HY+`QDBb?#P{^=};7GDX%?0aF zZADDl(oD)_!5i=k>Zf`CXG~_f@hl<RhWj6-gD5+^OvmO+?n9tyj^RG$h#mP+@2m<; zZJ*ApJD99XEwxJ3+o>bn**h$(yttQxbU~||%*9$^S8AQx?DkB%-al`m8P=jJXh+Na zt<K&<8m7$2?3Z}aR@ppAdOz)T3W6KHN;YoZ-*>sSyFom2fFQlxaN#?a7?EKbX9l-d zgm&T{B#ho9AoAkVuVQKMi*wY+>s%FL1ByPb@eaD=l$1vI(eyr_mvdBqII=E?fC!2% zM2rK%^G{UJ$_n9^1+L_WAh%!tg#>Q;HiUpi52R5Y<bxkqC7GF-100XE*_C>@#)&2% zk~C2E66FWCO&P3IBDWhaelEKsF~teLAaW?R_SKIc7CWAI0vi^#Kr6l-Kk{j%Akr>( zz8}E9AOa}UeLu>xGd@%};STc2yZ+JCZ+mIqGMyz6coTeK`#3y4POh$v!SD?7yEHIX zEFk6+ZH(v^yTmK9%9b)SfJ(-`ThDluCx&nNhcHW8z2_;OCq%4;?4QqGdv78xUORai zZ+2QJ=*|AuOCz&K5g;63p_rZUI0`rgfEYO`Wywl$<If)zpkZ*{8~{wMecXQGsZjt? z$OGh`74q}Z#>~~t*}{dL<K2H5E*}1WJaLFiyyJhz$tNWy#b)bh^}6u70l<)#mXihm zp@4v7$RFVK7{Kz;8te*ou?9O*aIw7u@QceSK_5fH1^_VLd;oxuzkmI{ZlP$)Nk|xd zR8x_bQ<MS#fdBxCtfCDF421yzIDlN8)nvpev~_eT;Ku+^07L*BfCB(9F>`TLQkT|v z3sO!>g2Dyj=?(wK+{{7ZfS74k*^d+y|8f6+LYQWb&aRMTeuVhuGPiIsgWxX^Z13Uf z_~w2F!8oRNZx{;Z4Ld^;2*Ctz*y^8{<sW|jiACSAxdX@?;^!^Rj^+;LZ@347!`$60 zAQ)N^g1@@kSa?A23<T5IyE)iE@Eru>I9Qmt001y3Z|<%ZX4Vk=4uVmfHPj>^SO@?> zK(YESZ2Di=)xr~!P5?jx?C9leV`c41!C=Nn!66{PPa$jJVQ=B;%KFj7%+AEwoI(QZ z;AjH!0s#J*=eMr_SZ`%Z0V!l&4gp?XR!%lZ@&DWWA7B34*Z)$KohT&n(~&VYC$ z|8e`zxBqbi=K}!z*O0P_`;VJx8UWB30ss&!{l|?a7XU#20su6O|5twS-r9?`tE=OC zc6JXB4>lVMGq$$^{kQqQdib}`|2_Dx_}Jd!`*+z<NLpB$xY@f>ycMb$*dFZWOyS~a zVrD_X`oA{f|L+g~D_Q@Q4i+^FOABWU5F{#1NGr1eSwX5BWNzbX0|rspfc|$i{Qvpc zf2H9K{<B>}0CwRE0LO?8fH95(fIc1pz+fW-p!KsMZ-D=<H$_BEz+2DLBH#UIyN6)N z`+wN~lLZwEd4zJYv7&f$mQd56FmrQuf5VVI@n*pSkO1fa8~`DJ3_uNFfQ)aP06u^q zWT=w@$OBXW8UP)DA;1hGR^|Y326zB`0YQMTfJi_b;2R(vkOL?LlmaRNHGoDy8{ik9 z4=@av0L%iG0ULmAz#-raa07S*0)g;AR3J8x5J(QB1u_FUf&9P^Kq;UiPz|U9GzMA$ zK|nX4FEAJw2}}T{1M`5Tz@NZo;4k1Ha1yu(+yw3eFMtnF&`>B)I8dZebWrS2{7_<0 z3Q!tQ22fT|PEg)ZU!Y>3Qlavp%Ap#denAaG%|dNJ9YS401E7(i@t`T8S)uu%C7@NH zb)hYxouU1qBcPL^^PwxDTcG=)r=d5XkD%{i;9#&}C}3D&1Yu-hKEas5IKlYCM8TxP ze1~a(>4BMs*@QWRd4WZRC4pszeGe-Ks|{-f>jC=}HW{`UwjQ<@b{2LU_680P4iAnV zjt@>2P6y5w&Ic|EE(@*-t_yAw?ho8GJUm2~CNsP+yb8Ptyes@y_%!%(_)hpK_-*(* z1Y`tq1Wp8L1YHCW!e@kJgdYeU2vZ2V2#<&uh_s0B5mgY)5xo#&5epGp5XTX>5g(B- zk?4_xku;EOk%Ev?kt&gTkyel{k&%(9kOh!ck!_FzkyDYYkq3}Bk?&EkP?%68Q1nsU zP-0L@P`XeSQ7%zYQRz@cQFT#WQDaa`QM*ysQ18&N(b&-B(9F>S&@#{((5BE%&=JvT z(Z$dW(Y?`=(QDDi(T^|?G3YQPFibG~F)}ckG3GI@F|jc@FjX)eFrzSkU=CvLVZme3 zVM$?`V|~FY!0N{OgAI*MjV*y~h8>Juh~105jRS{6k0Xa;ixY`cfis44hKq&EjjM_4 ziJO7jj=O;ejYo$khi8u$i&uj;hxdR_iZ6z5fgg@vi9dyZOF&E@N?<_{K~P07OYlHQ zK`2FNM;K4oNVrM_L&QX+O5{P5P1H+tM2tf$NNh$NL0m(;L;^*^M50FGLsCF8LUK(? zMk+(<NSa34O?pIzM<z;UOO`~|LAFnhP5y!0hCGS9ll*`JmqLufo+6c^hvJNqgi@B$ zjWUmNjPj9+p6V0TXR0cyRca(^erikVB<kPPXEfwAN;JMSWi(5)h_w8)*0d?K{j|4q z^mJNup>&OOd-MeKa`fKxW%Mfys0<<uklR%lW*FfZ`5EmPvlu6spqO|d$59zf<IGUZ zyv#PtS<I6xuq*;BAeMZVc~%rwF;;ihGS*EtJT^tP&uoosC+sxry6o}n{p>IAc;4B+ zD}1-ifyE)u@tLEA<ARfk(~L8NbA}6*OPVWytBLEJo0;2!JDYof2b)KUCzR(m&oeI{ zuQP8Y?>-+5pD|x1-#kAK|405P{s9440dau<fi{8r_q^|2-`Bi96=W5(6Z|2#Cqyq~ zAyg>zN0>_3L^w});{(M9;}5wXHbf{zOhocUwnV8#%|(kvcf}aRY{kmOPQ>4dJB!zg z-%7lf@RR70gqD<%jF23Y!jk$Vl`gd=O(kt5T_$}d!z1G((<KWls~{UMJ1<8nXC_xF zcP7s#?<e1*fTEzTkgl+$$fW43*rEibB(IdHw4zL_3{q}X0jS8SB&w`_r2pvju~ijL z^`mNr>W&(Rny*^FI<~rz`VaLR4RMWFjpa`apWHtE)<oCT*DTe%)soao(Av;u*Y?vM z)*;fd(P`3!*VWX8(1!J-^uFnB>+|S;)t@t<H}EtVG$b;#H*7aTH!?A*HHJ0TGX7!w zWTIk{Z*pxaXPRkxW+q{lVs>aQYMx}iZy{`vV6kf{Y?)xWXC-WvXti%GVx4S#WFujd zZgXxcYnx+xYo}sYV)tsVWnblh;9%^~48j80fqKAXU{CO*BeUaI#|@|VPT!o)oE4ml zU4SkIE={gDkj2!98-rVj+ot;m_YC(t4^59+PfSmc=ZF`RSGd=%x3qVW4~&nQ&u?E! z-yq*jKQX^Nf1tmq|L*|mfG+{tfii*LgOGykf<`~T`<(FkDp)JH<qPSTz%PG7WJ1cm zqJ4G#Iv*++niB>SW)n6R&J~^({t{sxF%<bOGCA@o$}DOKqToC=`ZdNfW-OLBHaiY3 z4iq;RFB1Pf0W-ln;ZLGcVnY%|Qbf|#H=}QZ$=t~~DM%@9DI2MZsZD7#X>n;!>DKA9 z8R8jLnIxIvnYUTySyS1f*_An@IgvRJxi+~Ac`|to`E>co1#kuK1v`bBh5beRMWw|= z#gWC&C7_ax?`q$BO8H7le~|o$ErTj^E88#EFQ2H8tZ1rat<0;!tBR}!RJ&Cl{51YK zSEEq#yOzJUvW~VcvmU!Xq5;_8)o|8m-MG=D(=^#E-~78pu%*70t+k|$vMr+>w>`E4 zspCt>Yo~YTb(dq;(J!lCe|{VNUhdZJp6OBT8S7Q(9q5zp>+Top?;H>wXd8S#*gV8P z)HuvL+%Up3Qa{QwT0h1+)-cXD-ZUXF(K0DC*)b(D^=n#kx^G5qW_VV4c5?31+`_#6 z{KkU$!rr3&;`x&M(&KXA3hYY6D#mK^8p&GzI^%lP2Jc4ursU?xmipH6|6uPupqlE| zb>ScgRuB<EDFFci73m-dL`0g12na}xbO8a8UZbL*^bS%*K$?JbsgY*ry;rHB2NDRR z-{rTz^PO|<+54RR-*N99<NTL3MpnXFSz)fZ=6v2V-}iYJEf+VIT$hN;Z&%K)Bp|`a z{8h2l`Zblc{&nN^<&75`gw3EW#;w$Cf$a*^9aQ(ulbz+=m%9{n80HctcTZxkdH>P= zEY=ZAI0!ksbeM;`g+t&C@JNCuk&c)|5+v1<HOSKxM+$|q4Wd`Ha<;GrS^WTX0V>KA z=q-qb`u7Ix0eJ|#=#JCS9H%=$OG`&fd*alIlfZW3)TuMSH(-DE?3pu+zqbp2ZB#VJ zkDs7B!Eovn!v%VJ`oE6<(;p~5K#V7->ZzYlQ!#>$F;Y=8Qc+r|0EHGr2dEOit)IVb zG{>or(NclvPMkb-nhJF681=tB3ml-PIZpe>$#bA%RMgbRXpYg+Q3JbUu2jdU8EHVr zxzCF#YSS{AUvYVTK`c6xj=A(MPm|8Ty!b_n9p0C3cKMVfbYni3S-Lh$-s6wWDwkq; zY~|K6xNzcX;K@_0m)^!Ht7KQ`59tY9MlWJohnM!O-QUIMRJM&Q@7s6;C48y+Il6+C zRyDBo3{K3gMvNg3ZmB(a=Jh@)?|b|B>Y<>Fx}lx-hmZL+9TRJ~YqIx^?0rI#3u-$j z*YUuO9|Kx>{5WtAG$*L39fA8{q^9}Z;^W#ti)me6M~h{a?p$aZnCH36tYh(VSDaTu z>CMF$UB1tjWzBT1gOUsP0$Co%0=>g}>8h0SWqvC+J!y1Sd5eJH&?4q-Tz193Z?cO1 zzc%_Gw)sD4GG!8UhWd|YGJ+tWy`Rh;*EaRW3rh_wirY*>>W=<A>W!npa5NW=px_7z zkC5;P36GHQ2nmmn@CXTyknjizkC5;P36GHQ2nmmn@CXTyknjizkC5;P36GHQ2nmmn z@CXTyknjizkC5;P36GHQ2nmmn@CXTyknjizkC5;P36GHQ2nqjtBB3614|-TmW?}Zk z3lj|~pwl6BBo^`w3g}&%DLIq^x(I7tD5ijvDWFiuyo&+sGX>O^vGctUJ^)+jJ2cUo zTZQl15^r8Z9sSHv-yDsb|4WkrN}2ei!m-n8Lj`KvXT@tUCnMPGa=#y<;b$mEIo?M( z-v1~8{NGav%onJ?eIyG|2mr5tOeG*HefMv~0#f3VqEh$nN{Nd89V!7eklKGqB>;Q_ zNDHR={mtL+M^pkwR02m-0!LH=M^pkwR02m-0!LH=M^pkwR02m-0!LH=|A(jqXlVfM z02<ok$7xT}0<Y5mi@=G~XHK0u4G;*N`-4INc%x@H$3TCEiRr=xCMI?^Ha2$fUmF!b zmvi>aS=MvsST8d(GGG4d#6SDt4=MqWC6(_HmB4>rDuMln{|AW#nldoDYURY{I<!aO z&z|PyN&gK=p6HzLC$0MgA>Ezy;9Rrs@MLQ4*Auf5%^mXW?zc!LhgrkgD{^&&8bYp2 z+-lmN+y>V$58(`nM7V#ECX*I(n2N!N6K8&$6F525XpqQH^Pn!Zfj(|sT=krUmEF?Z zo<uSO>B%;H>ACl7VlL;xK717{jn58HP9YnS?Vfm}_991aSeKJHRx$gA#)&2CI;np0 zH#&#xRg5zquM%v(AwT_Eh)U!@qf176Fnk053-k);5~TA-zcyQ3Mv<}MdUe9+F3I?< z$h5{~A;&A0%KD(k$t$78F-n4<^bFT^a?i7!KBWkqw^shfNrA+dmI1mL+vFUKe)xsj zp1tS}|L4WwuA=(7VsB0eeV2K7qkNGq-Kh)uX((Lbu4wZiACc!fPNBCqeAg<p&sCEy zn%E+7b3pUrN3Y%Xw}sb*>f)`<zjN)$=(|2j{9Z#!WE9fpQVxs(ZwD@B>_(=**Kv8U z!N+qLeb+__LSGLSy0itsr$PoJhp{ENpWzNqhMg;yhlRI=FWxE&vsf^Q6BOd}!d#92 z^1M#=<yC#h1^<d6OT-xy#<1sIQPedknMyB~KNk`G5-A`VY6>V;Nt*%+)1O0|iz}9p z_Zn+9GY;R%qbVRa!^9;N^5gra<vA&ni|=<MTJ)kK1IrLE5LiF<JyKEiC0R}9oxYVd z|Ib(plvJv7uQo}P1m*AN8gm(v>PxTwV|=tiq+w_yTp-!pn9M5<HXsc*^e#?NK)ajJ zQ9rxX#VrPZ3Mf^N0{W6g4ufo3N;M=Bp$vmK3aA>o1nZ-Kybh+P6axMi)_mGw8DN~` zeji?v0?NDPnlT3R2>`opa(2Of20$?InT{~;+hm<B2J+-ZINJMV805)8u-znN0SCz! z{@%FQo3>L0!39!40xTb4Tk*aW&?8j5EqU8)Ve>XW(V2xP20Wz&lNIO--xA^if-tut zeAwnl0iBPPO8eLgr3=I&SKCmDtNy1`JbP#UoGWN3afyMfc~+GyY7Fam+d~T{4C0Yx zu!VC6U8Di;Uh@W?2^c@*cJ_cjgRpmu4*u4mknrSJ>|AH$a8mv4lCCcZ^`iN`uGlt$ z@@9LV_cw-F_ee}VVy}?`@?8_i33(RtB+V*BnSuSi()H`7-kcbJBkp#3CFTQdM5}Nc zecO}Z6%<(mDgx`i4r>jvT&I9)6Kke@A!PYbd|$YDs(&U5jtPP94Z{Y4Nnti)Wx!g@ zJRS<cZV)4ZM}p!cq}cZTzL}?FAL1``aNOxBlWu4CM^ZyYdA%ps)=Lj9@t!+$qOR-n zk(M={4T+oBT*LME^9bT1{x%sU9k!8yiJA4Nj}D4=bjWEU(0%xxxaO?@3`45qHEdYl zH3qvJthfdhp+ztwiXcsRvPMJ`hs8d?9#(UYE84S==>``Mts!Y$a|gG<d!nBTb||0; z4YHuz036BdN3vO$JYG3+Whx_|C5sy;A$I|cr4tH%w#2^rT{gqAB9=2k0PG)Gz26Yn zK9|m^g?SJ?QO9vzKh~<eh9|W8t?sGoev#*W&x}7EZT5XB%r=?cz3%p@JpjYHF6)cH z27k7(?5$(=VnF_^!@XXHi79&KY_Le-rE)mT!%xh!4}i+JrtBkbDA=}0%C0TF{mK!# z%GqV-=JS<SMznS5^;|cn>Yf~etdCqVAU$A#?r4z2Ph-4csb*OuhE>?`XS_ICs~3YS z?8rM9@|mp4;I3-$$mJ*HElH5AByfQ#;hfIr*)R;Lz8VvO>iK!65TY(59wheM-kC0M zq{UY#=6X-)GW6>D<!?`KzVVT|<~yyigQyOGJR?xY*}pt|!8hq46^JoPS|oG6B<CUV zjlu~O(6Up2HEg)aodTkP4@tmMx`+$-Ts*j+0?JoTCO^XEV)%Q~-73nzk2%e0R#HIs zhoy~Jv#z}NpnyDNPNR#h*2I=OL~aaaV*`~w587FCN65Y0L(KXRX;C>CH(V@G4fN_O zC-pWnMdTc=J&i#nS%X3NZfyfv&uq0)h_NArs51n=%z!S3W>oNSWYrKj5oHZgT}dZb z6xe;?@5v=U`?y9Sw<#d8eVLQ8b%w2)`fL(U?h=z29+7Uin#wyFy62V-5yUfF6(V@% zgeV}}@n{ODvk8MDJ*X`qU7d#YcpI#U!EO<!QA=t3_yovaG)cWG7T1T1|00{TUsL=@ zH_p@CiJEHsBQ<3D$8yxDb)*54_U1~kz#J=hWREl@@7WH+L{FOKO6YUizLx09{hUL* zm!fY;oG%#gTUY&X>08s}F=Gwe$StTP+Je@LfgP3{P!bFq$GQUrUb4l$6?~gM=W4ZU zrR$YBUbqD5izFuFk)+EM&@e#vy8&;2Fw|fftl^6gFm7&p>8D&81tjPZOaVEbhT`OE zRKQ<-TPn7|yM7tNiPKOQ<ikT_FtLdOiaXs6$96UV@aEZBP62reyLfQKlBGk*mlzHd zcW=51f0rL4yI7J?7#5;M6$SJ`J>_9HQaG@Q;JRmV(6y)VuBQ&^^e0IXPMG|Xjsm(G zltlrt7QvUAZ33aBHGkI$$nFW>W%6o0Qe-xIyl?~}0GGW<EV|*NP|@eQjO0=wluw@b zwBj&=tZ3!<(R;)`F<(m@I*`k);Os#>rhj0TI%m~D4uC;~9~qe$%^J12+lgs8$_58L z8y6ExYtoUDsi$EyM^7g$pJZ)+9IX8O2J8PGkgE5@v|s|D!h-1S*V1S0_0D>`Ra~8v zW<J$;{`(v;8m=Q)Ji2};FN#m^n#i#InRPG`ydBI909EiLRHB17Mr}~7ZRw@q%!eCK zl4I1@AKF1RK~zdH{U^DobbQX}Bn!v;_3!$0WzAObzT7`vk@M{KSh!fgg}TrX_i?I{ z^DLyN39_;>syfAA!m=N|kyC7!;R^ij@I}!7IPMaz&DGn5A>I!mlVD3FQMks?+Isd= zd|fQzjHf)q^QmW*R(QT0Kg=Y|))M5-s?4wuNtnk6ID7RJHi@8mBKa94ao4avd66(D zh05Hal9F>0fDpfQAr9{f)(dWZ&0*U26dSoLsr?bp@WpHqU(+bX^+xdmPhPJJ)-yZc zt~Y#-F5SE$?Qq<I%dq?8_<hZ%utP}j5<*-;#!JlLF2-!c1GXaZMQH=E&WTzeNFOSc z^$?aK+Ms|e?Y)nKZ_GZeM9<X6R}IE#c+e@iiVahfv#nrF?1R_{<HQrIc-zvnjQM$) zCFzcD<UEq?Hp8VJ*GYv!K-9y~&a1+FU$S1LI`5ZN3v1u~2D*28FJGA4B|UjYPNcES zFJrQIV0YhydbO<@aR@hPTEiuyQ6S*bK;l4}O>D=c#5D6AlDNyIX*Bc2UlGHSv1B@2 zki9!T<5y(c9@whx%sELJ)qOewY6P?Gb=5wd6z#2nCiFBuj}8ibI;3=IQD`WdUBK^5 z<Q*;Cb=|E*i=jULK@KN)Wd&Z5FrmG@5&(VGH$-*`?)}24nQzx6$h?Q^RrWjW18orl z6einQPCtTU4m^twmO=qtXeQ3%43SX5pH7k*ocfZB`x_qTTXerIskX-RJ3TcJEnBmV zOq!U%!kp~fZA!aFh(o0$_-PBnh^<)+1#}C8`v@6j>Ztu%zu<0})xDB)KSI-4m%wMQ z+mh>&VoIAEK)vGycBs4Xf^5q=cZeXM#xN*<YCsN~hBPV>4=JFIl496E2}!Xfm0U*{ z+96~-#Tt{vcPXGW^7aGEjyZJVGZ?lXfbQ6?ICDIr{`SKG3W%kHr0(B#!0Cp1S4shO zgK>B2yC|UNg>(2|ze32t%L5kk3CN-sd_D@$1i|N#VuZjM81f=ymI4xm{k-mc827Pa zv-jnp9Jm^yBJ2lOS~Zz!^!QUvD~X|ikX$hIGkeHx$Q1d()n~xCnN1v%kEMXl1vf&s zLwjA%u3gevp<7<5St>GK_uSYp($KXIc=di6dN_jE5_XQKhh}Kqun8^LOdo42LbRRD zmO<o^(w`d(c$6p;^N6#<ekpEM((j7v>%>PLT<V&QzebIbFZqDeaUXL=Qf(p!G5!sk zM9JvI$Xt;nUt;8jzh3tGq(@1vV!mB@QBQnlaFCTG4R~1fF8!|+tl0UBG77pGG&|kR zmO<JptaJZXPtq+UubUyQHz}Y)tnh|{1Tc$&0fnpg8U-{2%sUk@Ry4(|i!2<x=0^cd zm7pO=3aH+9+c5)jUv6fFRjzKiNYyy$Se1yx`{1X8;2;SK$Y$y0pVm=t-yp|BFAH#M zKyU6Z@OgWq@RgiAlXaG|OU2tucDYgewyrv^ALGKp6Q@PyBLq&|du$=VL(E@xH14^) z+!&dI=v{Hu_sCOQ1ly}#sn8?$*2p~xTW)6e52)izWbBH<t4{g`ZU|oq(Dydzz?PD9 zW}Mtb=!){YGjnXd5U)cuVI9yf4X&_2jWd=`{-_v_Tqk?U7&+A-jw>>LzT_JSF%I!d zn8f9=c)uC@UHdAB{m&JlkKWUK55r~+y@13Q$d`ppdRegr+fK}s<PF~6?HVEu?PUb7 z&!C+%<f033($H9Scy@?tzMb3W4-&jl#dMaHtR9enXRh<NmX-G#ySC(fx_Nk|R#jar zcQtr*vP)&uEuRk5CX1CNzd5l@uXDOIPVs^_%Op6V@i_&=>@EIqWID2_*2mzJqxymz zuLOsTZWJe-tfmz7Jg8A{N|vE>-8Rf$ZgE=<t}D<rW4u(-2fa!G1^b~STTd7~9F;LM z&X_naN+Md44CERD&-6Qd+tF%otlNY?Bir7mQm7Az-6k`k3F#gYtLv+6rfSyK5?tX; zG&XDl=T3YkXrUK-99A-}u1(f(P1gs+uZQQmu(VvAsbOsQWlX!7A<RzYr&T2Zjvwv= z@61H5r$h54Fq}1ZpH>Yf+a^eDVM5pGH}4!i@-5d^(c*2rV&!wIR{lo$a)baTx&%?P zOJA68x}Kain&U;z8Cfck>svsJT536Bdu?>Yc+*R2p0=<*3gg*peRRlA0VS9{f=S{! zTkc;szBAi^+o^v4h6G8m;zSA!S?pe=F4-#XzpN=y24fMRfS#anu7?VJ_wFg*dzAO- zT0sbi_6JBj+wXCVW*l8oWs;jI-J_8e=7{E5_0GK|ZS~XS_N}N61=iT<rDuCcg(r*b z%UlZ1!NMg@&LvL5PN^NP?mRtm!G&^RhLM90UC;BT2-jL5*j*SS2Ht1xSj{DHs>5#K zs;2H+bXdKbwm)B@_eSg*U0vxZx$7o%n!&AUZtiK-la{KvGLX<Xf8@Ta|A#MY374(I zq%QlNbhLHK<bETntOrKcpwcc_ToHKb=OAUb{4urfLZnzohos=Nagz&8!U5ygZ})Tf zKK!t@HoyCozLoJ+sP)ODD8<iU?tmA#^AG{=MhypLp8E~ZuWP@CcT{*K^dRlcfy886 zNMX}_Z}1fYL-|aed$PG8%$p+zPlot^n^7QdXu+%D6|Nj3U-Ko-(--W1vxazeKWh&( zpI&Zbj}l4Pjmp~f@5;3QwvHDHDx@EPPPM%V{Bi&F+MfQ$;kzc<bPYR2`qaTUO4D7U z!B-+WBozKzBQ@9+7uuB!Nvil*QDii2V%RIKTYjCPY;{I2v9veqs;H=H?7XbJji!QP z?4^8$HZXq&{9{J^BqBx<98oPR*%ECTKxalytssa|?Qv!`NL)@6ZS~7A-ZYy=6bH?w z2Chf0aY9{Bb=!LMP(U}}5|uFC^$TVOK9VgA#ZQ<hAigWbU0h%#H~IG+L-r4OmR1Q4 z-*z`LiPM2`a78pBL(%)7TUIp*A|P3$tNz_MMW*O1hfkrNeMEy^;&++qz9_AeJn;(N z6Gjh`0|pS0T=P+hi@$JeG6!R`1V97>YKf*Qi4`{f)6rM>uo0XC$Ym#ZI|Y<M-bK|^ z`H_}jm>7Iq!tA}ua+Tb%k}N~jFqf<jtwWJqNmAA|gz54IDYTidPz=&Sjp1deofBD! z-e(yEW5NPV-!KTTUnYE#HYiVdlDdDcnK>LX>M=*sPD$@UXp5oz#->co6Q0e3A1D*G zHVLyMDf}OP^M@`221mMSur~VA$T5bZXBghR#VsFQkq~8^UVJ3JCUBA!#c?1HEycG) z8q8Bb^mkNSogiw5jfOo;>m{E7L0x%?cTjTcR_xl8iQ<c_N+-r>_|lIaxQ&J#U9bQ5 zX4(h38v@bfxX8oY?<)iIW-#2$5^7gCdi%l2KJCE`Z`)SAlvfI0ElF0zvs^Y;s~Onk zTKat@Cm{(VrxiZnwN@e2SmPxV<lIwVE#jhTN@H&E49;eLjrPlzg>I&A-`@p@(BWK8 zQ9z}a$~HGEd6-5P{L44Va@xHzEtVu*eB>-(<Me8J*9}&DLl@N%J!#D5UXuwr`WGM@ zw}i;8)(ts{=Ad5$=7|GAd%mF|FbrDm9Ez+TR(Oy1CA;)>WPJ83y4v6lX4|p~JSnd~ zqJZd1(Q81k&tL;MSzS17xBcp-=m&OP!$cKQ0jd1en^@yFTa!W;<&8uxZy1pc)<cTg zip^$0{$cIi3h}y0K5P0{_RKmL7RFlea;lrcG2(adXv-|`P}2dv7}G0c-;*|vVjAj_ zCgLu?Qrj{~6}vANerqy~^Tw|;(M;5Ew<)qdY=xinz$ci*3)%02h{xjETFLhSRV!bK zB;ZN>3TRnc_@sRXyc%pHa^)rLRtfrQB<VhQO$okiOSXUwBLH8Y5(Q)e`+X@aS^~EI z2r#$LH#l_9nvb2~e=_VON$uQz$BEbOmTT@!xmttwok+k%6kcQGc#)lDUPYwQP4Gs$ zj8+Mp$NBOGy6&Ehlh*m3)4nIRdG)|MAX}x+((e^+Zz(8n1Zc@ZZbc6Ei3|4s_f{dn z{<iu=a^T2bxb%~u+@Z?bZnb6K&BR)`@_1T3Y20a?#Kd1kWp&hP<)vTx@MEXl-7g<k zh*QqTiEYkIV(QU*J%p56y-eOM_Tg1Owk$tv4}GDUOA1@tend0&&E@f(uAwAX4zlIG zoA-)^{CT?^?+l~CJ(AMHitpFW3zS!9r=(UF%XQ0zEg<?2W%$nBSu%NmzhP*5som$7 z6MqSo&znx@pYW*73Io1arRP1%rdO8ylS;yDk-Rrmi77qKc9C}!oE<jrZD`**XxZl3 zZ*=StUvtifAlaNhWuS3IQIYz+XsdW%qPdms9-1ibJuz7CzJh~RJqdG9RgL=u(H$w5 zU;4vg2Tnie|2^zCxDSi{S-GJscG2+TIssv=WA{s0K4GDZ>5a@pseoo2lgz<5C*bV6 zRboE^c-U!#@w{ptnUF>sLL>Vm_9;HH<~Karl7?YlVbcu+slJRlW<O6{)6(2dbs9=2 z^P#Le5^wtMI4DBLK9DT>{W|)KYi+$86Hlgp?8No}aWp{;V&X4$5CLbbyD+e?(ZH`) zF}ykTZX~WlPG~Ad#2jj=iGHuv`bPG)qsoaD#EqADD*>W5*%c!{_L0~FD>f0Pt&b^f zGs3$FoW898rv4F?k@FZ|3U_K)sH*L=tehrxZ89T9UaLp9JzYPeN5Nre?+Ff=1hgy4 z>rwn|*GZ?O4!*FneqXuLQYqP@k(;2~@3`WlFjiSvT~Qe{Iw{KBP<!K1Yu&Zapn|M% zsx*NM0t$RGAKN=sI;8YoeDf|LE(z6j;VgYN22XBf!=mH(H(Zj8b_t*NW;-67byM}T zK7g+JWhAqVribISaJtsWE`Q~v5wo9;@(a4>@9`~_1#uUc3f8iB53Z>^@+|OfoZVV` z#s}hV<@a|;Z0X5>^?!W=8*UROT`3_w?uIWl5mBXpNion3IE;ev&f_RNb0`BoDTe~e z)}w$5k^rv_1JXZ~9AQh&h71KD{@wKmoCxgpCUnmgvd>LU!QLjnvuGiI5rnNV!`8n* zIs$QX78Fp{M*yZ6_U20G_O4$9?~7_sKx%+g)DtB?0QVADNbG$iHP{zYq#l|jjt3o? z;J7ESt+`-a5y5Z87`rY5D?9C05@GwaZ5|Pv(&<t1jKj<|E`qJ727RIZCDH`PfLR3E z*jNMDO7ML;dRIIOrPZ?SA2{KB*oPo{5^6*v`C*-=nSk|lcZ{rcQ#*Krb7$+eDiO-R z&v(Ew?LE|Z5kUcoz?P3;gh^#3uyqbJfTuHE)26{z6j1mA1r(%2>i5$~?b>E=2RsE& z0CzaC?GH!Rf{x8lxlGruoq%Z)YXh3Zkm>4#oBETTyAin2)YpIsotZ}g0ah(e<m0C? z3djd)g4H74<;1~ig=M;>v;Ftej4^~#z0(_Pw+S*|OUyMwHQtK$oC%C6t7<*>;yzc1 zP*PbJ``gd<O3{7|xCWf0=dybCsKh&m$eU_Y#an#&mSr7_93BRE`aOQt!hzI)%so<H zzAt2p-TkR$N0m7`v97P)ufE3VX@hR5!9QnPnnP2~jAOgOiIX{BulH_GC@+`o^KJD> zfxOCIYGb+`%@pLUZo_RW1GT=sjU4pnUnD$hl<jrL8e|4&kS!2PDA6*g=;fQ)7q1Ue zDWnMb%e><7LUT7nSg-DLvRC6ZdI{>|NW-9c(x!A|h8NM@-_F_Pcq`+yaeG<QwcwD) z-0|`6lmyw%sW>-Pw<D>~D_*$!<)V=I@#9GYDog3FEIuii5OKt=DvUxteRy^!-#`W8 z#!$&b`pP?vl8`GSj}P*<9t><$Ua@`qlA*v?XuNE2QRd~T4uv$Jz;Q{_vdpXfNMHye z!S&TwBXR!6ySsia8pM~V$=`c$?4E)$6ENzH0gsX2Efn0d!~g5(naLK$F4p-&48&=U zE@#D|yN=mAn7Bk23wwwY+GlfHhJC(RbN^Jrt5^Kc%sViw%)647w$mFdd04Fqzq1BZ zc(JWrGI(UyFCUn=93hQ>-y_u?Z981ykRf4`b5rt)<7R=Z@y|InhW#bzA=Gag>v1{q z(mJlB%0CMcXSdkNmazdIRye4%=~yrg$u{%pe+XY9LDduuowm}R(vk34snDHuv9CLe zujygd>u}-xpoh^>a8GFIE?XAQg%^5pQJu;sc=C8;5~r!E{BhTjNpiVJ8s7<d`Rm$R z1+y{)L7g)%Gxpg^N@WtW`sVurl>2?vCxQ*W<T1=Dxgcj1ApQ!q`udMLm9C#EJljMk zOV@tl%dS$XK@8a|;5j_O(coVH_A%U>0AY!)w(tsLkvy)5mmW0!X+&{o(Z~yWRua^8 z%vXFI@-Z<qE@0^;Ihv$|I?Uz-@^Mn*-jQw#-!jHK4(%0{#pKRDQCVDxr+^HuHBHL% zV>~$WH_cguMB%F${V-_H7TzZR%X)(LoL#l(%tZHf_MLBT5Vh^wVG}>^-bL^S^}O-Q zHW#tv?*Ck-sReYi0tD@_k+J6htgyX6LW;?IL<QuyJg_toMuZ_@b+N2yPh!p_m{cJI zTS70h29%=chbmxgXqXPv#UGJ&d;U2LLq~oj4EW}zt{spw=dSgUrW@MEJ+uyIg%7PD zGjy#r-HpEvpt!ck19&&|w@Zres^e|()J6unt-gWKIpKahixevDUlx;>;J9`$G5K=j zA71m=lgVdc2RZwF0MfK_qY??9F{v#+s&j@TaLDf~%AR~q<_~#ncqRJ2I@_zx&gQr0 zJh;Nt9#|=smNFy*aumjE)89P_*y;;*6^={w<zS{slup;oXQDylRQSyj<(BnG;hMcZ z+lDWfHt1aqWx+@o;`e$ULfi!F{7<fqqJxpn%c-+^V^H01@5!%*vxTX&cbcyIX`akg zoRP2EO6G7%d84logYPRht&n_DFOxBM$9V-<Re^4Ke=(Q8ErK>!fv47gdNZe4YgmCt z%lh|=-90(IJ7ahqI$@6b$m*_(=!*Tab+c*6K{_cPxU1(d=eAV<K4mltPvlL~(AxW# z-hNjS$w@;2wb<CAKaw5#z~;Mi2W2Jek)usSB(4YPEO`g(DSguVOGib5{?nfka=aFX zQ`0XOw~}fqV>?R6Z};|KT{W_=XtV2r+l0ubbhAya%yZ(Aoz7jMB{H~o=O0@QJfE-{ zE~XtZ`^*gK;Zu0sXl>_)<b{8hsl7S7^?vo+7HP9F8t>n<Pt;aEqkch+Cq(k(Wr5EH zd7nV^KWy((FP24L?GuAvxXo;|8W9$e8U0#cpP7c^J=a2%niQBdz{XpVn2)?p5;!I# z<AXipJJqTFu)%9Pc-mGvziqxdc(RVAg0@7HJ)^A?I?7J=BMU;~{Te)1Afiv6C8TKj z3Pff+`hZRAE8`N1Y76VV%TpL%Jc7^+GPLgGA<(rpP7O(HXo^3q9QrymR9W$X>$Ti@ z$x{%0x6=3TKOF`<AM6sB@z;?G5cnDk$N`IzL>L5i)3$#fC)Z-hD63G&?Hv-HS?f5X zDSIQs&VOA_T(x*;r|bPo;e3MN6tx0lknKUz&si5zYGl(A?$v(D17af)i{X!V%o=j$ zxm*>^aZ$kfW%=DKtYt#@PDJMqg08q5e$DcNCxhtZY}c<5wO;;~cHbJX7l~)f=Q$J; zJF6<1pYm{cP;2sW#7rF6MqDUhvxg&xe(~_IzP{nZh}jUr3<qm1g-OABHRq<M<f{`Z zP<iDcY#X1;)GEnpiNEM(LjB6Z8nV^$LOg02EHW>-*e0^<S$;cAhq<<H7Z*EiTi4dc z=hmc!#cFcj*xs}^{ILGeL7jKP*UxM5#QWCAs$41FkWN{6@_xHSxR`>DnuA0u=ebsf zHs0WG;1A=@u`TbH;^~+we3dw389SmjW$3dH=qAjbpjXnCduaPqhQ`7xKhvBE7%H7v zvIq9ONYzl*xA&A5@H1BXGS&&O$C1DMm`qCB{DN`2fRh|*0_a0fd|<E)$@3t0{y?E= zvzllNC@{B4(@BU}`0~wu3TP`6fGhq)ftLM9FORe=vT!Uuh7h_fw>Ed$k^)MCpkI3@ zk|zw{`}8<{*!J@F&6YCQ&s|sxH+fZouh;s3t`;zVZ@?PJfbs<dU+fBs+fAe{?|4C+ z0>aF20m1z>)qY!7hvg=+Cd?W>h)>Vnqe^E}yILa}#2%-<cKw}=>4;XVs$zVX0Bvo} z_lisWobqqAcmz+()%JCxPX?vsKUvpznH}%uuS%%rH3}b&x8~|EyngJGTHbB;I4j;8 zw{YM3*u!kDDKf>_dtAdAV~}bi#W1n`lSP}k$yY-rV^o=Hlka}orn>Zb>`v;J!1dWK zdr^cEqu@QZMD1BKUov<MzCH!0T32`}pk!C3mP8jH;huT2Ux4|6nL9(^-=Or%qaTH* z^2Y=F!ydEr!BU~oK~rNGmUynB>Zyi73nM^;C#ziu=nJ7ws~WeL^traLw1np`Zyegy z=TO{-o#}%LdgJytYI(>m2IS;Oya?b<2$TOKK4ffb3<n16kXiYIKMat&_Q_^x1#1{P ze0Z&?p^5OxPf>bL+zCz7j6*yEA5O`oys%9d{A~fg6i)La0r0g^v^Ln`yR73bFBdbX zV{yD&>4$!(0M5@0QEZ37`UUMwD@0D1jV-j(xO090p8cWLIw4)j*WBOy#pu}R;N*1f zRFK=VX}^(IG9__p5@szIpIAj+I1z=S9Tt(gW;|sw-Tlq@9;SEY!v%ZOq{HJzv2Txg zi>59zzLen1U(&)M;Nlx%2=|raj%*s^70y~k?Q$2zp;{}1$Yq(dKt(}kq2Nh$TK<;P z87>3^il5x-=R;I*&h~>ZZ-Kk;CbDL+&#S6lM80Dwl=k$vUCz0*g5(sXQi@%vZ7|bR zQHteWh$i~QvZsXoZAm5?)~kY(-Ybb;7~6_s>tT%*1=|%_aY6b5wHr;!p_8m$S*<d` z->{GhzZ=Lik-7ZB8w_JzOEIusahwR^I5Nd4Yu0|!E+=?XkhB-L@`FpEC*H$}(-lG| zJ@s&)oI_4a_%Zwr3Bq4*GxF<ikzql@6;m7!fBK$2JipSre8#njtDr0cGrnZa$gLXd z#6Hv}dW-XtYP8=n4p6{vZ56GRYxpi3tsA)%`m4WZ5oI`DM3dE=!BV=B>_^Jru9s%W z_Ry+4ETiI3{S50RGvOPNQM2Q-<I|FrTlH1dg5@n@5>9Z*rzd*6KhTDbTXtPSgz&0) zh7Z3GH)Yq+xPmy(65Ydm;k>&1E7n&Z)TnG@2kH}X3`nSmS}gRAo2f)}uW#jbQNT?} z8=-}tR&BH~@9*`)GDuIF4X?Q^eDYI2P)+=4(x{Ku=m=0j1FP>6rRLd+t(9kchWdNN z878Ci<UFX&r=)MaP-Xpu%eC`JceHsZ7d$P?;L6pN=38peK>?-9DwMe3vWhgFEnOsp z_RYjpnaYxl?w&nC<9;b~^hav06RKvv#KxU<@zc*UpBW1C$bLy<ac)8`a$}$C*2b=d z!k%~coOuPhs-w<p&6;^rwEEE|K}qlZ8k$OgbbkGI=$6SE^t_rMfj!2Xty}wN&XWJl zeeDb9+rsN!fjHFvj1q7q2)r(A)e=7cJI+jahYUmz=ueg482O1qsmS1)3k0o|o!@Gi z2o{C=DS!J>MI(l)t}=OAPQU3)X_<aFpI!Tz36JM$V%5ReF$w-NCcGTW?S%B-u|c!q zNRCTp8``Cfd(V+)3r&ruX9|1_RCdiB%rBIkI(aNJsK6W1%2<7Q!&T`e{hYy1TtIHc z=9aPw)4TS7RYp#i`GtjVvapNfkEWgtOdTJ@5ry_wXSReYjj?s*)$#Xlh4u%X-+X(l z@oQ9l#TEEP!io)NZhbxSS=1SBpadTMdDZI+(a6!)jE7=3YQ}E=&twT|dyuQEKAfe6 z_Q_TdgIL2oBQ*1*unrUVN+E%dq}!PiAoEz{CvWsf?}$f)$>Dq?cWK1xewMM{bt{a} z3)4TMxZX7mNzB|8zE2)x`yND2-OVmMxW&UG5ZEoX&?jdz&%?B2#|Htl*TkRD$2e!r zrQ4^U+@*kiyaNK4V2KFg0NNFn;2v*wQ){p7)=-5%kEWK^!_w-qy8=41yzd|Ra+#Eg zFfIwU^yGEKO)m@jc0hc@c?bWBe|ub9<hZ?MQ&|(H;rt@}!hqCz`>#SlEZ46qZ5LmB zeEatEvq1B+nX6TouSVNtudS_3OsHIW_i!b!P;|T7lOI9Dbp^y8Xj7;whvSR!?NsT! z&D;OiZ$BEFv`NWRU4u?4d9t9jF1N#7--wC5muqplG4#{vyr_aoj6SiN2)CmN?(%Ww z?mw;eKi!z>bBAm7CK+py8=7ugbV@_VC1zwNTfK~x*rB_i8Y^>F^o0eR5$mq~PMw38 zfISa&AROlZcAYFZW#Zqbrsg>Ad)I7&K)+xAI5kyF`Ol))cke2zC@M)yE8Y4#si{X* zu8*o*0~yEv-?qQ18-tFjT;KgSU3XOF`l!nFQI+eXD%VF<u8*o*A62<Ns&ai)<@$d^ zmFquhMgMcVWB<DSQ5yS?-Jh2pqoM-N0<V8P^G|;ITWV_EvHAayno0{)vi?`~4=BBT zoaQ9;sbf?ipvpCf_IH)*zs>@usOgTKpgIXUb^4Dg*EGKiT>~vRMtjm7s2@$kc>Fvq zHyzUz&<W8Ciefy>C$;ZhH0Kp((Q$drY7xz+1eB1zD)I8vrKSN%{&`)gH@h*P?>%-^ zR*_b<6wuQ*xLnpexPZ0_bc=m!4OEUES`@rxgK@tmBdex<A5hnApV`@aczSvJybB6` z{~;tUJ|QvbV{&%Rm)yMkf{Mzj>hCqRt!+OM?H!%NBco&E6O&8JE6CNg^}T)U!6EK< zm1`=XE;kJ|P-C2imiD;gABDNO&mR}11zllM)TR?Nzu<D>?rWZCW}Qrni{d9sd7B25 zUhc5WzmedJ(Pg!~xBI#5s^q1|Qp#5Rr(6SLRos5JSI^pAU;6F4KN^e?y!>aS>pv@V z3#b~{-1@6J_rI3r{<oF6|LH2%b3=2r2WAJ`4Py<25_eR<#*FXLfusKT?>HRv&w66g z$WIO@C%fG}yUyll8Alf6eg68oD)?EsqMn9$llEx|U*>_Zmp>oJ^Rm70N1(PdxKvi8 zr$5tY2TlkxB1jBh8><O#N!!I+i?!8Dg)7zZ%)_LIbMa44rOpIKDfapR>jw;a#1a@v zs49~DdM1|w8s`Vre~PQC=k{KPk`|otV?%R0Akq$G?E|pzTUG=oPstt-<qgn)XSTj- z5`w4m$e@6prjy9EvvaV4PT_+O@C~RL1@wvz1vt+iXdaN_fz(s%#K7VzG^#-o?OT#h z(ETjk!(hI7s=iq3q*jgS@TISg5;YGb^64K&=^%HLQeXKP@;*|3%MH)Yu$am4oy5Iq zce*Xt?0cn63G_qHD@242Z2M$)TeXTEx5Xe1ze<R#R<Fc}DX|w(*XxKxJbK_*aEbT6 z2+iw)tZw=sXPX94?E&0<y8$)hTR`5LTS?hr%B*8^bLV#?MojsNmwK4$30*`^G1u9C zb0{d4)El3?(Qrdt&m0?}$|jn^79I4+BKZ!@tMjbqsC+ZN`+Y2*Q?J@K7-;inr0UOp z`{s^${M}pUUifsRs}fTEmmAubjTJnW()H@#%MN?C)!)@OqpcoCFIZeOj*HT{=e~W% z{+g&#zw_Ve`U=QK(bfTp{WFkUoI<YLyZ#^haST4c4v$BXmaBmH&HmdJ6cB;t0JT4g zC6FVuVfC66kP-fX2!i-A;4Pftn}xu?sp<_E{#lX?XK8#&0r^8F9JlIK?O<8(ZRA1U zp+4B%0`?l_3yXw#0@0|m&*_=AA;7TkaM(MPt5ulZ7;+ot9``Ou#AURR+Fn+3(x$l? zTy|d{GPSQP4w^T+w9av0JI>%GA4ZxZ*AjRM(kLzPnxDGk(r#l))9%_Y&6^nv>)gc+ zlA{u%K|!(O!Fiq~z6WL-v!t=Vp31*FP)LVMhlv0gEXy;MveXqT6aCI<p$)#p^o^U- zHy-vosY&_U^iO-|V{VJ(uiLE}yj-|0va4}{*)!*BXvf1IYPI-Bs^nj;S!m_Tgar#G z!!FPHPI#!Iildr6ZO*k5XM>nc9*cCLYQZxJQz+F2S80A#zbQ}AEn=hdbG|Fz*m7## za5E3Sv)$n{G&Ec!sii#lq{f&TwY%r+v#;85vvf+nZLqG7r4di?(3Ly<x+0W)H@1m8 zsE#G>Q+~vmAh2|3zJ5qSM1eqo;Id9}U}$Jn_@d*S$KioyfnIW_Vi5QyS77|p7mr^l zF32KaF7h=<Eqj?-RJ1p_*|GZLX6i}qn2$7iyy3%f34#~H*-OiL@(W5=jj`7K{Qs_> zeh=q=eBdfnJiwb6aL88WVYY>%j-I)-sX*#ol3JPdFRHTll)U%xhLikDcMZMc5<8MN zuEf7K;C(agd)ig&)@FU0Gjs3W;0;|Fz5aJSck+vFS>~h0p>>`$aPPCT6p$6R^SX?4 z)s$7bxyy^Hb)IOV<lqwyRRhK)@eyBOP%6W^pkyB>;F|;5aTE}c%Kfxte`g7Du-r$S zhafljVN0VKzF?fvI0dwA2_{jE!B?-qmrE!hd1+_ZYF;O79|nh&1anhB@S8B?NeT!8 z07|Tp|0Zmi0a(MX34`s?Y1J8%FEA2otAkdi>NL*Q+&0Is<=%cjl@yn^zL|Of71OgM zxEps}Zp%cU)u<q!T88G@G{IwTHeI#$yT-HZnq4b*?I-V<EkKxkc@}5zOzgpz@v6|G zZSs)yMJbQLK5o-yvF2OR**<44$v*D)PIdR>Tu!gq{eMiW=urIzStQQR9eO%xk)}rp zD<devM`_}S^WpBsR%`-f*=Py~gbQN8SETX!e_6%+F&<YLD4>(W08N6!Rt8aH26(P@ z_Zhr1H(|s)7YeBF!Q4EDU)S$YMlxSGk|cmd;j2hyB{jaquKWL@uR*2YNL>oZSrG>a zkKh0xtYOZ$RQ^{+?cCmur!cM{W8X%hu|(k)<S>{RO99DALl0imuNRRJ4L1D0m7UR< zxt(|zA)NvuR#HG@FPOLRfd>%hgdp98P4<~U$T(*r3;3`fHp^60*RTXPf&61U`aREz zY~k~dAXs%U7~qGn1P11uZ6oPNh8Gy8{}qm`BbTa=8AEER$r+yFu!REHmO@|AGgzW9 zMsPcFd2x~v=@GB2zr9B4iTdI+yjDOAYzmxt9P;78L_KersxIf$+^uyzutRi+_!8q+ z=IfG>t@kX^H5m7$w3eS$S53=QI3;MX-{<qa)}rXo(AudKEEZRg)&th+0}nEnFxAfX z33B^(Oaa?7j8w@p1;)*B$G-Tg+8;)VdnAb6wM_g@I!nIk_hl_I$zQShc45}R1GZoX z+o$(R5Z(Q{+ol<55t1?-x%J-$`sBWAwuQv4#YowPJnPib;vF7rk@#5IHQiF_sxZO1 zQK7~;^HY^p1)~aWZs~p@_c)#_BN6W9pNgEbz^$O7<Xg%eOcy3Ts4_phnaN+aGO7bg zI7zGb>P%2+XK82T<)lbkf8~EtA2+IoHD|$B?h=iF*tWWQ_(6E^tUPHRvJ_qo>jQ$j z5VD)92Xa7~V+Rt9*9KzPCbc&-w7d$(0%U*7`ge1Ya~OqMRe<#ZWeh`Ezr)&=0l~C3 zLu4Nyt|hYM4$Kw4Hs#7d5<meVGZ)PoOUQWXu{QYsTbeSIkMjr68yH{M{7enxz||O) zVgTQ^n#1V97ZD{@4}oCicn4=7IDi$hKIj&WP08y0L+X5j5cze<GbL59U11M6c}qZk zCAgFVLT3V@(DLH2x9&hJ^cw6iK{{hEYYK?Q+4pH&-mdBU3q1XR=ar^KYM@)LCUX#! z0IkHS_25mw25hKl8op8h8%e_B>j|$Ypan2mi?}lbn`y=rR3C8eC#C(i=8QdI&3b_B z0E7)1h>6C{la}B!Q)FZCJ|HU`<X-?f(K39;1h%LM=ur==whv-Rz_EWUD}N7|N&qX~ z-2pf|c>Q1iyL(tL(5Q66!7=||uw^4)=%l0YZTzOs$*T-_|7jo>EF_--svsy-ygm4k z=6}k~J>WEP7bW~Et&YytomTtW4h~w1z)BmhTut4gM@+d@UWLtn^x_$PCboCi(3mam zbpQ%{qa?S3rt$(N1gDhh8Sr5G=X{l<h5bnj=QnzEfj%O=iI;S=&KW+0kQN%Z$TOtn z8txj^baT-;rJ_ye&(!PBZLM=ZFiMOu4cx<S`^k*x*IKFNM6Sl}6t19Dh^X~b3X^Ll zQ#D_Fo;w|mPq@;sA&RSSRFFNJoSysXsMTK8^UNxK+o1|QFRsLG70=T%`*@`%D^;qg z#!;*JjoQ@WhqayW6i~#sE%P70UZWR*c`}2V)~bt?>*xUHofGKAppj{tu7f|w{$$bg z>*&`v9@2a(r5dJHvGm{69A^9LVgEz>d$ee7Cl7^-f?tI1-b4wL7R?VLVP0A|9>+P% zAb_*Ib&RAw$R64oL5}l)W8-`Vhi0$s&qe$mf|;I+2gJVO=-=QlI!Bl=_y4#FM;ij_ zaC#DaaibqRjlz3Ow*Xm6KqM(aIkBXW0%{E3-*x`4oAv*zZyX8mzuA5N3j&;5e!&)c z_Yc5P@m)~u>fJolo4$2(dF^bE6pv^`GOING^w*d#j#=<3RIHxI@T}J}+c$DmoK;ee zXWjC%QZ$t%qJ~x33%HhxZDwk8-86^nqP`aR#*N(zU5RM4huNnubH9?mr+_7Zw+`UM zP}lZ=d7~Rxv3!w-naVw>dz;@Y<K9@tYhDx3(fg{))7l-p>PrO7?xb9Gm`HkFp!fd1 z6`OPEH;Ia9j|?p<^dmi|@OO#HyQEetW%a8tTWkLC6t={W3n7^hr^jy!Wb!}v6yHaN z=caiKxLe)xY^MvSlJuIw*()8IoZ<v10ad%IXFazow;5)F)7YM_cuk_>olGO<Y7m!< zecOLNd)dsE*L2L+#-iOfI{RH#{3hM_&{v!PLTxgJ&uh<NxC4Y>3#PMB!p{~ICwV6W ztuh5i0y#p9X&yX;blBPwCXytu1=|wX&&jRV+kkWYhK#!?1PYg7$^($YcoxAA%9;t{ z6R@RnJ3zvS!VqJhAT@J)TQ$MtI8VU65Go8c005h9V`1(;hxz~9X!;i~!GHLTPgBy< zGmxsXcrSUxB+21bkL3(cNz2N?=vbSzKz57(GW^=^{)F1KwRAN;1F8Xa6`B{S73a58 ztj@FA*1YC3yEe$hvqdxPc4G>6I^EMjV%no9(W7Q+nI^l`$OMSZSK~9~x%T6nVx|m@ z3x_1EoUT6uL%;(vNJSq=t=br?0&ea(K$ih%!!o+$H*2=|aRQ+CKEMLma8@kP{lb#} zcnv%NKLLaUPmy2dl8%qTM-kH*c-!he0vF)mDKhmXB`LfG@`&e#A$YMWTMEdmfp9Pi z2sS~FIZQlc^=1RPN?{4mujCtH6UWC$_N&GbYAfM<9|oV~D8~p|T6-;p4~xml#uP_n zpHnR5?0!x2_{Hk^&h|F;bHDln-<()Df#xX=I2iHyyPX<am*Tl4A0HVhR9~$!Gx;Rn zJ}Wbnzoy)4nqJ}lL{{>%XNyIh!-Kl=kG~DIZ?IZymX;pteBRd9Q~BAeT8CFV_I}-Q z=DmC_13He&j%=L!-7G3y=H;~w4UcbHR)?ska&cW0yj*_#c-+MtDlP+_Y%oE@|F<Ct z&x7q*Kkp+q_^J{%Y=BV7I%iyG#vaREt^Lvie)7jH47vR#e8T`RIBgg*A;^P$269*t zkb^c>5<uE72U5YRiOX8}(<QK?$QsCApK}IQ5r{Q5sy+A*|KI>slmf80!I9Ts{Xlm= z_wN9x<a_}iOWElX{K#OJJ!&SjF{>!i%2_kF-r{FH<C67cT_nSI%TF;mR`ym!e#+Js zgAI3^m#O1#o}0ufj2O=v&K`5*i+EJ;CRTa9xmG>LhkMrBIjP1a>!JC#hHu`A0ynu5 zj?LTUeTp`CWE3)3kypYQpFX^&@pna<TU(9v!-<LS$zf#Fw3krfo2;P&@1l-G#IIe6 z+LGLDF~j>IMz<vGq=px;*zSXi*wT;1raW(5Y@UAd&yJE6o2>Gm3urK{wydman1;@W zoJhB0BVAMZia>KP2_cESK%8N5bFz_R8wR|Hc|24f{aDwrx2?(9DA_v`b25LOYr_2! z?o<AUwFx6>s*%lXdutjY_da5*&HcVwLwokSon?$@?$fsHvguXeTJS9FqorY0<GmG^ z(;&Uv(&UjRm$l=I6V5#jq7mU`)HzGV#RXW31!M#GLBf<O1$1Y7hyvPVny|%h`1(^o zssiv?fN7)1pC0myitr0I!~`6)HinU^+&)ju^)ld|IoXk?*nr^K!nJI)>cyhwx(qwT zf;*eJ+tp^X&4Y(Ol=Amim7cbqze(gozGQA1;zT+z>{aGs+_eYHkO!9tlUt03)h6Nf zvi%tYc;DEN05<O&d*rcrnNJe(>}C}>#(w$UQt3wrFl~?MWa;Ev_=8ex06GbA&Q<i8 z6xNbk!iItA1GT`jPLZc4q?pE?eWf-iAl|MzhY&z>SqAPXqLfIIeN$6CiF%1U5#7h$ z(D)p$Ml(A;V-%9CE8hBQG)tW}{E@P~ENeru8_j<X%zpsfQr0+lm+b6Jyj{&t-gfZE z*dLI(Q^@w!M6Z2pM;91f1i%fZg^pzOFh*g>&HIm0v`0q)y<LY*Rbu<deA|HbJ(ELM z-;afmAKwBz0biVVA{wnJpax;U@cM}%$N74ai~~vxrW?j&@P7e83KRoq&()uZ0IapZ zpTST?<LNtEGtPLg+lj;xEqpl`YLM{)OjIJP1Nt0W3E{h$yFPhwww&pYb~~XC@54!b zFfw2o0=7S-K9Nud>#`(gLbhy+0R!EyntVEv_zZ$NIXW|oh8BbWax45@>u$6hP(#54 z-pELRMW-|h;1VpK3;3l~&p<5Hhhk;`c9QIkqKp|T3P`K&BYam6g3YiUjY{7YFUfrP zFXCj?;qU+rt|kk46i;tEMa&wWjfHy*M+g?K?rAB-{TybcfZlJBT0-&+1;nR3uSH)Q z9vIGQ#q0erJTI+l8tXfa^L2@IpX7U1!t+b@7z6Xu7oC2?i+%6ufaK3<z^18Tn^kyF zyCnQ#^UAc0)8<*V5eD{9QzpeL1M}%(>gtbzn6KG~bq2hHc3sD1x$|R~HYO5+WKBQJ z`HEjs7Pi@!)U>E8DAOJ4X^^^6et$%!C)hY9u`R#EAnfDdsZv7R(1;D3i}0=r(-1wN z=9v`d^(_{A)&*B#wK#H?+C^th1nL`EgSzcMip$h&^6#2*z@<KMx?e$eqj_|b>I++I znEj`0*H3m_@@0s#S%j$CmcQAFf7j2ek2-wpNo<FPLJt!?6Un>Z2ncvRKQX!rg#&Cx zr0IJyG6U}|xA<FkhZ63~+u5O*eNc$s&#u32mq4~1Qv(b`(+y|R=C{UfEEIQR64v(s zy1T#1u<c2@?PN{?<#13yq|aSrBY>ku1%FumpHGH@KwLC&tMQzlVquRX-K?bP{M4;L zJ$2nNdAVn<1M}z|Z*DTU?x1yF<T<I1PyV^e<xa14hqB=Zxuz$%1jBGyGZ8w=3BHzs zb<+u-+Rn0R_{hcgSKNAfS{9dUhydIa{{Hj+yKm<FjA@p)?`LQTVUfj5H*A7UD?jPF z-?EbZ>=AL@PVur6DF5;-@f~1>@)E~4Ym?VGBc>W$cM;Fq(f;q0X|K}vZL-csT@baB zmO9Av&(zKV2@Fp;MclJM82h+28P7FNPXx3{z5i8Ojpp(y3vlKdAY9SKY!oU0lhmDI zh7gw-ft=PT8cVKzL0jofKWC-Zqcc0u*51d+w^yKiTg5?_BM~#V0)L?;*AR{_X{_du zzcX}|3+uGr=J-vnP-bWA`Be?Js<n>z3$Yy6Vl##D7Y7;ueZ<vlMZIy_nL}%S*F>1m z9F>LUOi#0c3;It2awYt7?lrWn&}4f(AO5sA|NMh#P4?KTlN^JbLPV7uOTL8875n2h zmi$qjBkxBU^<uu}7w4VJv{8GzucILleyQWM?=h`?EJutXpQBE>xKE5a+5dq@g1$bZ z*F}-GGt9+F1KRdp$pXi|1VV0p`Bkm5GPw`-tn$3*=`?aF-~Q~w)51}$kNw-2>f>B- zrTZ7q-ub-I$yXcm#$&RXws)pYjH?Pg-RuMPEWTs~AG_u4<Mwm8e2cBsj2`9S=uV$t zDt<4fI1wb0Rd`ASB=YMHbBQW-0sJGRFCZa3#;g(NFe@Q3e2h7(*@<H}Zf?rxqhQmM ztk7r9IBA7ZwPwTnr1S*6M?c;@qM7nka7`FiESoNFjyN@V>6|Y9yo1(Z-y>TY(hzwI zPzu;`0gBC=9XH}fZd{C>m=<;7ot`-D`^F*4&*+W%1>VtlvJ9;GW244qZK}uhrChyD z&dsU3H4cyE$&>s~u&m+RWux~i3KPaZss;w#e^%;M%71OB_|yMj?>&Q>df#<nR6tRh z0@91pyV5%%y@~V=(tGa&h>C)ubm;=pd+&rI0@6Wx2@vTu2|a{Be3$O|xzB(8=RIG} zIrHv$XMf>CW|*w3^{o53ulp*`0Q-Iz)?=o;208O%scUoKLMODj++qJ#(&<T;rJro8 z{DL`_+9R}ZIe^b{=~k(nui{mbG9F%=WPjIB^GZIUpYKL)xusy~e&GmP0?fw!4|k`{ z(}<V%(^GANg2A<U1@l+$SRLQgc1M26YAhpZ3tMzP61ms(@S%QN`Zb2FN<$Q7Qc!KY z+w3*|e(ZM>mQJ{$TD#Pxh;z_nr5Xl~5<(p#&TZSbq;o1;w5eXT%-wITDR3mLyldAm z9sLl&Axx$?omK8Iw^eTV@9(fi_PGwS+p7UXQrY1GC-gE?wo_J|&TQo@f%a;3_#^m? z8`(BWlkQgWt<RsMYicPufN{Z%q8qxSGrieiEtWgT7n=~fE6yFlDLNMI3s>+Y6IZB| z@Ue726{aBc{OWKJQw5a&kmM$)s#~Ai)Vz!8`t>6`+=JH}Gk!StV1}GRMtvsbn7%Lw z_umdHl=2r&0^?BUnG5!|>n$I&R_Fd`<iQCrT{<3F?>FdfsF})MG#}Dkw=XThO4qXH zsqU`xIM@0nMQYo*IFQsYj$GMn+)@}Z#mN3hoZ7z8ZL{g8T$q38xfB9S*aEeHKYRSB z=tY=YWcLPxZRMVwoPxY3{4|bN(y$A1?^CqX3UmPH3$C9>$NF-$$G;(&KOd-)oa+<~ zjh(!Q(cWB@nI1$pRw>$8FNeM*5>_g89-UcEoeI$>GV>baxi?bRNUxzp$(5kU=UvIh zkR6zb>=O+2KP2HbZE)M4HTxtcsPYI%j_EH-6?n9_Es6oM7_em+uNKTwTX#{=rnqKB zydA>4bw*8PR|WS@S?`N)1;%a<y!t9^+rOIojs3mA3pFr%b|m9|S_t!AMM+j)Xo};R zGrPyx*Q^wHExBYyz*;dQbpzLo(M&1jys1U{2YMl%;SX_9rFzw=u|f0jSZ*K{qUG5g zr{s*ceS4ZwqzF7xG&UViNA}%gx?r?C<^+Vqc3K8X&jv&74#j01*<GQ<3-NGxW={(D zQ@sz6h-AMP*B;e#O#hImkM*WB3i$g>f5TDzzGE=D=u+jJUS2yEPQQsMs$Y(F_LAnF z?X=6<rzt3o)u%V`&QcpRGZ^a8Di$jloYEEg5#el9YOY~RG}5thG|T=#^P44^SAoLa z@qFQ*MtZoG8S&Z&5n_8>9Y{+bFevPZ@{ZrY%=NLvH|e%Z9)8`nty<pSx=hqdlu3w} zSZ+^|Npbo4mGlk9o@=v@#2_<R-|W~yJE=riRg<Zh=MQ^ZF<iOP^C}wIRtOrrh#0@a z*9j{%f$t}EIpe!J+dMY;K`mAOy!WT`JnE!`0tS^w4X7~Mq?cpn#b+LvN*N?}Io~u= zHlxyGQz(aRJHrLfYK#68i2?QCl9^e~mj~phD(%q=OF4_w=m0}ke-ZTl$k5}sfovGG zN)l4LHK?Dj*zZtQwwoZr(ed`h7Y-aF5-;JiwPtspP^As2S<0J-D*JGZQR3`Val-_( zY<%N*owvbslN+ttMBF@7-tE2^J!vkdxcI{s@qwLdaK@+Z|Fl<o!qSS0tO^u*bt9Vk znnL>I(?UmW!sMr<tpkJynzTIen&eT`#wvC%ZixaZ2L^=s5%^zXm`+u#qXN^ZlPoB8 z%FC}A=y1s0#J&5P_}1<)Rs`_%d2HS}j4FIhUj{RctZvLC>#M55RH|i-FH8%K;~%d5 zEFGNzhls$hCwIn@B!6GL(yWw@ZRGbs&!)`X0rh3gfpf-;pU0}z%;a4$R~f}3Iu}h5 zeTWkQnd2dUh{Y+BQ2WAbIO=xahorY*$pPpkQ>`<@ib9z?;BVnr!OQsauG6i44PP)d z#FE8no721HW9fRZgU<$Q;LjMTu#;jnlZrHb(+5s?GVWBxU(6qWOj0P2w-x08O;>xA zCz~!@;jd5O)RYs4>Clj~Pdp*_Jfu49<8QM>S%aG33Y2u?@Ha&nEquJs#(No}Czc-( zu)_6fm$+_UKl?b*QkJ0-cTeQj{}Rz}zLcY&lh{<}1|lHj!=Do0Vt&WmAJc+?>Hm8v z{!QkiInHigf-?X@kQfd?T}V1CWC7?8d;r*$UhxZuK{~Y7yYI5h6nuHm1=#u$^JD9m z82o-SexX2by&{o)1`n+Rrad5lu|qk@A%&!YhCGQ_7QK^k$y}8NMgpu)PfZ)p-7x@F z*#K5HjpFwk4g0%BHfJw)!SHQa-p&K$0wZS6pS_I?Ws1!r-T-zlU2J*Z?DW<mfL=&} z0uA1Z*ux?yGxa;0QRO{<eh(Cay;lWXE)1XvI{})K1j&j;z>emC3}Y>f@m?g*O7i}~ zc@4CsG$fdBeoX;wDSMGu|F6UCKgFXQb;)%TJHQP56PCwT7PF6nHIpH4{KDayPPs&Z zXE-JH98gcdlZZ`^OMR`YqWRN&_BM^ZZQZ|B@i%6A!vL6Vd$zGX3!zohv~|3-k~eMb zzKpnKj=cRWZyH<iM#w!Tf#=io+{LaFLsn%%4r@VqL9z;aj7q+*9mIbvwBAy=#jRFI zw7N0hZ<XZy7BenQ1n%owEWT7*&(t@-o@fhH0(xSQs4rQRicq(UqqOz&>sxuuc{qpt zZ-K~mV`f0TNBbLVad~VW&N9mSH!xay^mUyg2irS878fsqZl_L7ya+%@Qq#HVw_VJr zp-U}-b?>0Ly-2i$!^HAqF;k^n(whNI7Mn)Lna#Cr<2N5aOc;-P8%NAf;SwvNmTdO9 zD!@`OI|K<Z4#J@eqA8nUW|Xu=b)vdlU4aWGE~0UnB26pTUry6lx7?~8)3=;VJvTSo zYSAhu_@6JvX$Y2r9!Tb<T%E<TE&(f`%~j?Qi6j6ZwHpKrP|xDC*0L>I*eopowob&% zVkcrvOhCOBkUtE+FW+U@FPyZ~3EA_MU|>Omc=+q2Q?TkH*~gQVm!ZKoFqyw_o<UQ= zJIVlA<XC%p3Pz20bnyNs#Qh(U&nsZ_N8g-cq`ZK51uzDBm|67BnL5)>+tvzDmJZmm zMmceK(t;>&g+ze8HZ%z9>xF8Dv>zKh@GYxN@{pXFAHskT8Es`mpKVwU*$4Ez>}Axr zwBXwycu}L&F#@P$CP(Z|86nVE0rMtTM~<2=Oj467j&WV|atThibEmF5>(SruOa&T{ z0ra(FnkMO4dSS!NZP^%sc1@hGD@RJPH4sV~)i+cAe4D+`XkzK(Uf!FdbIpCLV-Qj5 z8u2O4nq3;y((WVQ9y4VzW-UykH({(?UMY41i_t9-vObp%y?-?=3xPmot=-@)RoObw zw9x72Rcq=DWwg{{J2g#l0sWD0*LUq$<-6%Cj5R4i?}E3R{-;p<&r8D=Q(HxEs2<lh zt@mU0$5fZGqN%b}{j{&2??m~@v|hs_0ZlDkEdlPlJbWdb*SCOzuSEPN693CbQUE!} z(+f+Hnm;*fQb{mXd23FEZ(u-fXD3WpPJl})haXAr+I3mqxgsYWJ4FEj7j?MV`h=EE zAx@e<D|@HHI2Y(a*B*BfLdw5K)YbZr@b6|h5vFZ3^X;(ur<N$7`YldiZZR2_B7%$X z<~y>~Ho!<=i;F}6{QP!$2W6$|6<ij=oD{UWyp`2~j5pn1+`gg8H)~1a(Jszns<%_q z?0&0ET~tD^qTRy1Np%jo<=}5W2F-jm3r!(v^M8iynQ-tQ-GZL}u&tgi*YveEabBPq z^bahEo|=oHrlWX4twOEq6yySSp@)BZ&zoOLO|Pl{>ZcsNCwpp3K<EbV(Oz;;)&z+7 zMNMW-b5k0jcke?Q0f~lN%tQUa+fEv+57HeM{pZH}8q3&)I6<@du>xlRogO`SG8OO7 zHd&VYb<_C;1wms|mV`<jEw@i#kGI;u>m_pXhI{$Jw&}PDOx?yZ{o+Md;c1O`DiVUP zN!fDK?RYH#1){-|pirgwc-Q=laj9Z<4i+FH>+2tfz?kp0jdM;oG<aG=nkt@@&mbRi zI+wN>GVSbb47E49ukTfCKqP+Q1X*u=bBD*a_+%*iT9v+}5Uc2J67UlX`7Qyv*I^>{ zmM%Vl0Jn+`wAH&*ekQ78Y|g2kYHRB!CC|y#eZ&;g@eK_MTL>z$s@-&puxp+drB!iv z+pvsKafr5i-!~AS6bYTMSqO{yqYtQ($C6zgZHIWHA@BF-2a?I@y^bQHV#{hvbh%lH z*sZ&Dg&lP5(#XkJ-7LZiLkO8JZXT|}zg@3I*3k`NVlyZ`GD~cluidS>#_K|WQ75AU zHo0uRmg%cai+*rr(GtSlV<G2Iyex6u?VCVu<qYdng!b&feG2vO$G>pMa6<HCpNs|N z%?=m+^Em!&gui!_C$s%Ahy_d9V9^E;EM%A&N^e~2lhM&ZBJ^A<srdVZcn|#IW@Z9& z@?uM5QQvqTDNAWdw8vO&JJP=qP%ve#?gJ-dKzl~Re5tgL?Q^S2m~*xomSG-Ydzkli zAg`e^b6C*ggGTwM3f4*tETec@k+^c3pI$-fTtiyXwr67w?#sLT*e>`I+QJ(&RNEA> zvJ6eA(<@{ja+k_{rc+6ykZzon&8TuJ!{z8l@jCOKaBVRIdZWdiQnGSIW-HLo+)Qoa zF}j9j^2hBTBoE|f=a4K%5d-~nIgQ@3ynQRKlA0gy$MJEmbkTe-c!wicZLTBCg)oj$ z-Ih7~kR$v1eoS|OS+XO5@$FK`^1Kd0%1oTNbUV8N!PloY*EV;V@za}>D87E{{kw=V zOdkZhR8$m4we?+l2A>c=kqx9Z_zP#o!tLE?PUD`07H=Ru`^n^1$<A|6ZPRi(?7{Ec zq8WL_X*1ijpyFsqUzuwShvVV<xGVF1DZ{UgGk0fO_*h@Q=GH!Wf%<G7QuFu0{Jyf8 za?6o5G%%RW{T#7<-hEIct!z9`wfi|@3C?g_7?Z*Lan3K!si<mU$#H@vimvjgFm(to z%s^$mu%|zo;!$$#v9?WLOBND~2oeV;(b1l=+BK6u6#SZRCg&A5>KS>*V9;L{A$zq5 zo0W8t4QL0%n+Y<yN%ulK9jymgSJP|FEGO0boV(S#-Sedf<BmSPj$d@D$QpA9c;>>} z5+LKk+l;yodSIA5>To<yGu+`Km{gSs%&LN1E1x<??Z-TAEL2KxDvV!`pR2p4Ds$-V zRM?zU)a;)SU_CsnE=ZQ3D$J6Y@J!2m9qPXXv4^fK_<soG^)GWw7PESLpCdOKM=wU~ z2iL=gFH57Y7vtdE)Rcklc>LQM{+ACdQ9$I9U*@Yr67ePp(RBkC!A>mCtd{2cF9QbY zi^~VwUCietN2V5<J_Z|Sc;a!PXCxZ6x=(Xm9aZnCsm*6Y!G2Xi_Ks)Khs*93EI69R z@T=QF^)`pf3HUZSc$R6fP!C`e+{g|Q+3WO@E^i8VMa2j^F$j%QG$Q2;VtzhnF|5!U zhm@9o43TVC8<OroVGRA;DvlegC5P;{Y9#ZV5Fa)1LGJESM4=+OM4!9uIP=Q->>dZv zsInH8=av^HS%}|_s?CTE3I}55776^E_gL$H!ws%MMLFCTuf-TTJex8z{5O^swya<k zMRm*NTY(O*Z5=nFjONPv9zG(hEWc&PM5?TXUEXf`m(K1_@0t+%0^Emg?>s;(W@B0^ zP$Ok9lz<1i6n3~a3uWg44>mLb?I<DRsgr~XMss}Y&&~b8h$RDN=<c&nphbaL0(#v~ z49C9(mFVX{vze9F`Aq_yf<5WHRHq%g(1ycK-7eZKy-{Xcf7_)FH}Gf?b~*g$cf)>_ z1CR_&)}Ss~zs{YX2+L!A+1=sLP>ay7;6oBLJ2ue06R{FBZHkEv9{w}*u7Gr|01{o4 zH1LfsfXeOwdt`}#|H9#oy#QFnhOB1r)e-ERPxkN&(0Z|(27m^_n!*19sQ+b+{4RVZ zW8iOJ!21a@vcP!vyF73~W1*N=G6%9p6~^GPfGg|7%0{s7%_|uMz}xle0gA8CY?G&; zp3#oCe@gmaAn+TE=(xgxJq6|aGvIsAV#`Qon}6f86v0N6(!#)uRo$Fa1Nmzcvj~1p zIUb5n`p?By);!(3PS~MmO@<<d1OX1ry?(U#hC2G6VsP)q1#`lH(@WAtT(T@SCDlP! zQAhWqKtXH9R_UVTwh5wm<|?bVq&>nfbHSexljzK-9$#hftW~4dpoWM*R#rGOPkmr! z)AA1;{wTA?xuQue_4lw6n({P4mawP~?FP~z*PTu1zMV}jNxC~n`-iUQn|+JI5xe81 zB}8>yOXQ>15F1y?aX1Qwd4ml5W-*44ZHyml21$Ae3VtDC!N|G3L(sP5*RhomLG2{1 zT4dNGg?llWwBXI`f4{^3MKpE57RPtFNAgixwjI;g+=L7Ad9lx<zJAo;A7gU)R=ri% z`hbdyJ(*+`^ug1%Fe)J;RU)m_UZ1C|<Wp7fvOm@m%C>}3KG<I|N!--JDV3U!rch1; zwz)=&g<~*e@wf>S(BD{yObg)b@v40K@TG}rp(jZs?&FALr&|)*syOL4j^AUgV8epV z;8aoXS!5>C-1zmLE1sPnrH-E>uUX`^nzOaxAv{e@2^FU!$n4{1C2WRlKL?~5qxdOU z^bQomrI4f0A_+tUV*gY1Q-w$2P@0SQul?O?VJttjpT0WPN10=)j`){i<JLBoEn_6J zTw9`Py%&v@qXWdK^;w)_CfJIbn&^w$k(Ca~%2mi09knk1UKsvI4Drw6-rWQ^>&W95 z%bnLiw^LpqcNep^&r3S$;u=v4eF*M7i9J@cLtV{z$$M$IwS9(auS~gP-mBR;*{p=^ zim@1LK`p%yXps}+<>bT^d+?M-;$5*r8-~2Y;`6UqCK4ku6cm%Z&lqH37-qLoyi$kC zaBq@T^;-B4N^||&_rvIG2EzA`Ybx5J6Mxo6g}pHa3TgXsqd)d|ety_~a{*LE6ul_v z;$`LXpsL5=QBagh*<p~Go13JRu%7;uPkwxB0<{riP#I81ms-tDS_j-7;v4Ad+gUxA zqm!ei59vlqitG(R+Gn~upd(K0##$_7U0i?+KG!-y`JwRb)<;}l*Y5(nZc{7o-#S+B z0Wc;HLI4=20DE{=H3-l9s3M}(Un&^6oSTr{rx^vm%8o639b6htQy|3%%gm#f)=;~a z5WMLA)QNzPpa&cpWQlS|Gd_m$^72QdaXeysA`sH4&7quT=N))@B6l_QJBi&qw7mVy z5|rBX$h$s^x3I8Gwb5LXw9KUDLOtQIM!JOjtfn~kv?9Biy|VgG$MCFo{YXqBOH%M% zMalP#8j7hjDGQ|-!`HRp%yQcF<`ix`hj9l}6H`64%q4inatuhiSi%oH3guC9xL&w4 zuVr4Gq#upWde$d@yAVnq3|tVu`;u#WSAYCfmw^s2$D;8&#l>27a@N2Eun$kh!n$}x z53fcVt$WY#h#slTQp`(QD}O~sJ<y1kKdYZ~aI`DU*St*=QFzm|tVH_ydWY3Br;Rf6 z^}B1T^ei_9_26;3{m!_t+i@Wm=xdk}khtHzXglz;8*90-@H&Wqv7{cL=ETu-yeRd1 z^may^NRv&Kd_(0X_gqmi?Z2$t27sJ<D|p$C#j6djTCtxTk_zGl79{ivg2&RTg_6ZH z)sNk4Z?Vi(Qgx~W)h1MN^6-_h=&W$8-_-cLmfiVz<mZCvQAJ%?evhWG>?_r~oM^$< z>p@gg=+k*X@)>s~iHd!MlmWEi&u=(2F}r0rSpigYp(1F0A~z?u(GfoV>OnHX_hDJI zNc$?%eC6*t>3ApG-@Q_V;e-)1eqUKUw_M3=I%3@hIfMyo1PcUSb($*e%}72g)AQ22 zZY7dw2~*ePLOXdI2hYtN;EZ%SwwPWt4SJ1vrU!8EYO)5tWj+C@;sW{N@VL>nsuV3G zIcn=FxZ}Vu!(!ZP&0CB6Ce-yL{rfR9NmYwkoJJG(3Qv^p0A2%xMAs*5L#CSh?_Haf zM+340Az(NCka3&jgEVDxL0`a@>rVzqAfk=eNB+~UdwrEt@$@#=4x1Vf!M6;jt9jm^ zuO$~7<NW1evNQEZdL(5t|Imz0N@L_?+hT$F)FxHTBPE3dTh7(eJ1;&-`-x(jI=0T1 z4}G{neF)y-6sURfI%`E+i4ltXBu{(#l`$_bSA{^<K%woMJ%#3H^}6;B_V(7pJ#~Wj zj8ij`t=&~wjzU){>9V9lsd32hw4X@q!CGPe>@U87!DMKc%RRK9qGrlY)yJj8X8%)f z0>=P*_lWQpu8SWP?%93!AnxvWGjB*zxU-9KE_o+%zXj)mzq|bA)fFzp{0;Kj&wX6S zu)a^Z+5K5HYm3?Ku}fnMl94rAqwWiC0V*R53zQ&ezD$CtF>B9Z;>M~{N82@NhC%-G zXRu?Q(t?=W(2QxZd5cGIc~htu0auRoiiUuU1lI*K(@p&edv%iOFzJtE^TZ)`Q`U{T z+xCERfGc)uM%)Y>th^*Z{ZSi+)cGPbli}L+Ozh<bLzeM#mko^*iZjC_4y*&co3d`A zEF)!@^$w}jbf`<GKigipOD|ozQ{#mDZRs_$pLMKX`c!x2&pC_$ZPfxXxLTKeJa9Z# zEI)c|y)`@=IFCVs+B+Nd5jaS((zl*&)F0X>bO-DZ<ld%&`220ASd0NZiyIViy`l+b zfkad;HedwnM3mrrBd`w-yiH9(@Zs;%i+Z?qrB|D@;>z;zMa1LPcxyOw(8Zu2J5bXi zt?9Yl>z%;-sQzxa0Z#1vjP=o$koT+@{4w&fpxFqKK?j>(G|{5yA^CbXbVov%i(9GJ zXF_(tJvR6sQAS0E?20UScob3$BDs6;p+ykMuInG>Zq#Zim{=UYwzoVoJS8<$uVYLX z<yJ9=rdE@`7fp`diT|o!QIg~UvqPiLhNd@o#{ofzTQ@eG@kHG8AS6NeYmkcErEBoI z11ddqf)~A(w1xTRO<zs7R|gGm?WMw5o>RcNNWeif*T@;zq|_PcsJ>>AYz7T6bcD42 zb7_Cyl>eSE|KpGO=hgH3KQm$e+g<qcb0&7JAI_KaDRq*hb<a-NJr;L0H&>En|1hw& z%Ut%Qf30kXC89K{BdU}<nL5`mfs<Sy?uiVNE<yg`5E(_13fI>-Is7lL1#XGs+A<_s z7%#YsB)~Cmw8yNZ-00%_OAiNVOAM8j@XYB|4Gi#%RdGp!mxj<%V9D};ey_%`M<LB) z+N+Xh%8^8~(glX}41zZn{S{*(JrHak;M<<<*$)^b{EgP~M@2qq(R-<s9`!*<{B4#m zWh^%h@3dV$R&%@$R&>8+ck+|vC&vlV@fvCeiv(4<M8hE1eyFN!<4bCf##3GvsD<;f zoVga?vRE@~em#Z#v^(|6ywBq4EbG56yZ;hml_%h>hRg5V9VVCI729FWi}>Ie7-QY( zT>7<`5|WSmGE-knK0n)mC8|E#%wYZatu1lY)19#9s&s1l+l4pbhX@NKaNZ!>i9d+4 zvd?z?Hl6yT;-JT`DLEPMYHE;#N?cfA5n8RiowZ?eeF$aYg&mZ78azRHraocFJygJS z{$;nGx7u~Hr6}&e2o7@>SAv{QPn7w?zdLKhX!!ZsvMfgcoYB~q(!||;WLe*7E0Mlw zhiv~)NTNqGc`<Ea-szE~<sG{6;^`KebQ5jn(jej165;tqURbIJUc`t8Yw!4x_FIPX z?@=GF*q96{N_J&X+)I}3SJ@jS;*iCPg-OS`=Rc%ImbfQ6=t#dfRkA+JSH$&J&A&fc zpi0XZ0!Y=~bh(FA;NkmhME29T6$$OoHAsUdQj2}&C2Zq|s7f(pe%-_j2^~~V3}dnh z;==p;6y-~Au$<O}!VoNSqK}u~4Xn}K&}MY4S|I6H`qoA@DV2h<#K1&8aHokN?ON=R zHabt25w%n{);B3?8rck<I?GEh^5@?M##p8*3$TOC&W)m`Z9E23`?JdPVgj1ag*))f zE>(-+SV5r(>7@H(-(8aI^j&oEt_x3G<Fk0$bfz4aqbZ>1BN*H^Ome0BLpCJ^Y9_fX z+s=q|XjwczGsK82QE2Tz;nlUaga+G-19DH5L!H0pM?Ww^ZC$c6qrDM>)Fo%rB))!c zZIoUUM*P^{5f~vKPkwPU>CZq3k`wZ|hg*F8-s}GHnrV31m`xDP#_g|72Jqd4S+q(m zNfTN(kJuD@D%-9!<XMZDaHZ|RNiP_A8S@2=Uz_~nwOGk$7*jXB?$)5zxdt+9pGzuc z<GgMmBcR>u)A)!E<VKK=u3x7$xq>A<F)go%Qm2i(TG4~|38iJ%b651~j%*mL&d7r5 z46;+)b&eiq6Mc=ctkKkP4YTb#W2noXhap|hCes`~IH6+gTQ`Q99)#6Sr(X=_Z)|*g zX#O=1=hj-Al&T$_a3}04pi`nKz`l{het&7CTC`)SggkAe1ai<q)S2Bo+F$#<A+@bQ zTG&ig>K;$LxcR-F-ECtkGCUxJ)oqsF4on`ml#|C?V!-Ig#F%<YO|@4>S2rTnG@3!* zDR2~hRk$@Yt6EB%;iTheOOZ3lV)rRd&VZt{n(ON$=KO&AcE-OWKvQ7i|IHVi+ThL& zbfDKjE)vH->pFXzDEoK{)qGs}yoJg~J&3C@X`39WiznPNrevggcV`P+P4a^W11FiU zVz(k=Ja*mJPv7p&^kDA~N$H=swvw>T2pB(EZ9)}Z&A1``$5Bb^880BwossxxIvb3U zs*zh05tH5k!ML0Ev_y^wQqhRje$jAQ>-1a9KXrRM9{kwjz0oh63`SCjPc9AD1BgJX zRZDOuyU9a^ZvU|9*`x&u#sGe*3$qF{j}H}}%@b+kig9S?-n6VGCuWG-Z#jIqNY>OQ zJGaxwsfuH-i9M+Ei_7+_0`YYqm(TaJ)*=#7Jc8%6Z=7`Opa@R-!5v0grF=7mNc=$S z{(@k1q}}5*IyNolh@o-4HSf8o-8Oq&dSkLKW4ZV*#R&<GQKbYpfzD3O){aY5*UR%6 z18=Z+5Jr=KDUVWNI>e<R4SR8Vy5$h$(rls#wt1*-C*{K8o=@THM;Md;qKp$@?TLcJ z5t*ESO3s27mQ4BxiOF2J$~b`f*;z<Yx{Z&`Uzw^u|An(YbroA*<AQ(MtDRfo(YBO9 z96{6PAVDFr9Pf}Y64&v~M|1)qN>||t%k!2plKaUjckwc0`4KJFEjX)r?+TvPhrL>F z&x1v$lLpWy$TcAd^IFQ?Z7cFWf+H3V7ntx>JAlI>+!K*p!9TVB*@b;ano-1Lj_`fN z-r~H38Q&t5%C&H1kve@xO3&ys+x>`;WJ7ji-q@Jr*RRu6ZCz*|lEF*1q84tpG{1;b zdYcxDQ_7`^#^DOKY;Xfbpjx1=5Dk8>)@3a^(w^5<EVa!sVpBnN5IpTomA#GW<M8!m zk4?tGtWEUI)Px2{)F`4{Ql8q(O$4^LFHlHk{lbJi*(5mV5Nh!{Rqy<rstb)%kP}r_ z$g%q`9Dc!LikVYh-x1CqBrDM%8%sHb>-DSCGNGYwu9ib{p;sTyT&&K%_b53)%MEvJ zpOIM%8GEpmTuYVi9$48O>|uU(8;47#J5%$IN5eq>vQP#fe(GwDbt@#+BtK+4n1;wW z>|@u!lnK#iY(KKn^DvzzJzq$X(Y?~dcfUPKW2#EF1$bFksWVs-pvV3^>tQ3149%6{ z!Di7s-;q7muJ7AZV)5J~3%mG@yT4xT<HJWxeTOK;U>wl18k0wDEre3GYZ)rIv(|a4 zf!efd6c>hlbe`Yi72cC;KkOsdF3tD)9z}8Y?h`$Q=Qw}{C1@4rdU&KIo9pnt`2e4$ zsyIs)OSVAp7BbZEcW1dxgC<#~m0hz`_6PXqf!lD4^7*vPrTD@a$DgG`nz4n<6iqb~ z!-Vp@Ek5^j*S5QZO-c(N1<DMf+81W67WhOzjG-8o*}SDj@X15wi_4Dx@GZ+8S^J>K zI*`YZHDvS{Oi}w7x7-SP%I+z+(nT6nP^jQlLm$!tI)*fD4KQr($DHmj#vV!^&O?hH zv>bcqJ#*sd*h!{yCm~M~)YH^_4Gnz9d3b(K4TEnxS--nS3flU946*Qllw*1^&XDFf zNbv0gZIf|*$5N?J*EVM792z^8k6;aSZyP{9gO3BH+Ut!A+MZ16?hGfY=y5m|eQKK& zyJ1!<IZ^RLalbC-Kg6}LL+DzO$7Lxzvu>iDvED^A0<%OW9+7;H^RU@f|FL}HVn!l2 z2S$TovAdTkIKAZEb7Pw)$ExJ+ZZ-R$?8olfa8m^((*Y9VYfn~(1G%cwWM7mpQK6Rj zebKb@S!xi}jYY}r{UGlVMI)3dPqZbVD50O!;v`p@()&?Ip%`Ee%#Tx$N8;y@1ArrY zvn-tx-gOy)zCl`0RkjQoB4bdtb=}Y9>URo;*{-jp&_3hfqA=lURHFG@lP)VnqEL0V zmr9ocXXp3saq??^Xn{0hT{IAqiC6OE2$Z~jN`dE6RP`C$Hj9eHbR#q2-+KosDe0=< z@lzjMTpp-HibsVl&A%%|S2)uw;KxAK9pfFiS2G$>Jbq(Ye+z9}NX&W8;nqgwP=?iI z_-=c}+?*wmj`f~EJvZ?Nl!C(R-9|s0XjZ|g>HbWAT<+12sc*J7G}3=0v1B0mTt5#u zx}wSgx1u86#H_QA&}qkAPDP=o{5UZBNaa?B0p#9r)*MnaLmyipz~f=WN1^%D3@TI1 z$GoPPEP7khQ2lu{8906R=;c1+1}5WK@0@;G<?wlDi-5Y~`{f4T8kx1dwsx}u$HpSt zN{L&J%FFl27*iuSIJwvH*`u<2=yX<ZHZRXx9GP{R+gq%qtUD9jLcEW~O->zK@x-xt zP5y&1&$1;FmXa)UY#OxTZmS-ew|qyXVZgCmfpWYU*-|~Des-8XpSJ!MG`$h4Tfhg3 zx)`hceRIlB8uW#Pg{JHE1;=N!$B6V<&3Pttf%(=Xa3+tgrj$lPm(;y4wtf$iUNXIw zh8xF+=RD{tX2!kyHGI-Xo~Vc4!}9~nJx&9IYrxq(x2uJ5NmZDl?uO4!?4k88`?WGU z34>=F1g7Js&YnSIp4B0!k`jlo@&2K#gnskynbmpZ1Fgz9eAJ?@D_$z}@UO`nPeLml z>7awv?gBKhz6)LOh~D)I?2_8R(X<v{hq??pt4DMR32TQYy5?~X2H0A{BZV$#lfC1w z2VU`%@s_aj{&bP0G!WhQnc@Ds{r{==|Lv&!KjEm<f*R6lr7dE7NDOSr)6C8oY4xmL zB;F3*e=E)No!!n)71ukH<@L2oMh{b^+C^ou5T0F<ITiZ*NKx-OS5&|c-M)wg<NGZ% z@zigXxVQx4r!#)x2v%)aK`n>+s%a_=dFL4En+)W;XU#iO4?YlS>_|U#jmCa*It%1Q zD&k2+2uS&+1qY5Oau}GTo5-PLF##>!nuyAsMseDc!lG<OVl^vU^1j4ZCE$CN53hb; z(R7KZoQ?Qv2O?v><+&ASa~2KHpNIm;w4{PAj>=x$!HRqupR=&E$_r+k_Lt}KiBWwR z&-#9u)7mdVoY`KLIi3oz%*FL@16IFgnM(rvyjXoZL!FpwPdViJfkr4Od}bwkU<|$9 zl^N?CqJyr1Fy)QN;oXPrg5ykMS`v7_YR{xl*MV%f4Zd@Qto9605dX}ak@)di0!3j^ zQaXTixmqN<h4x8bzyADsw|C#_5y4|A+5uZJcVfQ)(K}&R*-J}o3$q=^SFrMQ&Gxj- zMSr7vg*4GR=5FJaCN$H9bx%yVk{fkNcH|p9+T!-2LjTdX{eSP()|bEB3bWR~6hD{j ztb^+E%CI+p>;o?X%E~yLWnirDhTTiK<^zcL^3z34O2y9_M{}x*3raqc5kDUfFEX;C z0~HO!2QLeRW`+&DT4Zn)Xeb<R>c&3Kxk0LYb8>IS@#<S>R5;9|O=i9k`H1H-t+r$l zh37X-S7X|Gi+ApB!Q0-+ZwX3M(;jQ_=0ba0H<0)e7gc{TaJe$t6U+zb$gJu6u7(yg z*=F{La@Yi!7wJoM)lpRNjPS~2a6{jk(^8(s=<y<_qJ#~HJckW=qQ>}SH}|W~het9S zqnM%zXjm4Ef^hQg^Qb@^S+WM=B=kMUFIhDnNJCW7dS~m_LqM0d{IzWpv+~d_!@Du1 zH4SI#=ut`3%=K-D^f%G!bXEnvx+jw7Er)`+GIV}1lBE)4Hb2~WJ2gHXZ3=v>(MPmz zr9?22XM6~DCnMBPyPQ@klz?fFZ!dEN=DgBj9jUa~XwObMJB9i?Dm=gKEM*Qo&v)nP zJ0rf0^JQ;iYnd_lst*Or*x1tYZldN75aoFo%kANESD4hKOQ*W0`D<AV%|;Ll&w4*d zdiOv2^?$~Axi^lt(B2_o*cawLG7I~|JXCzW-D`Vfm6C}Ba#~l%^VFQoNhP`IE|VSW z3j#Bbf`_Fwa<lv(3MZ%6CEj&?-sp$&OBiK<P6$FuLpZ01yt4T<RW08W<Q#ELStS4r zcxStEOQ*kuvpMvWJIz*7QIh7_EO*ny(idj!8_jaw_j9?6XH95s8e313g}`NuFSUVw zBZ7Xu<$}A_vt}(o1h>GQpEovsw-Ir)a9aDU*?gs;mV}PiJbYOB#?DOqn3jO5mNuO} z>CinZ5&`ectwBhAhSF}jI~mi*vYc~slJur^xzcLFTZ}p~gP`&LWh^Mv0m08?M(zJ0 zJwLwrj&#MhYpYN*CU%AKd)!a^w{?utR(<_>v-(?;{}9-pGDHIq&pMW%reUs&4F)#? zTq}CtE`cn?pRRB}!bE!5I@QjFWO9=Za&dT*#}B69I$Ovwz#3Y!1~(;#3^;wr%JPW0 z2IX{QzFpfc3Y$C2a+pJkdxX8>^Vj?~W9stGOy3ST7-l27;~8KTQ?4q8bu%VVX{E?g z2Ai(S+<j3*A795&c09LW6Zj}&l9K0~{`6JE(a3|MZ%9IYHz5sprHYL*lXFu?_)#N< zQsC&c5Jhw|mXzn_iWl_ZZ}HdHkeAXSK^PSL*~)%w8vqL$Ft6+-^)dN;i*^lh1Ql#z z*J~FB$UowIvA3frQVN(0FOK{>+x-E=IWZqhcSwbFNv||`Jsv+z8B`IV9g!KlLC?nB zaEKp8Jp6sI)QlzVBI-ipAbv2kS4pSD#$0GWbfv02qym!&m~=tV3X!WG%D!s?lf8`a z_xB8kA-XGjJEoZGt8<2J5H+?bV|eqK`}(H3Zt-+Jv|z@Sg^ue10c)DJIe`a(jj^&G zHG+1p!2EaBds?N0!bh9~{yTGrB?xg5yvf7R!@RTIGd(|WXLt9J@hunD-r4gjoz*&_ zngLbAyR9SYQt!T&-QDkVTtxVrPr&@^gj$-CY%QPa%|xzu*T+6m*``LYGrMMO9<d?e zC;_(i#6aj~Lkdo9dB2`Y(h7@)LVOcNJjL5v^r6orbQ{lNL;WaCP|v!{Fe5n&lHBgd z5W<iB)1=z≷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Ü)9Q6 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 literal 0 HcmV?d00001 diff --git a/testopia/dojo/DOJO_INSTALL_HELP b/testopia/dojo/DOJO_INSTALL_HELP new file mode 100644 index 0000000..ffa12ea --- /dev/null +++ b/testopia/dojo/DOJO_INSTALL_HELP @@ -0,0 +1,12 @@ +This is where the Dojo libraries go. +You can get Dojo from http://dojotoolkit.org/ + +You can either intall one of the releases (such as the +kitchen-sink or widget release) or you can check it out from Subversion. + +$> cd /path/to/bugzilla/testopia +$> svn co http://svn.dojotoolkit.org/dojo/trunk/ dojo/ + +When you are done installing you should see the src folder and +the dojo.js file in this directory. Make sure they are readable +by the we server. diff --git a/testopia/environment.dtd b/testopia/environment.dtd new file mode 100644 index 0000000..df3563e --- /dev/null +++ b/testopia/environment.dtd @@ -0,0 +1,15 @@ +<!ELEMENT environment (category+)> +<!ATTLIST environment + name CDATA #REQUIRED> + +<!ELEMENT category (element+)> +<!ATTLIST category + name CDATA #REQUIRED> + +<!ELEMENT element (property|element)*> +<!ATTLIST element + name CDATA #REQUIRED> + +<!ELEMENT property #PCDATA> +<!ATTLIST property + name CDATA #REQUIRED> diff --git a/testopia/img/1x1.gif b/testopia/img/1x1.gif new file mode 100644 index 0000000000000000000000000000000000000000..d62ee0518e1c30a40b97cf17db8c67429ee79544 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blmSQK*5Dp-y;YjHK@+C`LBT9nv z(@M${i&7cN%ggmL^RkPR6AM!H@{7`Ezq647D&qBYaSY*@nf&Abe|u&Ijz3KQTF<UF Q0ZK4<y85}Sb4q9e0Bc|&1^@s6 literal 0 HcmV?d00001 diff --git a/testopia/img/BLOCKED.gif b/testopia/img/BLOCKED.gif new file mode 100644 index 0000000000000000000000000000000000000000..b8155a97d42f3b85f96800cbf65ca5ab30f7ec7e GIT binary patch literal 538 zcmZ?wbhEHb6lV};xXQr5@Sow|kt6>Z7`_)4{_yntZ*2Vk|NrmHmi<sv{1+Ylzq9lE zvu8i~`M*0j{MfSP`;8kvs;YiuXa5Wi{$*wLlY`^??AiY$C4XpYeqX)%`~CYrl9GP5 zw0!^g@&Eq)e-#w|d3k-GHtnCF;QzF=|7Xtpb9DS~WAks@w*SkP{paBLUtIkE?%n^@ z)&FPC{JU=5KW*(l?d|`sT?26g1A$tAt|JH(f3mQO09EOLRD%4(!1mvvq2NTJgNw(L zV+SRzI%gbwaMUU?a(zhGPm#1u3&IkXX!SGc25?QOEK(4hkjbKbJ5gC!gDH|noLNX( zT{c;{y+c`6U0O)MmqC=5lS^H9`iz;n>Rg<>><rv2teo09Y%5l-V$;#)WM$!I=irc6 z(q6q&TS<P4gcOe$s}bkU)tpAGVmyMvA|i)WkF8QY#ls^k&cvjlD0X?Jn3#qJlQ_ri z+Zqp6JbC&2<()Td?{15qJFlqt`PUN--UAvHpAF78w+e_z@XQcB)7)LD7o+3+AmLz( z03Y`m?FWaPJ0chyE@%ZbwVa%+;Vbsx!NMj1J}H463Lh6PJ3Cw6!=>ke`w3=qUOlx7 zQxq3w1WFot_!KN$_<REU*_JwmDwF3eoXm11oTUv1u1*P8l_}U2I*pBqcb!m2!Gg1s H6&S1m=*`w) literal 0 HcmV?d00001 diff --git a/testopia/img/BLOCKED_gray.gif b/testopia/img/BLOCKED_gray.gif new file mode 100644 index 0000000000000000000000000000000000000000..151d6069562e295b9c132a6a551a461c882868e5 GIT binary patch literal 353 zcmZ?wbhEHb6lV};IKsd%b!y+4GiP@1-u9n?;s5{t_wL<Wx^(Hfb?e^0f4^kOyldC4 z&73*&=+T4EpFiKSW!;)JOTK*hvUl&^?c28<J$m%sJ&-IAFyID?KUr8s7?>G!KuSP% zGO*rzpwKtr5Qm19=!F-39YU@?3AfLz+48=@XJV&QV1@)YE2}|6g`*#1(!~lNKbD?l z9D;=gOHORK@#HD1+$7JE6M6jVliClJdn{pY*;D7waX^^Qkh8(0rp=PCnTv^=o1KrT zt%ixOlv|LWft!tueNr_$J6kV5=d51N`BlxF+zidjdskKV_O4&Hm3uSG&h;~Q?%vtg zb6|7x*7&t+cCX>)WaZ#rvGUk)c3;L7b8g?c+gohc!+H0~oMyo&W?rG@r+3R<D)BO{ hdH0;x){e1s&0kJ-u18-x1eb?2u`@A!<6va41^}G6kDCAh literal 0 HcmV?d00001 diff --git a/testopia/img/BLOCKED_small.gif b/testopia/img/BLOCKED_small.gif new file mode 100644 index 0000000000000000000000000000000000000000..81a8ac6e8de66e3627e0d9a003f78c238188ba65 GIT binary patch literal 350 zcmZ?wbhEHb<YVAtxXQr5@E-^neq6u)W7)F*AtC>*tp04-@=s3g|Ns9#tE<0#`}Rvf z;Mb8O|JSVf=k5I~FYixR*Z;J%@3(LNH#Yu1bLM|3sbB5w|IeKH{^G?SN5_Afn!n1* z{tF8Jt*QBc=gxniR9f2q;$omZGy;l0Sy)AYX6t~=2l<JCt=fUX!7;@|if2)Phlz>a z1@FTP60{Wj`>!dthKNo(cf~=?+)8Yb+9$^y_vd%G8Agb3yf<ICK_Z7qMzk_dRECk0 zld-FrqpO{{L8hmbk(rB|U8+Zlo!f<9ignTAMN<4uLVT=zYu2vzW)R|+T+1i9d;^07 OlZdpm2-5~f25SHm8fwx2 literal 0 HcmV?d00001 diff --git a/testopia/img/FAILED.gif b/testopia/img/FAILED.gif new file mode 100755 index 0000000000000000000000000000000000000000..99ed30c1b4f00a56074f5e35528053d335745291 GIT binary patch literal 794 zcmZ?wbhEHb6lV};c*elM@SowwmMtGxSUzNDe|L2J|Ns9FP0f#!Cx5?x|GT8*r{Lfp zRaO7bocXk9(RY6S4=E|%KYsjWW%a4C@k3G3cMgspo}M4)&;NJy=zDqjzkz|@jg8;0 zUHkpnv!5+3-*4RbURd})E$#ozng1CW{zXUs$j%0`|9N}=H#YvQr1a0x@vorZe-4g+ zYuEl=w(LV><lj%9K6G{clal&hT>K*`>HF;2f9mS~-@W^9+qVB!R{yVE`_tb3ecH62 zKvyX$eqXi>X!!TltAU;vx<K(K3#$mw`8pskfZ~LK{eJ^PQ?mdgw?apUETcekUyFmh zyp^KvG({^Tqn`dIj+xdv;yh+cdBk<BjjTEP1-MnL&3P=BZnNYuw^lKgX_k?<F*P~D zxR_@-qu3Es8}42P6BcDt1ASJpg*q$6SoIA|m05ThWJINuRj#wLvI|)YvA?;eqAVpU zW2d2^#`XD)LCk?4;SP<RwGL@3Itmvxu{1ewc&#W<YU2_T)Cfpek;rtgUf3j~V`Gvl z3$v2Tnur+*2aYo_3ms9|>D1CFrx`j;<igwetc<GJ%l6C+R&8b1m(LK%3T9@V%Qs=4 z&W8hy%?nu4VnQ!YN?>j>3|&+3;h;M|yWyX|(hUcn+Ory#%Y5NDpxD$UC-=NnWajj{ zEpl2P7;ju$+|I~fXSyWf&cwOw%)c`@nhcm*8F{(o1Pl(&G;U<)c3GtG(0f9=q!MSy zi3yGE+1EumTrL<a{-VGyp}fT4;I8eRB7#aaA1<t%)6aEKT$}&g;r6$Wex@Dai)(D@ L59?=QWUvMR|4{*o literal 0 HcmV?d00001 diff --git a/testopia/img/FAILED_gray.gif b/testopia/img/FAILED_gray.gif new file mode 100755 index 0000000000000000000000000000000000000000..b53af0f16ab6e8d2628152fb34c4a441d4fa4559 GIT binary patch literal 390 zcmZ?wbhEHb6lV};IKsft-QB%+@7^t2*8OK-c>n(WwQJXwESY!o=+QN6mOOv{eCEuV z_wHRgbLPy_rAv43-uC6om&1n-tX;cy>eRk%+qMB^!3yp%;0B66Sy)9Fm>G0HN<elp zu>OCb(C5!+sZkYi{zadQAd5iq?c*_9-a9;LcRDypBTA=LrujqF90}*7iybx=d_IDT z3M*urju(77&`?szb410!Q$Rr=QOL<-je19uf5MC{oDIg7j18qs!fZ^2Y@LFw4Sc+O z{VaktY^;1-T!MnaQ%d@U=dy7zatLwpuI`%B%CwqyHV50v*-QJ@33Bx;73$eGn~Py# zs{q5H+55Mi6xumO@F3Uz6(`T{x+FO3(DnQaCkvOZx^QmFrafXT9J8<Qe$)T1kD2EX zYs2o1a~fE`M&0Jx5OQ?VRfh%xC*?O^q)u$OzFeGBMki%QS6~B+ZH-9Bh1JT7IldVk T(r9R(#>m3w#JrD#k--`O_;8+I literal 0 HcmV?d00001 diff --git a/testopia/img/FAILED_small.gif b/testopia/img/FAILED_small.gif new file mode 100755 index 0000000000000000000000000000000000000000..22f1a5168aa0c288150488b669970adcea34514a GIT binary patch literal 361 zcmZ?wbhEHb<YVAtxXQrrgOiitKg0K{SKno4e|K{Fp{Dk^y87F<Z=d4g{sU#ZyZ?H6 zew;Ajhos~`UfvI-rT>;K`(|M9BPHdVpy2PIpl`*+Uz(b}-?{VO*!W#i(vQr{Klb+j z)6)Kym3^tH`RnihzoX;J)Ts<K1ByRcSVb5Z8FWB4fc(V3)^?!bgHxx3@|5m^m5yZ& z3;Y5P_eeN#akvN?xvZFe>_I_7h!)SM1%-+xT2Gpf3avNc;B$W{*l*8O$;rtlELkfl z%-7V-&{inP(A_1RT+7ZZ+|0tjQOG=%or8fzoIx&y->rsSj=@WaSB#lOUY><nj918e YgP=4wx3u6cZzm>scR_h3Z$}1e0NDLwt^fc4 literal 0 HcmV?d00001 diff --git a/testopia/img/IDLE.gif b/testopia/img/IDLE.gif new file mode 100755 index 0000000000000000000000000000000000000000..e98324a749d4543ec93a976090f5cf7dc55edfef GIT binary patch literal 570 zcmZ?wbhEHb6lV};xXQp_Y&>)3%rpNP7$PE;-MI0lq-2|y*WBH^Z~g!O-_CA&YwO-M zYc8dxu040|nZN&ncke!RcOS5_n)>|t`>d?BRaHBkoEC1`a_z>A7e|iV3l3hjbm_%O zla70NEscs=`}XbE`}f}g&Ckx>Vr4bg$!UH~&EB@QLtno9+P?jEa`M*h?n8I)z6uIj zdh+DsJ$vr1U3=x(v+oQf0>z&!tRf6d3_2ivAU`p%{dZ_A_+c@H%j3ziuM$?BVnQy( zhc+09@wyad*|E;=b!yIxiJoySbTNm=JpR^0N3$ZO)L0HZcG@kXneS96%&4AH)mbGG z!YC{d$IUDv#mLe%BT-6(S&T`DhfhUXs#8Z*MOC6xN?L_aSV)YGja6kehdgT$7f+|2 z3ac_3y9y_#tfC^%nNz2w*C@&=adOED3W`d~-jTc~qt_`UD=Dg^#G}o?@LcrWGtuc) zEKi>)F=(^B{{2U%Q&;)N+USQ3cXu``aj9%-_@J;aoA*4c#}=hU9UMG8TdTttx-|F8 z+z)InIMmR=B@?tt=3vm$Q(S^P2@F#io_5XF4tkO~f$@1)_!LexlSqf|X7l_mCYi5p zr;jQKZP_+4dqM}3d7cc<ln+V{tgP&O>&i3)9d2Ent+In_=YoU-U5rUb?}aRQ)ZM_Y ecWJNef$jMm;!SVrx(+R1zTYEeSHsD~U=0BLZrCjV literal 0 HcmV?d00001 diff --git a/testopia/img/IDLE_gray.gif b/testopia/img/IDLE_gray.gif new file mode 100755 index 0000000000000000000000000000000000000000..a73c155121d7830db2720fbd4de0ef10375005b0 GIT binary patch literal 409 zcmZ?wbhEHb6lV};IKsft-QB%)>(-ewXZ~kkxOeZ~nKNgWESdZM{rkOp_pVv9{PN`s zM~@y@x^(H+uV1H5?R)m@+1|a|*REX)RDbm7(M_Ay0~yz@U1Puv6o0a?iZC!U=zx@f z>||j5|3IOS*U(X5k(i6|zQ>8W-V5)PJ8s`l@q&xVF>u4iwyn%-3}>?F3Li@RH6vmI z_tJbpjfk$xAGZA9^@(A2WeVERb$=O?N}{BU2B(Yh8jc^_iM|{>B1UX%bzH$LBEq>m zjT$^`VggKTf^~v|B3c|X6FEdg*qAst`Iva-EMCmX6xq$g$-~6N$+mJj&z{LlVu@ng z+L`#;cWpb#*Oh!?+p(P|FHHy*X1H{oZN-gk0*QA{3QjxRzEs3w`qQP`xW$&fI>PYj z<*VsI>v!*A65(g(`uXddrsjur(-{mIdA_Vtb!g=G=K9Jw+iCT6MV2Tw8xM(%VauGk p1ye;nGC1yRRpb>@sJL*rPpab8x!yMq^&OaEZYgNI5@ceq1^{tQo&f*= literal 0 HcmV?d00001 diff --git a/testopia/img/IDLE_small.gif b/testopia/img/IDLE_small.gif new file mode 100755 index 0000000000000000000000000000000000000000..545da368f7837c11a79522fad9644d1329a4f39d GIT binary patch literal 371 zcmZ?wbhEHb<YVAtxXQp_Y}`L#!m<Ah4AIeRo;>+*?%dO=s_ow1^VhGx=HxUtD{KA# z|NpzY4_H}E*}M1dg9opJf|eH+ZksvtjIr^|uU~(qq-<zu+2`c6@cQ*vOO{*=3R=5u z+s$Lg9=(10)yr#XM#d%^n>l@bN0XDc0@YVn?<p(Wb>qfs2I>LDpDe5*3``6<AR|G3 zVqlx#(D)&7g@krndx7K+1C^OQEeknxCFch;Zi*<eP-J!fU@?W`UT^bj1z9<+%_om+ zm}123b7V0?Bbz(3P^=I$Coe;txVVCJEF&kU0t16^oq}qtyzm@h243EYoXu*BCMnd) z39J@mUL_#M%f-(tzFLM`WVL`eub0?XIWbm_)qBOf4{*wzk!wHUox;^If3vqEgEati C>~@d< literal 0 HcmV?d00001 diff --git a/testopia/img/PASSED.gif b/testopia/img/PASSED.gif new file mode 100755 index 0000000000000000000000000000000000000000..8382db9773c75dc8fa1ec0efbc4788a174aa3757 GIT binary patch literal 591 zcmV-V0<ir@Nk%w1VHW@w0M!5h3~&s4vU~pk0N&`{M3F?Q#i}ZTDrT8x|NsBR*u|X1 zoI`{|AafveqjXf3R6B+{j<}BR@$VON7q!u~)8f;6sC#CaW-4|nqQRo)?&mRtF-nO_ z4PgyilUquYN|d*hy4JdcwS>;$&JuDGI*U4OscnR<gdlhzrpu=G_V#3>WVX|`bFFjV z?BCbr*I1iamcW)ljX@fC8f&I&uFbBDyNpkbPce)!Q<+mKdnpiX5TwVX$KA(xs(1hZ z00000A^8La6aWGMEC2ui02crk000L6K!I==S%peSWDOJ<I*GJipr$}s6}3QM(tHY9 zS=fX}8JH=&2`m6>JtF}Y3?y>3GWeED1cI?b8ABO8FCjDuB8iHM2`C{i0bLjbDiAai zE18;^1rQ%5F9bUR88{>=AquLis}LqG2nZD#I2i>R8ZUn#yuBek4H2;jJUJRPDkmo~ z4hJ*OD$y@9!ow!YB{32bIWr$NG2t-}4a2bo3^FnV8UQ05!!r!?2j&Rq3?l#<1^_xH z=00%1VDEsA5eWD7({aJxfPy2oNzkVu2EupM>_xCKZ{EZa9#qJXplm_LSP>TFSh@0q z1Q|VO<lwgQ0fk`{HW<T&%cTKq5E%%ZFra~iQ3wed7<*vUD8Cc61Sl|IfP}aQSjA~2 zL3NaX2s4PrAmE{_*|RbDu?Qr@g^HqNJ>Zy2*8>3(8dR_yLZO7w7-j2vh+&k43ooR0 dc=$`8@m&%xcI-u*0mTfvMm@|x;pRyY06TRe>xBRS literal 0 HcmV?d00001 diff --git a/testopia/img/PASSED_gray.gif b/testopia/img/PASSED_gray.gif new file mode 100755 index 0000000000000000000000000000000000000000..bb32ee0bb7577bb2652a3428da222866f72aa290 GIT binary patch literal 394 zcmZ?wbhEHb6lV};IKsft*4DOn@6OGe*ZyZ<c=qhswQJXwESY=e%$YT7md~6y^Zonx zM~)o0ckkNLrAxnl{W^7O-`>4@*REZ=b?a83?7e&UjvhS<WH8_cia%LcMHrYFbU;c# zb~3R3f1uFE7s{$p6>#pwq$@%??y;vCe|Mb{3~6O*byyO>wY>S!Qwzr4BN`81#C+0f za=mcktr(wx<5E)%1(m7J1!viuRXAJ{7fg^)F`4~u!-N2lQZ^<o5w<1)?#`}GMnRSa zE>=!9R&GvC4nZcNIdcX3CX`MW5agdOD8S2G$kDWrOLY1SHhzAN34)sh*NZOW<Zs(5 zv`~P7dp*a#{Rg+MuV1)y)9I7bdHdIMv9Mj*C2;5Z1eWP-ZJW4TA5UkUz<T@1lgafv zCqHFm{k-ZY@AT%>cRx3Mc^Q11xk<5+BUG{}q1CUUne*%2OpT@nM`l532`+~O_PN#X Zowy>N7rHEA;4opAa!BZ3)FHrN4FGf~oD~27 literal 0 HcmV?d00001 diff --git a/testopia/img/PASSED_small.gif b/testopia/img/PASSED_small.gif new file mode 100755 index 0000000000000000000000000000000000000000..45dd7529e31da9f87e60047d1a169d02ec7370e9 GIT binary patch literal 376 zcmZ?wbhEHb<YVAtxXQr5lh0GUs`x(x!@U>xEW0h29$XqZBT}PG<NyEvyUy>Lx^t>h zp^|sEciPM}gE|ArBFUC*Eg!yoxbpDIrc;|Lmsi@<+srsLLnvPes35p6*s<5~;{A)d zO}cB(t*u#A)4RLZrPXETp_yKjycDVxgiC~tTa7u2IW+1trtF`Rwj?cTPSo`$*K?NU zI8AY~ZnpNH=D+pw))hxqRBx?jAPy-0WMLIyU}De#DF^w9fo-ZoW5EI?3C>lG1(Fw* zC}@bNEafza-sHs2_BtX$Z(2fuSFKLQ>GnwxJ5|<CZanI>lxL<W(?da9IY~)Ab#4Xb zY9VfZ2EA$#aZ$l)X>M_bo@x%^NgS-~^$h&tIy0*c*_-S2RoHpv$n!}_$*AZvt0=4T paPdefDX}Q4c<Jm=W!WdCdML^1sIrWzs>~U0XZ`Ml+q@katN}Jtd1(Lu literal 0 HcmV?d00001 diff --git a/testopia/img/PAUSED.gif b/testopia/img/PAUSED.gif new file mode 100644 index 0000000000000000000000000000000000000000..70640da699db1d472462041cd99d63db99711f9b GIT binary patch literal 750 zcmZ?wbhEHb6lV};c*el+ppEzA$!Q-Z2>xea`2YXumxV@O9-sZbIr{76<*%kFetY}y z-MYyC|NnoxvFZDs+~?f_Z>Fn#JUi$66oGG_-o5J+`Z8Vq<Br_7^DV!ubbq_p@$dV) zzwd1Re`e;_!;OEQ9Qk@}-S>SZ|Np=LJXP}LM49)SlfQ2W{&~9h>r$IP5B7YXZ}?@V z^0)WTzs%A6dZ7Bt+1dZTy!iX#+_!B>|F13mesAm7<2@f{D1ZC%@&C28U!GlgJ4y2U z*6gp#>_5%X`m)OF%Y{WBPfh=NcMro*28usfSVb6^8FWCN0L2Ld`~L>!re<MY1;dUG zSzh7hz7`HX1vPUGIXQDR1qFGt{w6M21sM$kDg6~v1{yL7CS3i(3VcR#2HSV+kTc@b z)o#}2Q&p4JIClJmhP0Zh?mT8Ybwf3~tJkhyQ!}*YVAfV;wK6ebQB-76d-?SFODk4Y zZFw6TRX#pN9v;Qn3O|0$R*l$@k+9IIRalkp2Y2A2hliNi{Ulf#9a}g=S<7^E4irA@ zW75+3W})cN;3~?^8y2xbX~|JxO|Mfi7RK=$GgU1gi8yRd@t>)#^(e+;p+?|Lr797T zfGJFYi_K;St+?Pc?+iP)e8$;d3pDr@v<;?Q+11x@jXm`|SA+QhS6;4k@5iTlqYt+) z5LGG4U_G#Xef&QDqKF@=9LJgV)(f-8IaEww6ylUqdG}j^kyB<qn+8Wg;*q!m{B9{f Z7`2U8aB%CzG%!3o)Wk7Eo|TEg8UU|o{^0-s literal 0 HcmV?d00001 diff --git a/testopia/img/PAUSED_gray.gif b/testopia/img/PAUSED_gray.gif new file mode 100644 index 0000000000000000000000000000000000000000..5af8fc63091cd08c76ed3045ed76cc48370b12ee GIT binary patch literal 400 zcmZ?wbhEHb6lV};IKsd%b!y+yqX#x^TK}Jc;s5`qw{G27vSjZ2_wT=c{d)QGg*9uI z&zw2)%$YOKo;};Ucl-bU|CcUZ`v3p?wQJYz-Mjb5kt0CaYuB!A-@YBlxOeX!0|rq1 z$-*kaz|5cnk^$Mt!217zLZ645rN*h06EFJQ1zCKOL|qS^asAEL9;<ZOLZY|Vr>U$$ zQDaKt$A%S3J*OgrOE_Y}dN)+eNr}<e*K)}4%#Qm7=7$$<U|{XyJnYor!XegJTQ9~V zEWpGr#>SS;BgoG$$TMZaBpwlQ0X9}XZZ;ut;c0@x%a#a>3$bwvb1`rW2r(@Y+O~vA zNPwH0i*3Vvwk17>CJGAd=4R+QuxH60?(-K;@4s;I*o8}bPOraq>((BjdH0STIlN{M zWB0+Mlb${8nJ>xCwWp_<<%GbG6MH(Dc_Jh)xNk_<&&s)@LMr2e!eY*7Hj^C(RwN#D q6Ld8xa5(emFq?hD3Pra`6B}40>v?573LG2tnYr{9{1Iegum%9vE~yy+ literal 0 HcmV?d00001 diff --git a/testopia/img/PAUSED_small.gif b/testopia/img/PAUSED_small.gif new file mode 100644 index 0000000000000000000000000000000000000000..e13405b8f2fe8b00097b11589e5179bdfc55b9b5 GIT binary patch literal 370 zcmZ?wbhEHb<YVAtxXQrrpMl}m)unId7(Z&~`~KzQ=RF1Aw<UhKbMVtdp;xOyemp+$ z|NpZuM_OJ^Q~!E(?Wad)pLPlS|Ns5-tGhpLZ}~n&;M4Z3ABSqb%ux9A=)l+29{<nG z{Ibya>)!nT*Vg`dcIsWf(6?{j{{Mgb^?29E$>M*W9sNE<^83Dm54-bTuL}LT)aLi? zwG5O2#h)y!B0wW_K*oUl#K6|?z`)=V;-kj3D8OS5i-8=!ngOFB=c05ID^bBVCGQ3o zuAb9kf`!QetxjU6lNK7~IP`gY33sL#)k<lK^YL(qi`9yY*NTZN^R#iO)pBsus!ikJ zn<i5$FJCJ&jgLiHo;80#F{`{X3yY`#ue!Q`z*b%XQ70iL0p^2;n3=p8_&E<865u?x Pmt9>$L!JGYBZD;nAtQww literal 0 HcmV?d00001 diff --git a/testopia/img/RUNNING.gif b/testopia/img/RUNNING.gif new file mode 100644 index 0000000000000000000000000000000000000000..afe101de823bba3bcf42bf793c98b6689e23fa4f GIT binary patch literal 804 zcmZ?wbhEHb6lV};c*ekxw^Mb|rIP;)4DY|+sNC*)>e1%z{fRqo&dOWu^!MN0yDzWS z?+n;*y*qEK{{R2~Cmqat^YMA!a<40|_BS1N&Rb`5`2LEXV<C@T-~RUP+uW0t|Nno; zUh7qTz-r~S`k80auD?0_<=4HU-8y@3EHB({2o!nz@#_2UFACQ=XK%GS@_5<yyOWF7 zcvkMVpLjCn|Nrkz+oN8*dpiGA&D(GHTaS1hytVfBtK-++?_GPnW!CYM1s4lT)&$&t zf9~U#_a$4cUwwU0vf1JM)7}67zxeg{#rOaBmS3ql{&-c-QLmR@ukN`&r(};o@3HXK z1A&L{t!~-twB$l{-ZpKZ8_qr7y7%6cf(^FsKfS&8{#x~Ruhu<Lci$b|e|PD<_j{L~ zD=ypYKKXRqiw_U>-dj8Wcq0QXf#OdVRuKj!1|5(kpg3V*|KGsW)NJD*YuVAk<6zU= z*Brv?V(t+rKRwXH+=aEbpDB(<R#RTpPHlyqs=TJGmO;Obtc$Cu>h>KwOkF33OmK<S za*#JNvKBgV@`P5b`8-i$OApsTr)#Q#uD5P`SQ@)B3FrzlYH4XII7&Gw$g@BDz$hFm zz$zmnC%aBTice3^sc*@Sh3lK!t6Ar$cp4pc-pBY?=121Phi!)?xve8O1e*@`WC*Bs z#h5Sf5a*MbdWPXZ(ZWf}g05ayCL}nBPcv5AaL1B)*_nx)LKO#A7OOYRGgM`g5jg5B zG)H>ANA0E~%TFjMY_ND~XzJ3<;JM6hXHqD0hcY|If{5D-94ASCYg`hvpdhuuN>P>9 zXQuV`w=A3jQ+gx}zq59*C^XnuG%hH7yi<ACk5h-3SXo)DvN9MpAKLi*n9dB2MUxgD zPd#I$v?6Y;6l1HLp90UWhR5#7*LEl?{AhIErpzkIap#=uLzYGfal2OG!dC9b=VN#} a8kWWg@JLy#)7g;pl#5R)&W@Fd!5RR3k5_>J literal 0 HcmV?d00001 diff --git a/testopia/img/RUNNING_gray.gif b/testopia/img/RUNNING_gray.gif new file mode 100644 index 0000000000000000000000000000000000000000..45a7afff2523b10e506e486a9816e3098c699a55 GIT binary patch literal 541 zcmZ?wbhEHb6lV};xXQpVb!y+4GiR18nfsrC;rsXJYuB!M@#5azz1zQj{d(=%wfFDe z|ND1u>C&Y$XU;r&^uYc5*EVfh|NsB@HEWiC{P^hq{}2EF|KGQ7@4b8XE?>TI<j9d{ z&z}AN{{pCZ+qSLWzJ2`k3B+cgB~bjy!YabR%%B6Z1mq_Mw*Lnj3p#eB@Oh*>Xp*q% z<ZM@N@Qg5I)cmX&l42;{n`Cn>#vu5p@Whi1N4Z*L4DGzH#(Jl({8%9()!3BAC@bm9 zEFr|6FWuK5K5-HwyAUTcmw=EMBd0ivw1^0cRM;{`F&+UfP9~<d5Ec<pK|yJGamHPe zvOG+j?7U2@vU4_xp4i61wnCPbiC0XBftQC>K<xO56N}_I_ww=zF<m*tBp|%`_H7Yv z7Fk|~bx$9%zI^?LoBPA3Cl9}VzouEupg*r6^S{)M;N!V7nKS-#v3T#;@Q{UPU(Dal z7f#*T$+=L&r-DIov33TNp2h@$bD@k(?>LNRcuscQ5z5T8z$T-iso83l!{NjiLT5yo zIfWXom83GBXW*6X(PI5|YNY@#yPx0L3`b^hABlN$Wvcm_L-n`}N*rE!Ik9h!X<}fo F1^@way)*y- literal 0 HcmV?d00001 diff --git a/testopia/img/RUNNING_small.gif b/testopia/img/RUNNING_small.gif new file mode 100644 index 0000000000000000000000000000000000000000..859caed42c76b96ba480b68fd823bd17433b6d4a GIT binary patch literal 376 zcmZ?wbhEHb<YVAtxXQqgx7=&n?a3>z)c$8+c>VQE;SPff&v*6i&CJ`W+O#X|+qZ8g zA8oq+=+cqL%V(ZR`~3A|-g>L2ZyruQ75o4H_th6WzWsW7@BO(&=W6n{7~Xt)bi?)T zDF=$14!h*7cKZ0^&VLa2c=q|`0}tkGy55(+OJn-M%HvN~m+dvY_x$Gn|1aB*`sD4< zTz8}S?)&4{Ump1N_chR#Z8s;MySH`qnW-<{KK=gv-t<G247h>fPZm}Y24)5wkP?ue z7}%yBIOyQGMS@3cQGkcZ3?nh`w8Q`d`NnjUS%$1~hZ$B+{Mh32f=%1uiABW1kX1`p zT3d7-^;8w~{U@p<q@~U+rJ|y)BP`#m$)c{JtjsZ$sYhN|j!#=#nR~7TlY)Z2p~MPp zZhlq?0TE3-fz6v)`T4~KWZBte_w5r9cM{~3WjKC9meZSAL;BcB=`&6yJjP~b#yn>n G8LR=0H=}C+ literal 0 HcmV?d00001 diff --git a/testopia/img/Testopia_pocket.eps b/testopia/img/Testopia_pocket.eps new file mode 100644 index 0000000..906a563 --- /dev/null +++ b/testopia/img/Testopia_pocket.eps @@ -0,0 +1,59 @@ +%!PS-Adobe-3.1 EPSF-3.0 %ADO_DSC_Encoding: MacOS Roman %%Title: Testopia_pocket.eps %%Creator: Adobe Illustrator(R) 12 %%AI8_CreatorVersion: 12.0.1 %AI9_PrintingDataBegin %%For: Todd Purser %%CreationDate: 5/22/06 %%BoundingBox: 0 0 300 102 %%HiResBoundingBox: 0 0 299.7168 101.3907 %%CropBox: 0 0 299.7168 101.3907 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 %%+ procset Adobe_CoolType_Utility_T42 1.0 0 %%+ procset Adobe_CoolType_Utility_MAKEOCF 1.19 0 %%+ procset Adobe_CoolType_Core 2.23 0 %%+ procset Adobe_AGM_Core 2.0 0 %%+ procset Adobe_AGM_Utils 1.0 0 %%DocumentFonts: %%DocumentNeededFonts: %%DocumentNeededFeatures: %%DocumentSuppliedFeatures: %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %ADO_BuildNumber: Adobe Illustrator(R) 12.0.1 x5205 R agm 4.3861 ct 5.530 %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 128 44 8 %%BeginData: 9524 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFD08FF762752525227525252275252522752525227525252 %275252522752525227525252275252522752525227525252275252522752 %525227525252275252522752525227525252275252522752525227525252 %275252522752525227525252275252522752525227525252275252522752 %525227525252275252FD07FF27FD79F8FD05FF7DF8F8F827F8F8F827F8F8 %F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827 %F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8 %F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827 %F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F852FD04FF27FD7AF8 %52FD04FF52F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F8 %05F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8 %F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F8 %05F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8 %F8F805F8F8F80552FD04FF52FD04F8FD0D5259F827FD0A527DFD04F827FD %0552F8F8F827FD0D527DF8F8F827FD0852FD05F827FD0A5227FD05F827FD %045259FD05F8FD0852FD0AF852FD05FFF827F8F8FF7E53542F5453542F54 %53542F7E277D7E5453542F5453542F545359F82752FF545453542F7E52F8 %F8FF54542F5453542F5453542F545A52F827A8A9535453542F54537EF827 %F8F827A953542F5453542F5453547D27F8F8F8A17E542F548527F827F8A8 %A87E53542F5453547E27F8F8F827F8F8F827FD06FF27F8F8F87D7E292929 %2829292928FD04295927A9282929292829292928295AF827FF5329282929 %29282F28F8FF5429292829292928292929285A2EF87DA929292829292928 %29297EF8F8F8527E292929282929292829292F2EF8F8F8A85329292984F8 %F8F8A87E2928292929282929295A00FD06F827FD06FF52F8F80552A92954 %2F29292F292F29542F535A27FF2F292F295329542F532985F87DA82F2929 %292F2929297E00FF5A542F53292F292929542F53535327FF292F2929292F %2929292F2953F80552A8292F295329532929292F297EF805F8FF292F2954 %5905F87D7E2F292929532929292F295A2705F8F8F805F87DFD07FFFD04F8 %2E592E5953530629295A2E595259F8A8292906535A592E59525953277D7E %0629295A5A7E2929295927592E597D7E0629297E2E595259277D7E290629 %53855A53292906295AF8F852532906295A59535329290629532EF851A829 %06295353F827A8290629297E5A7E292906292F59FD06F8FD08FF4BF827F8 %F8F827F8527E2F292F7E27F8F8F8277D7E292F2985F827F8F8F827F8A854 %2F29535A27F87D292F7EF8F827F8527E2F292F7E27F8F8F8277D7E292F29 %852E27522F292F298527277D7E292F2985F8272753292F295A522752A929 %2F298527277D7E292F297E5A272754292F295A5327F8F8F82727FD08FF52 %FD08F8FF2829295AFD05F8527E2928295AFD07F87D7E2829295AF8F82754 %287EFD04F827A82829297EFD05F8A8292928535AF8F852292928295A27F8 %A85329282F59F8F827532928295359F87D532928296005F8FF292928535A %27F852292928295A2EFD05F87DFD09FFF8F8F805F8F8F805A853292F2F53 %F805F8F826FF2929297E27F8F805F8F8F87D5429292F7EF8F805527E5A27 %F8F8F8527E29292F7E27F805F8F87D542929295AF8F827542929298527F8 %7D5429292984F8F8277E2929297E2EF87D5429292984F827A92F29295A59 %F8F8762F2929298527F8F805F827FD0AFF27FD07F87D5329062959FD05F8 %A85329292952FD06F852A82929065405FD09F827FF2929067E05FD04F87D %292929532EF8F827FD04295A27F8A82929295353F8F852FD04295A27F8FF %2929295353F8527E0629298427F8F87E062929535AFD05F827FD0AFF76F8 %F827F8F8F8274BA9292F2985F827F8F8F8A1542F295359F8F827F8F8F852 %A92F292F297EF827F8F8F827F8F8F84BFF2F292F7E2EF827F8F87D54292F %2F59F8F82754292F298527F8FF54292F5359F8F85254292F2985F827FF2F %292F5A59F87D532F29536027F827532F292F5A7DF8F8F827F87DFD0BFFFD %08F8FF2F28295327FD04F8527E29292884FD07F8A829292829292EFD09F8 %FF2929287E27FD04F87D292929532EF8F827FD04295A27F8FF282929542E %F8F8A82829292F5AF827A82829297E27F8A8532829535AF8F8522F282929 %8527FD05F8FD0CFF52F8F8F805F8F8F87D5329295353F8F805F852A82F29 %295A27F8F8F805F8F8527E2929292F5327F805F8F8F805F8F8FF2F292953 %2EF8F8F8057D53292F2F59F8055253292F2985F827FF29292F7E52F85253 %29292F537EF87D7E29292F850527FF2929297E52F8F87E292929535AF8F8 %05F8F827FD0CFF52FD07F84B7E2929067EFD05F8FF2929295427FD07F87D %532929062953FD08F8FF2929295428FD04F8A12929065352F8F852292906 %295AF827FF2929067E52535329292906852EF87D542929295AF8527E2929 %2953595252532929295359FD05F87DFD0DFFF8F8F827F8F8F827FF2F292F %7E27F827F8F87D54292F292F292F2959F8F8F827A82F292F292F5327F8F8 %F827F8F8A854292F5353F8F8F8277D54292F5359F8275254292F297EF852 %A82F292F292F292F292F297E8427F8FF532F297E59F87D7E292F292F292F %292F292F298527F8F827F827FD0EFF27FD07F8A82929285427FD04F85253 %292929282929295AFD04F8527E292829292FFD07F87D292929542EFD04F8 %A82929285A53F8F8522929282F59F827A9292928292929282929535A53F8 %27FF2929295A53F8A8FD0429282929292829292F5A00FD04F827FD0EFF52 %05F8F8F805F8F8527E29292959F8F8F80527A9292F2929292F297EF805F8 %F8F8A85329292F295AF805F8F8F8057D53292F5359F805F8F87D54292953 %59F8F8522F29292984F8767E2F2929292F2929297E8559F80527A9292F29 %852727FF29292F29532F542929292F535AF805F8F8F87DFD0FFFFD07F852 %7E2929295AFD04F827FF290629537E5A7E5A27FD05F8A9292906292959FD %05F8A15329065352FD04F87D292929542EF8F8520629295353F8527E0629 %29855A8560855952F8F8F8527E2906295AF827A829290685595A7E542929 %06842EFD05F8FD10FF52F8F8F827F8F8F8FF292F297EF8F8F827F8CA2F2F %295A522E272EF827F8F8F82727A9292F292F2F27F8F8F8277D7E292F5359 %F827F8F87D54292F5359F8F87D2F292F2F59F87D542F29545327F8F8F827 %F8F8F8277D7E292F5384F87D5A2F29545AF8F87D292F29538527F827F8F8 %27FD10FF52FD07F87D7E29292F2EFD04F8767E28292959FD0AF876542829 %29295AFD04F8525329285359FD04F87D292929542EF8F87D2829295353F8 %7D5428295359FD09F8A82929285A53F87D5329295359F8F87D2929292F7E %FD05F87DFD11FFF805F8F8F805F8527E2F292F5905F8F8F8527E29292F59 %F8F805F8F8F805F8F8F827A853292F297E0005F8F8527E29292959F8F8F8 %057D53292F5352F8057D29292F5359F8A85329297E53F8F805F8F8F805F8 %F8FF2F29297E52F8FF292F29852705F87E292F297E5205F8F8F827FD12FF %27FD07F8FF0629297EFD04F827FF29290684FD0BF8277E2906292F2EF8F8 %F8527E2929532EFD04F8A12929065A2EF8F87D2929065A2EF8A853292953 %52FD08F827FF06292985F852A829062960F8F852292906296027FD04F827 %FD12FF7D27F8F8F827F8F8A854292F5427F8F8F827FF53292F5A27F827F8 %F8F827F8F8F827F8CA292F29545327F8F852A9292F2F7EF8F8F8277D5429 %2F5352F8277D2F292F5352F8FF2F2F298527F8F827F8F8F827F8527E2F29 %535A27527E292F5384F8277D2F292F5384F827F8F8F87DFD13FFFD07F87D %5329295328FD04F87D5329285427FD06F8525327F8F8525328292959F8F8 %F8277E29295359FD04F8A82929285A2EF8F87E2929287E28F8FF2929295A %27FD08F8527E28292F5AF8A85329287E53F8F87E2929287E53FD05F8FD14 %FF52F805F8F8F80527A9292F297EF805F8F8527E29292959F8F8F805F827 %FF2F7EF8F852532929545AF8F80527A9292F297EF805F8F87D7E29292F53 %F827532F29297E2E27FF292F2985F805F8F8F805F8F8F8A85329297E5927 %FF2F29297E52F827532F2929842EF8F8F80527FD14FF7DFD07F8FF2F0629 %5AFD04F827A829292959FD06F8FF2954F8F852FD04295AF8F8F851A82906 %2959FD04F8767E29292959F8522906292985F851A82906295AFD09F8FF53 %29295A2E27A806292985F8F8522F06292984FD05F87DFD15FFF827F8F8F8 %27F87D532F297E2727F8F8F8FF292F295A5253525353277D7E29532F2F29 %2F295A59F8F82727FF292F297EF827F8F852FF292F2953532F292F29545A %2727A9292F2F84F827F8F8F827F8F827FF292F2985057D7E2F29545A27F8 %7E292F297E5927F8F8F827FD16FF27FD06F84B7E28292953FD04F87D5429 %292829292928295A27FF532929282929295A59FD04F8FF2928295AFD05F8 %A87E29292829292928295A59F8527E29285359FD08F8527E29292F5AF87D %5428295359F8F87E2928297E2EFD04F827FD16FF7DF8F805F8F8F827FF29 %292F5AF8F805F87D5A2F2929292F2929297E277DA95A2929292F5485F805 %F8F8F8FF29292985F8F8F805F852FF7E2929292F292F5A8527F8527E2929 %2F59F8F8F805F8F8F805527E292F535AF8FF2929298527F8275429292985 %F8F8F805F87DFD17FFFD07F8AFFFFFFFAFFD04F852FD09FFA82EF8A9A8FF %FFFFA8852EFD05F8FD04FF5AFD06F87EA8FD05FFA8852EF8F87DFFFFFFA9 %53FD08F8A8FFFFFFA95252FD04FF5AF8F87DFFFFFFAF59FD05F8FD18FF52 %F827F8F8F827278459845A27F827F8275A845A7E59845A7E598452F8F859 %5984598453F8F827F8F8F8595A7E5985F8F8F827F8F8F827598459845A7E %2E27F8F805845A7E5952F8F8F827F8F8F827278459845A2EF87E5A7E5984 %F8F827845A7E5953F8F8F82727FD18FFA8FD66F8A8FD19FF7D27F805F8F8 %F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805 %F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8 %F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805 %F8F8F805F87DFD1BFF7DFD62F87DFD1EFF7D2727F827F8F8F827F8F8F827 %F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8 %F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827 %F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F82752FDFCFFFD93FFFF %%EndData %%EndComments %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Utils 70 dict dup begin put /bdf { bind def } bind def /nd{ null def }bdf /xdf { exch def }bdf /ldf { load def }bdf /ddf { put }bdf /xddf { 3 -1 roll put }bdf /xpt { exch put }bdf /ndf { exch dup where{ pop pop pop }{ xdf }ifelse }def /cdndf { exch dup currentdict exch known{ pop pop }{ exch def }ifelse }def /ps_level /languagelevel where{ pop systemdict /languagelevel get exec }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr} stopped { -1 }if def /set_gvm { currentglobal exch setglobal }bdf /reset_gvm { setglobal }bdf /makereadonlyarray { /packedarray where{ pop packedarray }{ array astore readonly }ifelse }bdf /map_reserved_ink_name { dup type /stringtype eq{ dup /Red eq{ pop (_Red_) }{ dup /Green eq{ pop (_Green_) }{ dup /Blue eq{ pop (_Blue_) }{ dup () cvn eq{ pop (Process) }if }ifelse }ifelse }ifelse }if }bdf /AGMUTIL_GSTATE 22 dict def /get_gstate { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_clr_spc currentcolorspace def /AGMUTIL_GSTATE_clr_indx 0 def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end }def /set_gstate { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap AGMUTIL_GSTATE_lj setlinejoin AGMUTIL_GSTATE_ml setmiterlimit AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash AGMUTIL_GSTATE_sa setstrokeadjust AGMUTIL_GSTATE_clr_rnd setcolorrendering AGMUTIL_GSTATE_op setoverprint AGMUTIL_GSTATE_bg cvx setblackgeneration AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or { currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne { mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark } if }{ AGMUTIL_GSTATE_ht sethalftone } ifelse AGMUTIL_GSTATE_flt setflat end }def /get_gstate_and_matrix { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_ctm matrix currentmatrix def end get_gstate }def /set_gstate_and_matrix { set_gstate AGMUTIL_GSTATE begin AGMUTIL_GSTATE_ctm setmatrix end }def /AGMUTIL_str256 256 string def /AGMUTIL_src256 256 string def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd /thold_halftone { level3 {sethalftone currenthalftone} { dup /HalftoneType get 3 eq { sethalftone currenthalftone } { begin Width Height mul { Thresholds read {pop} if } repeat end currenthalftone } ifelse }ifelse } def /rdcmntline { currentfile AGMUTIL_str256 readline pop (%) anchorsearch {pop} if } bdf /filter_cmyk { dup type /filetype ne{ exch () /SubFileDecode filter } { exch pop } ifelse [ exch { AGMUTIL_src256 readstring pop dup length /AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put /AGMUTIL_ndx AGMUTIL_ndx 1 add def }for pop AGMUTIL_dst64 0 AGMUTIL_ndx getinterval } bind /exec cvx ] cvx } bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get } bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf dup type /filetype ne{ 0 () /SubFileDecode filter }if [ exch [ /devicen_colorspace_dict /AGMCORE_gget cvx /begin cvx currentdict /srcStr get /readstring cvx /pop cvx /dup cvx /length cvx 0 /gt cvx [ Adobe_AGM_Utils /AGMUTIL_ndx 0 /ddf cvx names_index Names length currentdict /srcStr get length 1 sub { 1 /index cvx /exch cvx /get cvx currentdict /dstStr get /AGMUTIL_ndx /load cvx 3 -1 /roll cvx /put cvx Adobe_AGM_Utils /AGMUTIL_ndx /AGMUTIL_ndx /load cvx 1 /add cvx /ddf cvx } for currentdict /dstStr get 0 /AGMUTIL_ndx /load cvx /getinterval cvx ] cvx /if cvx /end cvx ] cvx bind /exec cvx ] cvx end } bdf /AGMUTIL_imagefile nd /read_image_file { AGMUTIL_imagefile 0 setfileposition 10 dict begin /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def /origDataSource imageDict /DataSource get def /origMultipleDataSources imageDict /MultipleDataSources get def /origDecode imageDict /Decode get def /dstDataStr imageDict /Width get colorSpaceElemCnt mul string def imageDict /MultipleDataSources known {MultipleDataSources}{false} ifelse { /imbufCnt imageDict /DataSource get length def /imbufs imbufCnt array def 0 1 imbufCnt 1 sub { /imbufIdx xdf imbufs imbufIdx imbufLen string put imageDict /DataSource get imbufIdx [ AGMUTIL_imagefile imbufs imbufIdx get /readstring cvx /pop cvx ] cvx put } for DeviceN_PS2 { imageDict begin /DataSource [ DataSource /devn_sep_datasource cvx ] cvx def /MultipleDataSources false def /Decode [0 1] def end } if }{ /imbuf imbufLen string def Indexed_DeviceN level3 not and DeviceN_NoneName or { /srcDataStrs [ imageDict begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def imageDict begin /DataSource [AGMUTIL_imagefile Decode BitsPerComponent false 1 /filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource /exec cvx] cvx def /Decode [0 1] def end }{ imageDict /DataSource [1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx /pop cvx names_index /get cvx /put cvx] cvx put imageDict /Decode [0 1] put } ifelse } ifelse imageDict exch load exec imageDict /DataSource origDataSource put imageDict /MultipleDataSources origMultipleDataSources put imageDict /Decode origDecode put end } bdf /write_image_file { begin { (AGMUTIL_imagefile) (w+) file } stopped{ false }{ Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def MultipleDataSources {DataSource 0 get}{DataSource}ifelse type /filetype eq { /imbuf imbufLen string def }if 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ pop MultipleDataSources { 0 1 DataSource length 1 sub { DataSource type dup /arraytype eq { pop DataSource exch get exec }{ /filetype eq { DataSource exch get imbuf readstring pop }{ DataSource exch get } ifelse } ifelse AGMUTIL_imagefile exch writestring } for }{ DataSource type dup /arraytype eq { pop DataSource exec }{ /filetype eq { DataSource imbuf readstring pop }{ DataSource } ifelse } ifelse AGMUTIL_imagefile exch writestring } ifelse }for end true }ifelse end } bdf /close_image_file { AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile }def statusdict /product known userdict /AGMP_current_show known not and{ /pstr statusdict /product get def pstr (HP LaserJet 2200) eq pstr (HP LaserJet 4000 Series) eq or pstr (HP LaserJet 4050 Series ) eq or pstr (HP LaserJet 8000 Series) eq or pstr (HP LaserJet 8100 Series) eq or pstr (HP LaserJet 8150 Series) eq or pstr (HP LaserJet 5000 Series) eq or pstr (HP LaserJet 5100 Series) eq or pstr (HP Color LaserJet 4500) eq or pstr (HP Color LaserJet 4600) eq or pstr (HP LaserJet 5Si) eq or pstr (HP LaserJet 1200 Series) eq or pstr (HP LaserJet 1300 Series) eq or pstr (HP LaserJet 4100 Series) eq or { userdict /AGMP_current_show /show load put userdict /show { currentcolorspace 0 get /Pattern eq {false charpath f} {AGMP_current_show} ifelse } put }if currentdict /pstr undef } if /consumeimagedata { begin currentdict /MultipleDataSources known not {/MultipleDataSources false def} if MultipleDataSources { DataSource 0 get type dup /filetype eq { 1 dict begin /flushbuffer Width cvi string def 1 1 Height cvi { pop 0 1 DataSource length 1 sub { DataSource exch get flushbuffer readstring pop pop }for }for end }if dup /arraytype eq exch /packedarraytype eq or DataSource 0 get xcheck and { Width Height mul cvi { 0 1 DataSource length 1 sub {dup DataSource exch get exec length exch 0 ne {pop}if}for dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if } { /DataSource load type dup /filetype eq { 1 dict begin /flushbuffer Width Decode length 2 idiv mul cvi string def 1 1 Height { pop DataSource flushbuffer readstring pop pop} for end }if dup /arraytype eq exch /packedarraytype eq or /DataSource load xcheck and { Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul { DataSource length dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if }ifelse end }bdf /addprocs { 2{/exec load}repeat 3 1 roll [ 5 1 roll ] bind cvx }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end sethalftone pop }ifelse }def /clonearray { dup xcheck exch dup length array exch Adobe_AGM_Core/AGMCORE_tmp -1 ddf { Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf dup type /dicttype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonedict Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if dup type /arraytype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonearray Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if exch dup Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put }forall exch {cvx} if }bdf /clonedict { dup length dict begin { dup type /dicttype eq { clonedict } if dup type /arraytype eq { clonearray } if def }forall currentdict end }bdf /DeviceN_PS2 { /currentcolorspace AGMCORE_gget 0 get /DeviceN eq level3 not and } bdf /Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget dup null ne { dup /CSDBase known { /CSDBase get /CSD get_res /Names known }{ pop false }ifelse }{ pop false } ifelse } bdf /DeviceN_NoneName { /Names where { pop false Names { (None) eq or } forall }{ false }ifelse } bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { pop dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false } { true }ifelse } { true } ifelse } { true } ifelse } bdf /base_colorspace_type { dup type /arraytype eq {0 get} if } bdf /currentdistillerparams where { pop currentdistillerparams /CoreDistVersion get 5000 lt}{true}ifelse { /pdfmark_5 {cleartomark} bind def }{ /pdfmark_5 {pdfmark} bind def }ifelse /ReadBypdfmark_5 { 2 dict begin /makerString exch def string /tmpString exch def { currentfile tmpString readline pop makerString anchorsearch { pop pop cleartomark exit }{ 3 copy /PUT pdfmark_5 pop 2 copy (\n) /PUT pdfmark_5 } ifelse }loop end } bdf /doc_setup{ Adobe_AGM_Utils begin }bdf /doc_trailer{ currentdict Adobe_AGM_Utils eq{ end }if }bdf systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright (C) 1997-2005 Adobe Systems, Inc. All Rights Reserved. %% Note: This procset assumes Adobe_AGM_Utils is opened on the stack below it, for %% definitions of some fundamental procedures. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Core 201 dict dup begin put /Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen [currentscreen] cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&setcmykcolor nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_distilling nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSD_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd /AGMCORE_feature_opCount nd /AGMCORE_feature_ctm nd /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd /AGMCORE_in_pattern false def /AGMCORE_currentpagedevice nd /knockout_unitsq nd currentglobal true setglobal [/CSA /Gradient /Procedure] { /Generic /Category findresource dup length dict copy /Category defineresource pop } forall setglobal /AGMCORE_key_known { where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /flushinput { save 2 dict begin /CompareBuffer 3 -1 roll def /readbuffer 256 string def mark { currentfile readbuffer {readline} stopped {cleartomark mark} { not {pop exit} if CompareBuffer eq {exit} if }ifelse }loop cleartomark end restore }bdf /getspotfunction { AGMCORE_screen exch pop exch pop dup type /dicttype eq{ dup /HalftoneType get 1 eq{ /SpotFunction get }{ dup /HalftoneType get 2 eq{ /GraySpotFunction get }{ pop { abs exch abs 2 copy add 1 gt{ 1 sub dup mul exch 1 sub dup mul add 1 sub }{ dup mul exch dup mul add 1 exch sub }ifelse }bind }ifelse }ifelse }if } def /clp_npth { clip newpath } def /eoclp_npth { eoclip newpath } def /npth_clp { newpath clip } def /graphic_setup { /AGMCORE_graphicsave save def concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth [] 0 setdash 10 setmiterlimit newpath false setoverprint false setstrokeadjust //Adobe_AGM_Core/spot_alias get exec /Adobe_AGM_Image where { pop Adobe_AGM_Image/spot_alias 2 copy known{ get exec }{ pop pop }ifelse } if 100 dict begin /dictstackcount countdictstack def /showpage {} def mark } def /graphic_cleanup { cleartomark dictstackcount 1 countdictstack 1 sub {end}for end AGMCORE_graphicsave restore } def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def } { AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def } ifelse } forall } bdf /doc_setup{ Adobe_AGM_Core begin /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict /AGM_handleerror known not{ errordict /AGM_handleerror errordict /handleerror get put errordict /handleerror { Adobe_AGM_Core begin $error /newerror get AGMCORE_cur_err null ne and{ $error /newerror false put AGMCORE_cur_err compose_error_msg }if $error /newerror true put end errordict /AGM_handleerror get exec } bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err /AGMCORE_bad_environ def} if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def /AGMCORE_distilling /product where{ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and }{ false }ifelse def /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 10 def /AGMCORE_&gsave /gsave ldf /AGMCORE_&grestore /grestore ldf /AGMCORE_&grestoreall /grestoreall ldf /AGMCORE_&save /save ldf /AGMCORE_&setoverprint /setoverprint ldf /AGMCORE_gdictcopy { begin { def } forall end }def /AGMCORE_gput { AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget { AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave { AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore { AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt {1 add} if dup AGMCORE_gstack exch get dup /AGMCORE_currentoverprint known {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse /AGMCORE_gstackptr exch store }def /grestoreall { AGMCORE_&grestoreall /AGMCORE_gstackptr AGMCORE_gstacksaveptr store }def /save { AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store /AGMCORE_gstacksaveptr AGMCORE_gstackptr store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /setoverprint{ dup /AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint }def 0 1 AGMCORE_gstack length 1 sub { AGMCORE_gstack exch AGMCORE_gstackframekeys dict put } for }if level3 /AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def /AGMCORE_&sysmakepattern systemdict/makepattern get def /AGMCORE_&usrmakepattern /makepattern load def }if /currentcmykcolor [0 0 0 0] AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace [/DeviceGray] AGMCORE_gput /sep_tint 0 AGMCORE_gput /devicen_tints [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent () AGMCORE_gput /customcolor_tint 1 AGMCORE_gput << /MaxPatternItem currentsystemparams /MaxPatternCache get >> setuserparams end }def /page_setup { /setcmykcolor where{ pop Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor pop }ndf /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint { pop }ndf /currentoverprint { false }ndf /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_have_reported_unsupported_color_space false def /AGMCORE_report_unsupported_color_space { AGMCORE_have_reported_unsupported_color_space false eq { (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.) == Adobe_AGM_Core /AGMCORE_have_reported_unsupported_color_space true ddf } if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_in_rip_sep /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ AGMCORE_distilling { false }{ userdict/Adobe_AGM_OnHost_Seps known{ false }{ level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse }ifelse }ifelse }ifelse def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ AGMCORE_distilling AGMCORE_producing_seps or }ifelse def /AGM_is_distiller_preserving_spotimages { currentdistillerparams/PreserveOverprintSettings known { currentdistillerparams/PreserveOverprintSettings get { currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get /sRGB ne }{ true }ifelse }{ false }ifelse }{ false }ifelse }def /convert_spot_to_process where {pop}{ /convert_spot_to_process { //Adobe_AGM_Core begin dup map_alias { /Name get exch pop } if dup dup (None) eq exch (All) eq or { pop false }{ AGMCORE_host_sep { gsave 1 0 0 0 setcmykcolor currentgray 1 exch sub 0 1 0 0 setcmykcolor currentgray 1 exch sub 0 0 1 0 setcmykcolor currentgray 1 exch sub 0 0 0 1 setcmykcolor currentgray 1 exch sub add add add 0 eq { pop false }{ false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne }ifelse grestore }{ AGMCORE_distilling { pop AGM_is_distiller_preserving_spotimages not }{ //Adobe_AGM_Core/AGMCORE_name xddf false //Adobe_AGM_Core/AGMCORE_in_pattern known {//Adobe_AGM_Core/AGMCORE_in_pattern get}{false} ifelse not AGMCORE_currentpagedevice/OverrideSeparations known and { AGMCORE_currentpagedevice/OverrideSeparations get { /HqnSpots /ProcSet resourcestatus { pop pop pop true }if }if }if { AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not }{ gsave [/Separation AGMCORE_name /DeviceGray {}]AGMCORE_&setcolorspace false AGMCORE_currentpagedevice/SeparationColorNames 2 copy known { get { AGMCORE_name eq or}forall not }{ pop pop pop true }ifelse grestore }ifelse }ifelse }ifelse }ifelse end }def }ifelse /convert_to_process where {pop}{ /convert_to_process { dup length 0 eq { pop false }{ AGMCORE_host_sep { dup true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } forall { true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch (Black) eq or and }forall not }{pop false}ifelse }{ false exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process or}ifelse } forall }ifelse }ifelse }def }ifelse /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse { /setcmykcolor[ { 4 copy add add add 0 eq currentoverprint and{ pop 0.0005 }if }/exec cvx /AGMCORE_&setcmykcolor load dup type/operatortype ne{ /exec cvx }if ]cvx def }if /AGMCORE_IsSeparationAProcessColor { dup (Cyan) eq exch dup (Magenta) eq exch dup (Yellow) eq exch (Black) eq or or or }def AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ AGMCORE_magenta_plate{ 4 3 roll pop pop pop }{ AGMCORE_yellow_plate{ 4 2 roll pop pop pop }{ 4 1 roll pop pop pop }ifelse }ifelse }ifelse settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames { 1 dict begin /filtername { dup /Cyan eq 1 index (Cyan) eq or {pop (_cyan_)}if dup /Magenta eq 1 index (Magenta) eq or {pop (_magenta_)}if dup /Yellow eq 1 index (Yellow) eq or {pop (_yellow_)}if dup /Black eq 1 index (Black) eq or {pop (_black_)}if }def dup type /arraytype eq {[exch {filtername}forall]} {filtername}ifelse end }def level3 { /AGMCORE_IsCurrentColor { dup AGMCORE_IsSeparationAProcessColor { AGMCORE_plate_ndx 0 eq {dup (Cyan) eq exch /Cyan eq or}if AGMCORE_plate_ndx 1 eq {dup (Magenta) eq exch /Magenta eq or}if AGMCORE_plate_ndx 2 eq {dup (Yellow) eq exch /Yellow eq or}if AGMCORE_plate_ndx 3 eq {dup (Black) eq exch /Black eq or}if AGMCORE_plate_ndx 4 eq {pop false}if }{ gsave false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne grestore }ifelse }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf data_in type /stringtype eq { /ncomp xdf /comp xdf /string_out data_in length ncomp idiv string def 0 ncomp data_in length 1 sub { string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put }for string_out }{ string /string_in xdf /string_out 1 string def /component xdf [ data_in string_in /readstring cvx [component /get cvx 255 /exch cvx /sub cvx string_out /exch cvx 0 /exch cvx /put cvx string_out]cvx [/pop cvx ()]cvx /ifelse cvx ]cvx /ReusableStreamDecode filter }ifelse end }def /AGMCORE_separateShadingFunction { 2 dict begin /paint? xdf /channel xdf dup type /dicttype eq { begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def currentdict /Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not {/Decode [1 1]def}if }if FunctionType 2 eq { paint? { /C0 [C0 channel get 1 exch sub] def /C1 [C1 channel get 1 exch sub] def }{ /C0 [1] def /C1 [1] def }ifelse }if FunctionType 3 eq { /Functions [Functions {channel paint? AGMCORE_separateShadingFunction} forall] def }if currentdict /Range known {/Range [0 1] def}if currentdict end}{ channel get 0 paint? AGMCORE_separateShadingFunction }ifelse end }def /AGMCORE_separateShading { 3 -1 roll begin currentdict /Function known { currentdict /Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if Function 3 1 roll AGMCORE_separateShadingFunction /Function xdf /ColorSpace [/DeviceGray] def }{ ColorSpace dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse ColorSpace 0 get /Separation eq { { [1 /exch cvx /sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll put pop }{ { [exch ColorSpace 1 get length 1 sub exch sub /index cvx 1 /exch cvx /sub cvx ColorSpace 1 get length 1 add 1 /roll cvx ColorSpace 1 get length{/pop cvx} repeat]cvx }{ pop [ColorSpace 1 get length {/pop cvx} repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse ColorSpace 2 /DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { dup /ColorSpace get dup type /arraytype ne {[exch]}if dup 0 get /DeviceCMYK eq { exch begin currentdict AGMCORE_cyan_plate {0 true}if AGMCORE_magenta_plate {1 true}if AGMCORE_yellow_plate {2 true}if AGMCORE_black_plate {3 true}if AGMCORE_plate_ndx 4 eq {0 false}if dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading currentdict end exch }if dup 0 get /Separation eq { exch begin ColorSpace 1 get dup /None ne exch /All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /Separation ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading }if }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse }if currentdict end exch }if dup 0 get /DeviceN eq { exch begin ColorSpace 1 get convert_to_process { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /DeviceN ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading /ColorSpace [/DeviceGray] def }if }ifelse }{ currentdict false -1 ColorSpace 1 get { AGMCORE_IsCurrentColor { 1 add exch pop true exch exit }if 1 add }forall exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse currentdict end exch }if dup 0 get dup /DeviceCMYK eq exch dup /Separation eq exch /DeviceN eq or or not { exch begin ColorSpace dup type /arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { ColorSpace 0 get /CIEBasedA eq { /ColorSpace [/Separation /_ciebaseda_ /DeviceGray {}] def }if ColorSpace 0 get dup /CIEBasedABC eq exch dup /CIEBasedDEF eq exch /DeviceRGB eq or or { /ColorSpace [/DeviceN [/_red_ /_green_ /_blue_] /DeviceRGB {}] def }if ColorSpace 0 get /CIEBasedDEFG eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }if currentdict 0 false AGMCORE_separateShading }if }if currentdict end exch }if pop dup /AGMCORE_ignoreshade known { begin /ColorSpace [/Separation (None) /DeviceGray {}] def currentdict end }if }def /shfill { AGMCORE_separateShadingDict dup /AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch dup /PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def Shading /AGMCORE_ignoreshade known currentdict end exch {pop <</PatternType 1/PaintProc{pop}/BBox[0 0 1 1]/XStep 1/YStep 1/PaintType 1/TilingType 3>>}if exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern }ifelse }def }if }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4 {4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ //Adobe_AGM_Core begin /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf end [/Separation 4 -1 roll /DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation (All) /DeviceGray {}] setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4 {4 index mul 4 1 roll} repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval {255 div} forall } bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index } bdf /n_color_components { base_colorspace_type dup /DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse }bdf level2{ /mo /moveto ldf /li /lineto ldf /cv /curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def level2 /setcolorspace AGMCORE_key_known not and{ /AGMCORE_&&&setcolorspace /setcolorspace ldf /AGMCORE_ReplaceMappedColor { dup type dup /arraytype eq exch /packedarraytype eq or { /AGMCORE_SpotAliasAry2 where { begin dup 0 get dup /Separation eq { pop dup length array copy dup dup 1 get current_spot_alias { dup map_alias { false set_spot_alias dup 1 exch setsepcolorspace true set_spot_alias begin /sep_colorspace_dict currentdict AGMCORE_gput pop pop pop [ /Separation Name CSA map_csa MappedCSA /sep_colorspace_proc load ] dup Name end }if }if map_reserved_ink_name 1 xpt }{ /DeviceN eq { dup length array copy dup dup 1 get [ exch { current_spot_alias{ dup map_alias{ /Name get exch pop }if }if map_reserved_ink_name } forall ] 1 xpt }if }ifelse end } if }if }def /setcolorspace { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /Indexed eq { AGMCORE_distilling { /PhotoshopDuotoneList where { pop false }{ true }ifelse }{ true }ifelse { aload pop 3 -1 roll AGMCORE_ReplaceMappedColor 3 1 roll 4 array astore }if }{ AGMCORE_ReplaceMappedColor }ifelse }if DeviceN_PS2_inRip_seps {AGMCORE_&&&setcolorspace} if }def }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /li{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1 [8 0 0 8 0 0] {<ffffffffffffffff>} image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /setcolorspace { /currentcolorspace exch AGMCORE_gput } def /currentcolorspace { /currentcolorspace AGMCORE_gget } def /setcolor_devicecolor { base_colorspace_type dup /DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup /DeviceGray ne{ dup /DeviceCMYK ne{ dup /DeviceRGB ne{ dup /Separation eq{ pop currentcolorspace 3 get exec currentcolorspace 2 get }{ dup /Indexed eq{ pop currentcolorspace 3 get dup type /stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err /AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor } def }ifelse /sop /setoverprint ldf /lw /setlinewidth ldf /lc /setlinecap ldf /lj /setlinejoin ldf /ml /setmiterlimit ldf /dsh /setdash ldf /sadj /setstrokeadjust ldf /gry /setgray ldf /rgb /setrgbcolor ldf /cmyk /setcmykcolor ldf /sep /setsepcolor ldf /devn /setdevicencolor ldf /idx /setindexedcolor ldf /colr /setcolor ldf /csacrd /set_csa_crd ldf /sepcs /setsepcolorspace ldf /devncs /setdevicencolorspace ldf /idxcs /setindexedcolorspace ldf /cp /closepath ldf /clp /clp_npth ldf /eclp /eoclp_npth ldf /f /fill ldf /ef /eofill ldf /@ /stroke ldf /nclp /npth_clp ldf /gset /graphic_setup ldf /gcln /graphic_cleanup ldf /AGMCORE_def_ht currenthalftone def /clonedict Adobe_AGM_Utils begin /clonedict load end def /clonearray Adobe_AGM_Utils begin /clonearray load end def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { bind }if def }forall /getrampcolor { /indx exch def 0 1 NumComp 1 sub { dup Samples exch get dup type /stringtype eq {indx get} if exch Scaling exch get aload pop 3 1 roll mul add } for ColorSpaceFamily /Separation eq {sep} { ColorSpaceFamily /DeviceN eq {devn} {setcolor}ifelse }ifelse } bdf /sssetbackground {aload pop setcolor} bdf /RadialShade { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /r2 xdf /c2y xdf /c2x xdf /r1 xdf /c1y xdf /c1x xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if c1x c2x eq { c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse } { /slope c2y c1y sub c2x c1x sub div def /theta slope 1 atan def c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if } ifelse gsave clippath c1x c1y translate theta rotate -90 rotate { pathbbox } stopped { 0 0 0 0 } if /yMax xdf /xMax xdf /yMin xdf /xMin xdf grestore xMax xMin eq yMax yMin eq or { grestore end } { /max { 2 copy gt { pop } {exch pop} ifelse } bdf /min { 2 copy lt { pop } {exch pop} ifelse } bdf rampdict begin 40 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave c1x c1y translate theta rotate -90 rotate /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def /c1y 0 def /c1x 0 def /c2x 0 def ext0 { 0 getrampcolor c2y r2 add r1 sub 0.0001 lt { c1x c1y r1 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2y r1 add r2 le { c1x c1y r1 0 360 arc fill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r1 neg def /p1y c1y def /p2x r1 def /p2y c1y def p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y p1x SS1 div neg def /SS2 90 theta sub dup sin exch cos div def /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y p2x SS2 div neg def r1 r2 gt { /L1maxX p1x yMin p1y sub SS1 div add def /L2maxX p2x yMin p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def } ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if c1x c2x sub dup mul c1y c2y sub dup mul add 0.5 exp 0 dtransform dup mul exch dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop /hires xdf hires mul /numpix xdf /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if /xInc c2x c1x sub numsteps div def /yInc c2y c1y sub numsteps div def /rInc r2 r1 sub numsteps div def /cx c1x def /cy c1y def /radius r1 def newpath xInc 0 eq yInc 0 eq rInc 0 eq and and { 0 getrampcolor cx cy radius 0 360 arc stroke NumSamples 1 sub getrampcolor cx cy radius 72 hires div add 0 360 arc 0 setlinewidth stroke } { 0 numsteps { dup subsampling { round cvi } if getrampcolor cx cy radius 0 360 arc /cx cx xInc add def /cy cy yInc add def /radius radius rInc add def cx cy radius 360 0 arcn eofill rampIndxInc add } repeat pop } ifelse ext1 { c2y r2 add r1 lt { c2x c2y r2 0 360 arc fill } { c2y r1 add r2 sub 0.0001 le { c2x c2y r2 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r2 neg def /p1y c2y def /p2x r2 def /p2y c2y def p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y c2y p1x SS1 div sub def /SS2 90 theta sub dup sin exch cos div def /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y c2y p2x SS2 div sub def r1 r2 lt { /L1maxX p1x yMax p1y sub SS1 div add def /L2maxX p2x yMax p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if grestore grestore end end end } ifelse } bdf /GenStrips { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /y2 xdf /x2 xdf /y1 xdf /x1 xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if x1 x2 eq { y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse } { /slope y2 y1 sub x2 x1 sub div def /theta slope 1 atan def x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if } ifelse gsave clippath x1 y1 translate theta rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { rampdict begin 20 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave x1 y1 translate theta rotate /xStart 0 def /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def /ySpan yMax yMin sub def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def xStart 0 transform xEnd 0 transform 3 -1 roll sub dup mul 3 1 roll sub dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop mul /numpix xdf numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if ext0 { 0 getrampcolor xMin xStart lt { xMin yMin xMin neg ySpan rectfill } if } if /xInc xEnd xStart sub numsteps div def /x xStart def 0 numsteps { dup subsampling { round cvi } if getrampcolor x yMin xInc ySpan rectfill /x x xInc add def rampIndxInc add } repeat pop ext1 { xMax xEnd gt { xEnd yMin xMax xEnd sub ySpan rectfill } if } if grestore grestore end end end } ifelse } bdf }def /page_trailer { end }def /doc_trailer{ }def /capture_currentpagedevice { //Adobe_AGM_Core/AGMCORE_currentpagedevice currentpagedevice ddf } def systemdict /findcolorrendering known{ /findcolorrendering systemdict /findcolorrendering get def }if systemdict /setcolorrendering known{ /setcolorrendering systemdict /setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { dup //Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA get_csa_by_name setcolorspace_opt set_crd end } def /map_csa { currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse {pop}{get_csa_by_name /MappedCSA xdf}ifelse } def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup /sep_tint exch AGMCORE_gput TintProc end } def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin Names length copy Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt } for TintProc end } def /sep_colorspace_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll } repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end } def /sep_colorspace_gray_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end } def /sep_proc_name { dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ pop [/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse } def /setsepcolorspace { current_spot_alias{ dup begin Name map_alias{ exch pop }if end }if dup /sep_colorspace_dict exch AGMCORE_gput begin CSA map_csa /AGMCORE_sep_special Name dup () eq exch (All) eq or store AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx ] setcolorspace_opt /TintProc { 255 mul round cvi setcolor }bdf }{ MappedCSA 0 get /DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc [ Components aload pop Name findcmykcustomcolor /exch cvx /setcustomcolor cvx ] cvx bdf }{ AGMCORE_host_sep Name (All) eq and{ /TintProc { 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and AGMCORE_host_sep or Name () eq and{ /TintProc [ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ cvx /setcmykcolor cvx }{ cvx /setgray cvx }ifelse ] cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc [ /dup cvx MappedCSA sep_proc_name cvx exch 0 get /DeviceGray eq{ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx }if /Name cvx /findcmykcustomcolor cvx /exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep /Name cvx /AGMCORE_IsSeparationAProcessColor load /exec cvx /not cvx /and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 ] cvx /if cvx /setcustomcolor cvx ] cvx bdf }{ /TintProc {setcolor} bdf [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd setsepcolor end } def /additive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 0 1 numarrays 1 sub { 1 exch add /index cvx c1 /get cvx /mul cvx }for numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /subtractive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 1 0 1 numarrays 1 sub { 1 3 3 -1 roll add /index cvx c1 /get cvx /sub cvx /mul cvx }for /sub cvx numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /exec_tint_transform { /TintProc [ /TintTransform cvx /setcolor cvx ] cvx bdf MappedCSA setcolorspace_opt } bdf /devn_makecustomcolor { 2 dict begin /names_index xdf /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor Names length {pop} repeat end } bdf /setdevicencolorspace { dup /AliasedColorants known {false}{true}ifelse current_spot_alias and { 7 dict begin /names_index 0 def dup /names_len exch /Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def dup /Names get { dup map_alias { exch pop dup /ColorLookup known { dup begin new_LookupTables names_index ColorLookup put end }{ dup /Components known { dup begin new_LookupTables names_index Components put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse new_names names_index 3 -1 roll /Name get put /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put dup /LookupTables known { dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse /names_index names_index 1 add def } forall alias_cnt 0 gt { /AliasedColorants true def /lut_entry_len new_LookupTables 0 get dup length 256 ge {0 get length}{length}ifelse def 0 1 names_len 1 sub { /names_index xdf new_LookupTables names_index get dup length 256 ge {0 get length}{length}ifelse lut_entry_len ne { /AliasedColorants false def exit } { new_LookupTables names_index get 0 get null eq { dup /Names get names_index get /name xdf name (Cyan) eq name (Magenta) eq name (Yellow) eq name (Black) eq or or or not { /AliasedColorants false def exit } if } if } ifelse } for lut_entry_len 1 eq { /AliasedColorants false def } if AliasedColorants { dup begin /Names new_names def /LookupTables new_LookupTables def /AliasedColorants true def /NComponents lut_entry_len def /TintMethod NComponents 4 eq {/Subtractive}{/Additive}ifelse def /MappedCSA TintMethod /Additive eq {/DeviceRGB}{/DeviceCMYK}ifelse def currentdict /TTTablesIdx known not { /TTTablesIdx -1 def } if end } if }if end } if dup /devicen_colorspace_dict exch AGMCORE_gput begin currentdict /AliasedColorants known { AliasedColorants }{ false } ifelse dup not { CSA map_csa } if /TintTransform load type /nulltype eq or { /TintTransform [ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def dup LookupTables exch get dup 0 get null eq { 1 index Names exch get dup (Cyan) eq { pop exch LookupTables length exch sub /index cvx 0 0 0 } { dup (Magenta) eq { pop exch LookupTables length exch sub /index cvx 0 /exch cvx 0 0 } { (Yellow) eq { exch LookupTables length exch sub /index cvx 0 0 3 -1 /roll cvx 0 } { exch LookupTables length exch sub /index cvx 0 0 0 4 -1 /roll cvx } ifelse } ifelse } ifelse 5 -1 /roll cvx /astore cvx } { dup length 1 sub LookupTables length 4 -1 roll sub 1 add /index cvx /mul cvx /round cvx /cvi cvx /get cvx } ifelse Names length TTTablesIdx add 1 add 1 /roll cvx } for Names length [/pop cvx] cvx /repeat cvx NComponents Names length TintMethod /Subtractive eq { subtractive_blend } { additive_blend } ifelse ] cvx bdf } if AGMCORE_host_sep { Names convert_to_process { exec_tint_transform } { currentdict /AliasedColorants known { AliasedColorants not }{ false } ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def AvoidAliasedColorants { /currentspotalias current_spot_alias def false set_spot_alias } if Names { AGMCORE_is_cmyk_sep { dup (Cyan) eq AGMCORE_cyan_plate and exch dup (Magenta) eq AGMCORE_magenta_plate and exch dup (Yellow) eq AGMCORE_yellow_plate and exch (Black) eq AGMCORE_black_plate and or or or { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def } if painted? {exit} if }{ 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def exit } if } ifelse /names_index names_index 1 add def } forall AvoidAliasedColorants { currentspotalias set_spot_alias } if painted? { /devicen_colorspace_dict AGMCORE_gget /names_index names_index put }{ /devicen_colorspace_dict AGMCORE_gget /TintProc [ names_len [/pop cvx] cvx /repeat cvx 1 /setseparationgray cvx 0 0 0 0 /setcmykcolor cvx ] cvx ddf } ifelse end } ifelse } { AGMCORE_in_rip_sep { Names convert_to_process not }{ level3 } ifelse { [/DeviceN Names MappedCSA /TintTransform load] setcolorspace_opt /TintProc level3 not AGMCORE_in_rip_sep and { [ Names /length cvx [/pop cvx] cvx /repeat cvx ] cvx bdf }{ {setcolor} bdf } ifelse }{ exec_tint_transform } ifelse } ifelse set_crd /AliasedColorants false def end } def /setindexedcolorspace { dup /indexed_colorspace_dict exch AGMCORE_gput begin currentdict /CSDBase known { CSDBase /CSD get_res begin currentdict /Names known { currentdict devncs }{ 1 currentdict sepcs } ifelse AGMCORE_host_sep{ 4 dict begin /compCnt /Names where {pop Names length}{1}ifelse def /NewLookup HiVal 1 add string def 0 1 HiVal { /tableIndex xdf Lookup dup type /stringtype eq { compCnt tableIndex map_index }{ exec } ifelse /Names where { pop setdevicencolor }{ setsepcolor } ifelse currentgray tableIndex exch HiVal mul cvi NewLookup 3 1 roll put } for [/Indexed currentcolorspace HiVal NewLookup] setcolorspace_opt end }{ level3 { currentdict /Names known { [/Indexed [/DeviceN Names MappedCSA /TintTransform load] HiVal Lookup] setcolorspace_opt }{ [/Indexed [/Separation Name MappedCSA sep_proc_name load] HiVal Lookup] setcolorspace_opt } ifelse }{ [/Indexed MappedCSA HiVal [ currentdict /Names known { Lookup dup type /stringtype eq {/exch cvx CSDBase /CSD get_res /Names get length dup /mul cvx exch /getinterval cvx {255 div} /forall cvx} {/exec cvx}ifelse /TintTransform load /exec cvx }{ Lookup dup type /stringtype eq {/exch cvx /get cvx 255 /div cvx} {/exec cvx}ifelse CSDBase /CSD get_res /MappedCSA get sep_proc_name exch pop /load cvx /exec cvx } ifelse ]cvx ]setcolorspace_opt }ifelse } ifelse end set_crd } { CSA map_csa AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ pop [/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval {} forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end } bind }{ Lookup }ifelse }ifelse ] setcolorspace_opt set_crd }ifelse }ifelse end }def /setindexedcolor { AGMCORE_host_sep { /indexed_colorspace_dict AGMCORE_gget dup /CSDBase known { begin CSDBase /CSD get_res begin currentdict /Names known{ map_indexed_devn devn } { Lookup 1 3 -1 roll map_index sep }ifelse end end }{ /Lookup get 4 3 -1 roll map_index setcmykcolor } ifelse }{ level3 not AGMCORE_in_rip_sep and /indexed_colorspace_dict AGMCORE_gget /CSDBase known and { /indexed_colorspace_dict AGMCORE_gget /CSDBase get /CSD get_res begin map_indexed_devn devn end } { setcolor } ifelse }ifelse } def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray /Decode [0 1] def /DataSource <FF> def /MultipleDataSources false def /BitsPerComponent 8 def currentdict end systemdict /image get exec grestore }if consumeimagedata }def /add_res { dup /CSD eq { pop //Adobe_AGM_Core begin /AGMCORE_CSD_cache load 3 1 roll put end }{ defineresource pop } ifelse }def /del_res { { aload pop exch dup /CSD eq { pop { //Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef }forall }{ exch { 1 index undefineresource }forall pop } ifelse } forall }def /get_res { dup /CSD eq { pop dup type dup /nametype eq exch /stringtype eq or { AGMCORE_CSD_cache exch get } if }{ findresource } ifelse }def /get_csa_by_name { dup type dup /nametype eq exch /stringtype eq or{ /CSA get_res } if }def /pattern_buf_init { /count get 0 0 put } def /pattern_buf_next { dup /count get dup 0 get dup 3 1 roll 1 add 0 xpt get } def /cachepattern_compress { 5 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def /string_size 16000 def /readbuffer string_size string def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal /LZWFilter { exch dup length 0 eq { pop }{ patarray dup length 1 sub 3 -1 roll put } ifelse {string_size}{0}ifelse string } /LZWEncode filter def { ReadFilter readbuffer readstring exch LZWFilter exch writestring not {exit} if } loop LZWFilter closefile patarray end }def /cachepattern { 2 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal { ReadFilter 16000 string readstring exch patarray dup length 1 sub 3 -1 roll put not {exit} if } loop patarray dup dup length 1 sub () put end }def /wrap_paintproc { statusdict /currentfilenameextend known{ clonedict begin /OldPaintProc /PaintProc load def /PaintProc { mark exch dup /OldPaintProc get stopped {closefile restore end} if cleartomark } def end } {pop} ifelse } def /make_pattern { exch clonedict exch dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix 1 index begin BBox 0 get XStep div cvi XStep mul /xshift exch neg def BBox 1 get YStep div cvi YStep mul /yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def [ xshift yshift /translate load null /exec load ] dup 3 /PaintProc load put cvx /PaintProc exch def end 1 index dup /ID get exch /Pattern add_res gsave 0 setgray makepattern grestore }def /set_pattern { dup /PatternType get 1 eq{ dup /PaintType get 1 eq{ currentoverprint sop [/DeviceGray] setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{ pop }{ setcolorspace }ifelse }def /updatecolorrendering { currentcolorrendering/RenderingIntent known{ currentcolorrendering/RenderingIntent get }{null}ifelse Intent ne { Intent /ColorRendering {findresource} stopped { pop pop systemdict /findcolorrendering known { Intent findcolorrendering pop /ColorRendering findresource true } {false} ifelse } {true} ifelse { dup begin currentdict /TransformPQR known { currentdict /TransformPQR get aload pop 3 {{} eq 3 1 roll} repeat or or } {true} ifelse currentdict /MatrixPQR known { currentdict /MatrixPQR get aload pop 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq and and and and and and and and } {true} ifelse end or { clonedict begin /TransformPQR [ {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add} bind {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add} bind {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add} bind ] def /MatrixPQR [ 0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] def /RangePQR [-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392] def currentdict end } if setcolorrendering_opt } if }if } def /set_crd { AGMCORE_host_sep not level2 and{ currentdict /ColorRendering known{ ColorRendering /ColorRendering {findresource} stopped not {setcolorrendering_opt} if }{ currentdict/Intent known{ updatecolorrendering }if }ifelse currentcolorspace dup type /arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ clonedict begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /cpaint_gcomp { convert_to_process //Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { (%end_cpaint_gcomp) flushinput }if }def /cpaint_gsep { //Adobe_AGM_Core/AGMCORE_ConvertToProcess get { (%end_cpaint_gsep) flushinput }if }def /cpaint_gend { newpath }def /set_spot_alias_ary { dup inherit_aliases //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf }def /set_spot_normalization_ary { dup inherit_aliases dup length /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add} if array //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf /AGMCORE_SpotAliasAry where{ pop AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval AGMCORE_SpotAliasAry length }{0} ifelse AGMCORE_SpotAliasAry2 3 1 roll exch putinterval true set_spot_alias }def /inherit_aliases { {dup /Name get map_alias {/CSD put}{pop} ifelse} forall }def /set_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop }ifelse }def /current_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias get }{ false }ifelse }def /map_alias { /AGMCORE_SpotAliasAry2 where{ begin /AGMCORE_name xdf false AGMCORE_SpotAliasAry2{ dup/Name get AGMCORE_name eq{ /CSD get /CSD get_res exch pop true exit }{ pop }ifelse }forall end }{ pop false }ifelse }bdf /spot_alias { true set_spot_alias /AGMCORE_&setcustomcolor AGMCORE_key_known not { //Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put } if /customcolor_tint 1 AGMCORE_gput //Adobe_AGM_Core begin /setcustomcolor { currentdict/TintProc known currentdict/CSA known and 3 1 roll //Adobe_AGM_Core begin dup /customcolor_tint exch AGMCORE_gput 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not current_spot_alias and{1 index 4 get map_alias}{false}ifelse { false set_spot_alias 4 -1 roll{ exch pop /sep_tint AGMCORE_gget exch }if mark 3 1 roll setsepcolorspace counttomark 0 ne{ setsepcolor }if pop pop true set_spot_alias }{ AGMCORE_&setcustomcolor pop }ifelse end }bdf end }def /begin_feature { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if }def /end_feature { 2 dict begin /spd /setpagedevice load def /setpagedevice { get_gstate spd set_gstate } def stopped{$error/newerror false put}if end count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if }def /set_negative { //Adobe_AGM_Core begin /AGMCORE_inverting exch def level2{ currentpagedevice/NegativePrint known{ currentpagedevice/NegativePrint get //Adobe_AGM_Core/AGMCORE_inverting get ne{ true begin_feature true{ << /NegativePrint //Adobe_AGM_Core/AGMCORE_inverting get >> setpagedevice }end_feature }if /AGMCORE_inverting false def }if }if AGMCORE_inverting{ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse /AGMIRS_&fill where {pop AGMIRS_&fill}{fill} ifelse grestore }if end }def /lw_save_restore_override { /md where { pop md begin initializepage /initializepage{}def /pmSVsetup{} def /endp{}def /pse{}def /psb{}def /orig_showpage where {pop} {/orig_showpage /showpage load def} ifelse /showpage {orig_showpage gR} def end }if }def /pscript_showpage_override { /NTPSOct95 where { begin showpage save /showpage /restore load def /restore {exch pop}def end }if }def /driver_media_override { /md where { pop md /initializepage known { md /initializepage {} put } if md /rC known { md /rC {4{pop}repeat} put } if }if /mysetup where { /mysetup [1 0 0 1 0 0] put }if Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put level2 {Adobe_AGM_Core /AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if }def /driver_check_media_override { /PrepsDict where {pop} { Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne Adobe_AGM_Core /AGMCORE_Default_PageSize get type /arraytype eq { Adobe_AGM_Core /AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and Adobe_AGM_Core /AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and }if { Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix }if }ifelse }def AGMCORE_err_strings begin /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def end /set_def_ht { AGMCORE_def_ht sethalftone } def end systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_CoolType_Core 2.25 0 %%Copyright: Copyright 1997-2005 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.25 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict /Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined { /Adobe_CoolType_Core userdict /Adobe_CoolType_Core get def } if userdict /Adobe_CoolType_Core 60 dict dup begin put /Adobe_CoolType_Version 2.25 def /Level2? systemdict /languagelevel known dup { pop systemdict /languagelevel get 2 ge } if def Level2? not { /currentglobal false def /setglobal /pop load def /gcheck { pop false } bind def /currentpacking false def /setpacking /pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def end setglobal /@_SaveStackLevels { Adobe_CoolType_Data begin /@vmState currentglobal def false setglobal @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup /args 7 index 5 add array put put get } { get dup /args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch /args exch put } { pop } ifelse } ifelse begin count 1 sub 1 index lt { pop count } if dup /argCount exch def dup 0 gt { args exch 0 exch getinterval astore pop } { pop } ifelse count /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def @vmState setglobal end } bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt { { pop } repeat } { pop } ifelse args 0 argCount getinterval {} forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt { { end } repeat } { pop } ifelse } bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end } bind def /@Raise { exch cvx exch errordict exch get exec stop } bind def /@ReRaise { cvx $error /errorname get errordict exch get exec stop } bind def /@Stopped { 0 @#Stopped } bind def /@#Stopped { @_SaveStackLevels stopped { @_RestoreStackLevels true } { @_PopStackLevels false } ifelse } bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get begin args exch argCount 1 sub exch sub get end end } bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup /@shouldNotDisappearDictValue true def Adobe_CoolType_Data exch /@shouldNotDisappearDict exch put begin count @_SaveStackLevels { (*) { pop stop } 128 string /Category resourceforall } stopped pop @_RestoreStackLevels currentdict Adobe_CoolType_Data /@shouldNotDisappearDict get ne dup { /@shouldNotDisappearDictValue known { { end currentdict 1 index eq { pop exit } if } loop } if } if end } { false } ifelse def true setglobal /CTHasResourceStatusBug Level2? { mark { /steveamerige /Category resourcestatus } stopped { cleartomark true } { cleartomark currentglobal not } ifelse } { false } ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse end } bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad /ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup /CMap CTHasResourceStatusBug { CTResourceStatus } { resourcestatus } ifelse { pop dup 0 eq exch 1 eq or { dup /CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug { exit } { stop } ifelse } ifelse } { pop } ifelse } 128 string /CMap resourceforall } stopped { cleartomark } stopped pop setglobal } if } if } bind def /doc_setup { Adobe_CoolType_Core begin CTWorkAroundBugs /mov /moveto load def /nfnt /newencodedfont load def /mfnt /makefont load def /sfnt /setfont load def /ufnt /undefinefont load def /chp /charpath load def /awsh /awidthshow load def /wsh /widthshow load def /ash /ashow load def /sh /show load def end currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end setglobal } bind def /doc_trailer { currentdict Adobe_CoolType_Core eq { end } if } bind def /page_setup { Adobe_CoolType_Core begin } bind def /page_trailer { end } bind def /unload { systemdict /languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known { undef } { pop pop } ifelse } if } if } bind def /ndf { 1 index where { pop pop pop } { dup xcheck { bind } if def } ifelse } def /findfont systemdict begin userdict begin /globaldict where { /globaldict get begin } if dup where pop exch get /globaldict where { pop end } if end end Adobe_CoolType_Core_Defined { /systemfindfont exch def } { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont { pop } ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq { 0 } { dup length } ifelse 2 index length add 1 add dict begin exch { 1 index /FID eq { pop pop } { def } ifelse } forall dup null eq { pop } { { def } forall } ifelse currentdict end exch setglobal } bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal } bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } { FontDirectory 3 index known { FontDirectory 3 index get /FontReferenced known } { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } ifelse } ifelse dup { 3 index findfont /FontReferenced get 2 index dup type /nametype eq {findfont} if ne { pop false } if } if { pop 1 index findfont /Encoding get exch 0 1 255 { 2 copy get 3 index 3 1 roll put } for pop pop pop } { dup type /nametype eq { findfont } if dup dup maxlength 2 add dict begin exch { 1 index /FID ne {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type /stringtype eq { cvn } if def dup currentdict end definefont def } ifelse } bind def /SetSubstituteStrategy { $SubstituteFont begin dup type /dicttype ne { 0 dict } if currentdict /$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin { def } forall { def } forall currentdict dup /$Init known { dup /$Init get exec } if end /$Strategy exch def } { pop pop pop } ifelse } { pop pop } ifelse end } bind def /scff { $SubstituteFont begin dup type /stringtype eq { dup length exch } { null } ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse def end { findfont } @Stopped { dup length 8 add string exch 1 index 0 (BadFont:) putinterval 1 index exch 8 exch dup length string cvs putinterval cvn { findfont } @Stopped { pop /Courier findfont } if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end } bind def /isWidthsOnlyFont { dup /WidthsOnly known { pop pop true } { dup /FDepVector known { /FDepVector get { isWidthsOnlyFont dup { exit } if } forall } { dup /FDArray known { /FDArray get { isWidthsOnlyFont dup { exit } if } forall } { pop } ifelse } ifelse } ifelse } bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 4 index def /$doSmartSub false def end 3 index currentglobal false setglobal exch /CompatibleFonts /ProcSet resourcestatus { pop pop /CompatibleFonts /ProcSet findresource begin dup /CompatibleFont currentexception 1 index /CompatibleFont true setexception 1 index /Font resourcestatus { pop pop 3 2 roll setglobal end exch dup findfont /CompatibleFonts /ProcSet findresource begin 3 1 roll exch /CompatibleFont exch setexception end } { 3 2 roll setglobal 1 index exch /CompatibleFont exch setexception end findfont $SubstituteFont /$substituteFound true put } ifelse } { exch setglobal findfont } ifelse $SubstituteFont begin $substituteFound { false (%%[Using embedded font ) print 5 index ?str1 cvs print ( to avoid the font substitution problem noted earlier.]%%\n) print } { dup /FontName known { dup /FontName get $fontname eq 1 index /DistillerFauxFont known not and /currentdistillerparams where { pop false 2 index isWidthsOnlyFont not and } if } { false } ifelse } ifelse exch pop /$doSmartSub true def end { exch pop exch pop exch 2 dict dup /Found 3 index put exch findfont exch } { exch exec exch dup findfont dup /FontType get 3 eq { exch ?str1 cvs dup length 1 sub -1 0 { exch dup 2 index get 42 eq { exch 0 exch getinterval cvn 4 1 roll 3 2 roll pop exit } {exch pop} ifelse }for } { exch pop } ifelse 2 dict dup /Downloaded 6 5 roll put } ifelse dup /FontName 4 index put copyfont definefont pop } bind def /?str2 256 string def /?add { 1 index type /integertype eq { exch true 4 2 } { false 3 1 } ifelse roll 1 index findfont dup /Widths known { Adobe_CoolType_Data /AddWidths? true put gsave dup 1000 scalefont setfont } if /Downloaded known { exec exch { exch ?str2 cvs exch findfont /Downloaded get 1 dict begin /Downloaded 1 index def ?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1 index add ?str1 2 index (*) putinterval ?str1 0 2 index getinterval cvn findfont ?str1 3 index (+) putinterval 2 dict dup /FontName ?str1 0 6 index getinterval cvn put dup /Downloaded Downloaded put end copyfont dup /FontName get exch definefont pop pop pop } { pop } ifelse } { pop exch { findfont dup /Found get dup length exch ?str1 cvs pop ?str1 1 index (+) putinterval ?str1 1 index 1 add 4 index ?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add getinterval cvn 1 dict exch 1 index exch /FontName exch put copyfont dup /FontName get exch definefont pop } { pop } ifelse } ifelse Adobe_CoolType_Data /AddWidths? get { grestore Adobe_CoolType_Data /AddWidths? false put } if } bind def /?sh { currentfont /Downloaded known { exch } if pop } bind def /?chp { currentfont /Downloaded known { pop } { false chp } ifelse } bind def /?mv { currentfont /Downloaded known { moveto pop pop } { pop pop moveto } ifelse } bind def setpacking userdict /$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known { get } { pop pop { pop /Courier } bind } ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams /CannotEmbedFontPolicy 2 copy known { get /Error eq } { pop pop false } ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup /WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type /stringtype eq { cvn } if def /FontType 3 def /FontMatrix [ .001 0 0 .001 0 0 ] def /Encoding 256 array dup 0 1 255 { /.notdef put dup } for pop def /FontBBox [ 0 0 0 0 ] def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth /y exch def /x exch def x y setcharwidth $SubstituteFont /$Strategy get /$Underprint get exec 0 0 moveto cc show x y moveto end end } bind def currentdict end exch setglobal } bind def /$GetaTint 2 dict dup begin /$BuildFont { dup /WMode known { dup /WMode get } { 0 } ifelse /$WMode exch def $fontname exch dup /FontName known { dup /FontName get dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse exch Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index /FontName get known { pop Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index get null copyfont } { $deepcopyfont } ifelse exch 1 index exch /FontBasedOn exch put dup /FontName $fontname dup type /stringtype eq { cvn } if put definefont Adobe_CoolType_Data /InVMDeepCopiedFonts get begin dup /FontBasedOn get 1 index def end } bind def /$Underprint { gsave x abs y abs gt { /y 1000 def } { /x -1000 def 500 120 translate } ifelse Level2? { [ /Separation (All) /DeviceCMYK { 0 0 0 1 pop } ] setcolorspace } { 0 setgray } ifelse 10 setlinewidth x .8 mul [ 7 3 ] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? { .2 setcolor } { .8 setgray } ifelse fill grestore stroke } forall pop grestore } bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict /FontName known { FontName dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse def /FontName $fontname dup type /stringtype eq { cvn } if def /currentdistillerparams where { pop } { /FontInfo currentdict /FontInfo known { FontInfo null copyfont } { 2 dict } ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [ 1 0 ItalicAngle dup sin exch cos div 1 0 0 ] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal } bind def end def /$None 1 dict dup begin /$BuildFont {} bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type /stringtype eq { cvn } if dup /$fontname exch def $sname null eq { $str cvs dup length $slen sub $slen getinterval } { pop $sname } ifelse $fontpat dup 0 (fonts/*) putinterval exch 7 exch putinterval /$match false def $SubstituteFont /$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval { /$match exch def exit } $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont /$dstack get { exch { 1 index eq { pop false } { true } ifelse } { begin false } ifelse } forall pop } if cleartomark /$slen 0 def $match false ne { $match (fonts/) anchorsearch pop pop cvn } { /Courier } ifelse } bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [ /Ryumin-Light /HeiseiMin-W3 /GothicBBB-Medium /HeiseiKakuGo-W5 /HeiseiMaruGo-W4 /Jun101-Light ] def /Korea1 [ /HYSMyeongJo-Medium /HYGoThic-Medium ] def /GB1 [ /STSong-Light /STHeiti-Regular ] def /CNS1 [ /MKai-Medium /MHei-Medium ] def end def end def /$cmapname null def /$deepcopyfont { dup /FontType get 0 eq { 1 dict dup /FontName /copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup /FontName /copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } { $Strategies /$Type3Underprint get exec } ifelse } bind def /$buildfontname { dup /CIDFont findresource /CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index (-) putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy (-) putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch { pop pop 3 2 roll putinterval cvn /$cmapname exch def } { pop pop pop pop pop } ifelse length $str 1 index (-) putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn } bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known { get } { pop pop [] } ifelse } { pop pop [] } ifelse false exch { dup /CIDFont resourcestatus { pop pop save 1 index /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get } { false } ifelse exch pop exch restore { pop } { exch pop true exit } ifelse } { pop } ifelse } forall { $str cvs $buildfontname } { false (*) { save exch dup /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get not } { true } ifelse exch /CIDSystemInfo get dup /Registry get Registry eq exch /Ordering get Ordering eq and and { exch restore exch pop true exit } { pop restore } ifelse } $str /CIDFont resourceforall { $buildfontname } { $fontname $findfontByEnum } ifelse } ifelse } bind def end end currentdict /$error known currentdict /languagelevel known and dup { pop $error /SubstituteFont known } if dup { $error } { Adobe_CoolType_Core } ifelse begin { /SubstituteFont /CMap /Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq { dup $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse Adobe_CoolType_Data /InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } { FontDirectory 1 index known { exch pop true exit } { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } ifelse } ifelse } forall } { pop pop false } ifelse { exch pop exch pop } { dup /CMap resourcestatus { pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS } { 128 string cvs dup (-) search { 3 1 roll search { 3 1 roll pop { dup cvi } stopped { pop pop pop pop pop $findfontByEnum } { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup /CMap resourcestatus { pop pop 4 1 roll pop pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS true exit } { pop } ifelse } for dup type /booleantype eq { pop } { pop pop pop $findfontByEnum } ifelse } ifelse } { pop pop pop $findfontByEnum } ifelse } { pop pop $findfontByEnum } ifelse } ifelse } ifelse } { //SubstituteFont exec } ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $findfontByEnum } { //SubstituteFont exec } ifelse end } } ifelse bind readonly def Adobe_CoolType_Core /scfindfont /systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup /FontName known { dup /FontName get dup 3 index ne } { /noname true } ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def /$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin { 1 index /FID eq { pop pop } { def } ifelse } forall currentdict end definefont dup /FontName known { dup /FontName get } { null } ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using ) print dup /FontName known { dup /FontName get } { (unspecified font) } ifelse $str cvs print (.\n) print } if } { exch pop } ifelse } { exch pop } ifelse end } bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core /findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type /stringtype ne { $str cvs } if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne { dup $inVMIndex $AddInVMFont } if $doSmartSub { currentdict /$Strategy known { $Strategy /$BuildFont get exec } if } if } if end } bind put } if } if end /$AddInVMFont { exch /FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data /InVMFontsByCMap get exch $DictAdd } { pop pop pop } ifelse } bind def /$DictAdd { 2 copy known not { 2 copy 4 index length dict put } if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get { forall } def 2 copy currentdict put end } { pop } ifelse } if get begin { def } forall end } bind def end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.21 0 %%Copyright: Copyright 1987-2005 Adobe Systems Incorporated. %%Version: 1.21 0 systemdict /languagelevel known dup { currentglobal false setglobal } { false } ifelse exch userdict /Adobe_CoolType_Utility 2 copy known { 2 copy get dup maxlength 27 add dict copy } { 27 dict } ifelse put Adobe_CoolType_Utility begin /@eexecStartData <BAB431EA07F209EB8C4348311481D9D3F76E3D15246555577D87BC510ED54E 118C39697FA9F6DB58128E60EB8A12FA24D7CDD2FA94D221FA9EC8DA3E5E6A1C 4ACECC8C2D39C54E7C946031DD156C3A6B4A09AD29E1867A> def /@recognizeCIDFont null def /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch /eCCRun known not ct_Level2? and or def ct_Level2? { globaldict begin currentglobal true setglobal } if /ct_AddStdCIDMap ct_Level2? { { mark Adobe_CoolType_Utility /@recognizeCIDFont currentdict put { ((Hex) 57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77) 0 () /SubFileDecode filter cvx exec } stopped { cleartomark Adobe_CoolType_Utility /@recognizeCIDFont get countdictstack dup array dictstack exch 1 sub -1 0 { 2 copy get 3 index eq { 1 index length exch sub 1 sub { end } repeat exit } { pop } ifelse } for pop pop Adobe_CoolType_Utility /@eexecStartData get eexec } { cleartomark } ifelse } } { { Adobe_CoolType_Utility /@eexecStartData get eexec } } ifelse bind def userdict /cid_extensions known dup { cid_extensions /cid_UpdateDB known and } if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type /stringtype eq { exch cvn exch } if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq { pop pop cid_UpdateDB } { exch 1 index /Created get eq { exch pop exch pop } { pop cid_UpdateDB } ifelse } ifelse } { pop cid_UpdateDB } ifelse } { cid_UpdateDB } ifelse end } bind def end } if ct_Level2? { end setglobal } if /ct_UseNativeCapability? systemdict /composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring () def /usewidths? true def end def ct_Level2? { setglobal } { pop } ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict /languagelevel known { pop /CIDFont findresource /GlyphDirectory get } { 1 index /CIDFont findresource /GlyphDirectory get dup type /dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + } def /+ { systemdict /languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } { 1 dict begin } ifelse /$ exch def systemdict /languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ? { $ begin } if } def /? { $ type /dicttype eq } def /| { userdict /Adobe_CoolType_Data known { Adobe_CoolType_Data /AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data /CC 3 index put ? { def } { $ 3 1 roll put } ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont /Widths get exch CC exch put } { ? { def } { $ 3 1 roll put } ifelse } ifelse end end } { ? { def } { $ 3 1 roll put } ifelse } ifelse } { ? { def } { $ 3 1 roll put } ifelse } ifelse } def /! { ? { end } if systemdict /languagelevel known { gvm setglobal } if end } def /: { string currentfile exch readstring pop } executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx [.001 0 0 .001 0 0] def /ct_1000Mtx [1000 0 0 1000 0 0] def /ct_raise {exch cvx exch errordict exch get exec stop} bind def /ct_reraise { cvx $error /errorname get (Error: ) print dup ( ) cvs print errordict exch get exec stop } bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop } bind def /ct_GetInterval { Adobe_CoolType_Utility /ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt { dup string /dst_string exch def } if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add /dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add /dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt { arrayIndex get } { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end } bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal { /unknowninstancename /Category resourcestatus } stopped { cleartomark setglobal true } { cleartomark currentglobal not exch setglobal } ifelse { { mark 3 1 roll /Category findresource begin ct_Vars /vm currentglobal put ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse ct_Vars /vm get setglobal end } } { { resourcestatus } } ifelse bind def /CIDFont /Category ct_resourcestatus { pop pop } { currentglobal true setglobal /Generic /Category findresource dup length dict copy dup /InstanceType /dicttype put /CIDFont exch /Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /CMapName /Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 1 begincidrange <0000> <FFFF> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } { pop pop /defineresource /undefined ct_raise } ifelse } bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known { get 3 1 roll pop pop} { pop pop /findresource /undefinedresource ct_raise } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /ct_resourcestatus /resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup (Binary) eq { pop null currentfile ct_Level2? { { cid_BYTE_COUNT () /SubFileDecode filter } stopped { pop pop pop } if } if /readstring load exit } if dup (Hex) eq { pop currentfile ct_Level2? { { null exch /ASCIIHexDecode filter /readstring } stopped { pop exch pop (>) exch /readhexstring } if } { (>) exch /readhexstring } ifelse load exit } if /StartData /typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch /GlyphData exch put 2 index null eq { pop pop pop } { pop /readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse } bind def /StartData { mark { currentdict dup /FDArray get 0 get /FontMatrix get 0 get 0.001 eq { dup /CDevProc known not { /CDevProc 1183615869 internaldict /stdCDevProc 2 copy known { get } { pop pop { pop pop pop pop pop 0 -1000 7 index 2 div 880 } } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp /cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul } def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup /cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup /SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup /SubrMapOffset undef dup /SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } { pop } ifelse } forall } if cleartomark pop pop end CIDFontName currentdict /CIDFont defineresource pop end end } stopped { cleartomark /StartData ct_reraise } if } bind def currentdict end def /ct_saveCIDInit { /CIDInit /ProcSet ct_resourcestatus { true } { /CIDInitC /ProcSet ct_resourcestatus } ifelse { pop pop /CIDInit /ProcSet findresource ct_UseNativeCapability? { pop null } { /CIDInit ct_CIDInit /ProcSet defineresource pop } ifelse } { /CIDInit ct_CIDInit /ProcSet defineresource pop null } ifelse ct_Vars exch /ct_oldCIDInit exch put } bind def /ct_restoreCIDInit { ct_Vars /ct_oldCIDInit get dup null ne { /CIDInit exch /ProcSet defineresource pop } { pop } ifelse } bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility /ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge { pop 0 } if /cid exch def { GlyphDirectory cid 2 copy known { get } { pop pop nullstring } ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne { 0 FDBytes ct_cvnsi } { pop 0 } ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq { /charstring nullstring def exit } if /cid 0 def } ifelse } loop } def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto } def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont /Widths get cid 2 copy known { get exch pop aload pop } { pop pop stringwidth } ifelse } { stringwidth } ifelse setcharwidth 0 0 moveto } ifelse } def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known { get } { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup /FontMatrix 2 copy known { get } { pop pop ct_defaultFontMtx } ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont /Widths get def /CharStrings 1 dict dup /.notdef <d841272cf18f54fc13> dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup /CharStrings get 1 index /Encoding get ct_dfCharCode get charstring put rootfont /WMode 2 copy known { get } { pop pop 0 } ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } { ct_str1 show } ifelse } def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup /FontMatrix get dup ct_defaultFontMtx ct_matrixeq not { ct_1000Mtx matrix concatmatrix concat } { pop } ifelse /Private get Adobe_CoolType_Utility /ct_Level2? get not { ct_dfDict /Private 3 -1 roll { put } 1183615869 internaldict /superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility /ct_Level2? get { 1 index } { 3 index /Private get mark 6 1 roll } ifelse dup /RunInt known { /RunInt get } { pop /CCRun } ifelse get exec Adobe_CoolType_Utility /ct_Level2? get not { cleartomark } if } bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility /ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped { stop } if end end end end } bind def /BaseFontNameStr (BF00) def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /BuildChar /ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString /ct_Type3ShowCharString load def /ct_dfSetCacheProc /ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup /lenIV 4 put def /CharStrings 1 dict dup /.notdef <d841272cf18f54fc13> put def /PaintType 0 def /ct_ShowCharString /ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not { exit } if } for exch pop exch pop } bind def /ct_makeocf { 15 dict begin exch /WMode exch def exch /FontName exch def /FontType 0 def /FMapType 2 def dup /FontMatrix known { dup /FontMatrix get /FontMatrix exch def } { /FontMatrix matrix def } ifelse /bfCount 1 index /CIDCount get 256 idiv 1 add dup 256 gt { pop 256} if def /Encoding 256 array 0 1 bfCount 1 sub { 2 copy dup put pop } for bfCount 1 255 { 2 copy bfCount put pop } for def /FDepVector bfCount dup 256 lt { 1 add } if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont /FontBBox known { CIDFont /FontBBox get /FontBBox exch def } if CIDFont /CDevProc known { CIDFont /CDevProc get /CDevProc exch def } if currentdict end BaseFontNameStr 3 (0) putinterval 0 1 bfCount dup 256 eq { 1 sub } if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup /CIDFirstByte exch 256 mul def FontType 3 eq { /ct_FDDict 2 dict def } if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? { /Widths 1 index /CIDFont get /GlyphDirectory get length dict def } if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont /Widths get begin exch /CIDFont get /GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } { exch pop } ifelse } bind def /ct_ComposeFont { ct_UseNativeCapability? { 2 index /CMap ct_resourcestatus { pop pop exch pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch /WMode exch def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity)} ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> <FFFF> endcodespacerange 1 begincidrange <0000> <FFFF> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def /ct_MakeIdentity { ct_UseNativeCapability? { 1 index /CMap ct_resourcestatus { pop pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity) } ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> <FFFF> endcodespacerange 1 begincidrange <0000> <FFFF> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { exch pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def currentdict readonly pop end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. %%Version: 1.0 0 userdict /ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge } bind def /AllocGlyphStorage { Is2015? { pop } { {string} forall } ifelse } bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def 4 array astore cvx /FontBBox exch def /sfnts } bind def /Type42DictEnd { currentdict dup /FontName get exch definefont end ct_T42Dict exch dup /FontName get exch put } bind def /RD {string currentfile exch readstring pop} executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop } ifelse } bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop } ifelse } bind def /T0AddT42Mtx2 { /CIDFont findresource /Metrics2 get begin def end }bind def end %%EndResource Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Image 75 dict dup begin put /Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd /AGMIMG_mbuf () def /AGMIMG_ybuf () def /AGMIMG_kbuf () def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def /AGMIMG_k 0 def /AGMIMG_tmp nd /AGMIMG_imagestring0 nd /AGMIMG_imagestring1 nd /AGMIMG_imagestring2 nd /AGMIMG_imagestring3 nd /AGMIMG_imagestring4 nd /AGMIMG_imagestring5 nd /AGMIMG_cnt nd /AGMIMG_fsave nd /AGMIMG_colorAry nd /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd /AGMIMG_flushfilters nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd /doc_setup { Adobe_AGM_Core begin Adobe_AGM_Image begin /AGMIMG_&image systemdict/image get def /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMIMG_&colorimage /colorimage ldf }if end end }def /page_setup { Adobe_AGM_Image begin /AGMIMG_ccimage_exists {/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where { pop false }{ /Adobe_AGM_InRip_Seps where { pop false }{ true }ifelse }ifelse }{ false }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf /Decode [ Decode 1 get Decode 0 get] def }def /knockout_image_samples { Operator/imagemask ne{ /Decode [1 1] def }if }def }{ /invert_image_samples { {1 exch sub} currenttransfer addprocs settransfer }def /knockout_image_samples { { pop 1 } currenttransfer addprocs settransfer }def }ifelse /img /imageormask ldf /sepimg /sep_imageormask ldf /devnimg /devn_imageormask ldf /idximg /indexed_imageormask ldf /_ctype 7 def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{ bind }if def }forall }def /page_trailer { end }def /doc_trailer { }def /AGMIMG_flushfilters { dup type /arraytype ne {1 array astore}if aload length { dup type /filetype eq { dup status 1 index currentfile ne and {dup flushfile closefile} {pop} ifelse }{pop}ifelse } repeat }def /imageormask_sys { begin save mark level2{ currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMIMG_&imagemask }{ BitsPerComponent ImageMatrix /DataSource load AGMIMG_&image }ifelse }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if cleartomark restore end }def /overprint_plate { currentoverprint { 0 get dup type /nametype eq { dup /DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false exch { AGMOHS_sepink eq or } forall not } ifelse }{ pop false }ifelse }def /process_mask_L3 { dup begin /ImageType 1 def end 4 dict begin /DataDict exch def /ImageType 3 def /InterleaveType 3 def /MaskDict 9 dict begin /ImageType 1 def /Width DataDict dup /MaskWidth known {/MaskWidth}{/Width} ifelse get def /Height DataDict dup /MaskHeight known {/MaskHeight}{/Height} ifelse get def /ImageMatrix [Width 0 0 Height neg 0 Height] def /NComponents 1 def /BitsPerComponent 1 def /Decode [0 1] def /DataSource AGMIMG_maskSource def currentdict end def currentdict end }def /use_mask { dup type /dicttype eq { dup /Mask known { dup /Mask get { level3 {true} { dup /MaskWidth known {dup /MaskWidth get 1 index /Width get eq}{true}ifelse exch dup /MaskHeight known {dup /MaskHeight get 1 index /Height get eq}{true}ifelse 3 -1 roll and } ifelse } {false} ifelse } {false} ifelse } {false} ifelse }def /make_line_source { begin MultipleDataSources { [ Decode length 2 div cvi {Width string} repeat ] }{ Width Decode length 2 div mul cvi string }ifelse end }def /datasource_to_str { exch dup type dup /filetype eq { pop exch readstring }{ /arraytype eq { exec exch copy }{ pop }ifelse }ifelse pop }def /masked_image_simulation { 3 dict begin dup make_line_source /line_source xdf /mask_source AGMIMG_maskSource /LZWDecode filter def dup /Width get 8 div ceiling cvi string /mask_str xdf begin gsave 0 1 translate 1 -1 Height div scale 1 1 Height { pop gsave MultipleDataSources { 0 1 DataSource length 1 sub { dup DataSource exch get exch line_source exch get datasource_to_str } for }{ DataSource line_source datasource_to_str } ifelse << /PatternType 1 /PaintProc [ /pop cvx << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1.0 sub 1 matrix scale 0.5 0 matrix translate matrix concatmatrix /MultipleDataSources MultipleDataSources /DataSource line_source /BitsPerComponent BitsPerComponent /Decode Decode >> /image cvx ] cvx /BBox [0 0 Width 1] /XStep Width /YStep 1 /PaintType 1 /TilingType 2 >> matrix makepattern set_pattern << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1 matrix scale /MultipleDataSources false /DataSource mask_source mask_str readstring pop /BitsPerComponent 1 /Decode [0 1] >> imagemask grestore 0 1 translate } for grestore end end }def /imageormask { begin SkipImageProc { currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict Operator /imagemask eq DeviceN_PS2 not and { imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ [/Separation /Black /DeviceGray {}] setcolorspace /Decode [ Decode 1 get Decode 0 get ] def }if use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { Names convert_to_process not { 2 dict begin /imageDict xdf /names_index 0 def gsave imageDict write_image_file { Names { dup (None) ne { [/Separation 3 -1 roll /DeviceGray {1 exch sub}] setcolorspace Operator imageDict read_image_file names_index 0 eq {true setoverprint} if /names_index names_index 1 add def }{ pop } ifelse } forall close_image_file } if grestore end }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load /Adobe_AGM_OnHost_Seps where { pop imagemask }{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator /colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ /DataSource [ DataSource 0 get /exec cvx DataSource 1 get /exec cvx DataSource 2 get /exec cvx DataSource 3 get /exec cvx /AGMCORE_get_ink_data cvx ] cvx def }{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load filter_cmyk 0 () /SubFileDecode filter def }ifelse /Decode [ Decode 0 get Decode 1 get ] def /MultipleDataSources false def /NComponents 1 def /Operator /image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator /image eq{ AGMCORE_host_sep{ /DoImage true def HostSepColorImage{ invert_image_samples }{ AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if }ifelse 1 AGMCORE_&setgray DoImage {currentdict imageormask_sys} if }{ use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ image }ifelse }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentcolorspace overprint_plate not{ knockout_unitsq }if }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin CSA map_csa begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_avoid_L2_sep_space{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def }if AGMIMG_ccimage_exists MappedCSA 0 get /DeviceCMYK eq and currentdict/Components known and Name () ne and Name (All) ne and Operator /image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load /exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for } /exec cvx ] cvx bind MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator /imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentdict/ImageMatrix get concat knockout_unitsq }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name (All) ne and{ level2{ Name AGMCORE_IsSeparationAProcessColor { Operator /imagemask eq{ /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor }{ invert_image_samples }ifelse }{ [ /Separation Name [/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub } bind ] AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor }ifelse currentdict imageormask_sys }{ currentdict Operator /imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name (All) eq or Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentcolorspace 0 get /Separation ne{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentoverprint MappedCSA 0 get /DeviceCMYK eq and Name AGMCORE_IsSeparationAProcessColor not and Name inRip_spot_has_ink not and Name (All) ne and { imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end }def /decode_image_sample { 4 1 roll exch dup 5 1 roll sub 2 4 -1 roll exp 1 sub div mul add } bdf /colorSpaceElemCnt { mark currentcolor counttomark dup 2 add 1 roll cleartomark } bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ 0 1 dataSource length 1 sub { dup currentdict /dataSource get /exch cvx /get cvx /exec cvx /exch cvx names_index /ne cvx [ /pop cvx ] cvx /if cvx } for ] cvx bind end } bdf /devn_alt_datasource { 11 dict begin /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf /dsCnt origMultipleDataSources {origDataSource length}{1}ifelse def /DataSource origMultipleDataSources { [ BitsPerComponent 8 idiv origDecode length 2 idiv mul string 0 1 origDecode length 2 idiv 1 sub { dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch origDataSource exch get 0 () /SubFileDecode filter BitsPerComponent 8 idiv string /readstring cvx /pop cvx /putinterval cvx }for ]bind cvx }{origDataSource}ifelse 0 () /SubFileDecode filter def [ origcolorSpaceElemCnt string 0 2 origDecode length 2 sub { dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div 1 BitsPerComponent 8 idiv {DataSource /read cvx /not cvx{0}/if cvx /mul cvx}repeat /mul cvx /add cvx }for /convProc load /exec cvx origcolorSpaceElemCnt 1 sub -1 0 { /dup cvx 2 /add cvx /index cvx 3 1 /roll cvx /exch cvx 255 /mul cvx /cvi cvx /put cvx }for ]bind cvx 0 () /SubFileDecode filter end } bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin CSA map_csa 2 dict begin dup /srcDataStrs [ 3 -1 roll begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi { dup 65535 gt {1 add 2 div cvi}{exit}ifelse } loop string } repeat end ] def /dstDataStr srcDataStrs 0 get length string def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_producing_seps not { level3 not { Operator /imagemask ne { /DataSource [ [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse colorSpaceElemCnt /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource 1 /string cvx /readstring cvx /pop cvx] cvx colorSpaceElemCnt 1 sub{dup}repeat] def /MultipleDataSources true def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def } if }if currentdict imageormask }{ AGMCORE_host_sep{ Names convert_to_process { CSA get_csa_by_name 0 get /DeviceCMYK eq { /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse 4 /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource filter_cmyk 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode [1 0] def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate { /DataSource DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse CSA get_csa_by_name 0 get /DeviceRGB eq{3}{1}ifelse /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def currentdict imageormask_sys } { gsave knockout_unitsq grestore currentdict consumeimagedata } ifelse } ifelse } { /devicen_colorspace_dict AGMCORE_gget /names_index known { Operator/imagemask ne{ MultipleDataSources { /DataSource [ DataSource devn_sep_datasource /exec cvx ] cvx def /MultipleDataSources false def }{ /DataSource /DataSource load dstDataStr srcDataStrs 0 get filter_devn def } ifelse invert_image_samples } if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentdict imageormask }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end end }def /imageormask_l2_overprint { currentdict currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ level3{ currentcmykcolor /AGMIMG_k xdf /AGMIMG_y xdf /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ [/DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK {}] setcolorspace AGMIMG_c 0 ne {AGMIMG_c} if AGMIMG_m 0 ne {AGMIMG_m} if AGMIMG_y 0 ne {AGMIMG_y} if AGMIMG_k 0 ne {AGMIMG_k} if setcolor }{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def [/Indexed [ /DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK { AGMIMG_k 0 eq {0} if AGMIMG_y 0 eq {0 exch} if AGMIMG_m 0 eq {0 3 1 roll} if AGMIMG_c 0 eq {0 4 1 roll} if } ] 255 { 255 div mark exch dup dup dup AGMIMG_k 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_y 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_m 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_c 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop counttomark 1 roll }{ pop }ifelse counttomark 1 add -1 roll pop } ] setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ [/Separation /Black /DeviceGray {}] setcolorspace gsave /Black [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Yellow /DeviceGray {}] setcolorspace gsave /Yellow [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Magenta /DeviceGray {}] setcolorspace gsave /Magenta [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Cyan /DeviceGray {}] setcolorspace gsave /Cyan [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore } if close_image_file }{ imageormask }ifelse }ifelse }ifelse } def /indexed_imageormask { begin save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget dup /CSA known { /CSA get get_csa_by_name }{ /Names get } ifelse overprint_plate not{ knockout_unitsq }if }{ Indexed_DeviceN { /devicen_colorspace_dict AGMCORE_gget /names_index known { indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata } ifelse }{ AGMCORE_is_cmyk_sep{ Operator /imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ level2{ Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget begin }{ /indexed_colorspace_dict AGMCORE_gget begin CSA get_csa_by_name 0 get /DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and { [/Indexed [/DeviceN [/Cyan /Magenta /Yellow /Black] /DeviceCMYK {}] HiVal Lookup] setcolorspace } if end } ifelse imageormask Indexed_DeviceN { end } if }{ Operator /imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin Indexed_DeviceN not { currentcolorspace dup 1 /DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put }for put setcolorspace } if currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse end end }def /OPIimage { dup type /dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /ImageType 1 def /Decode [0 1 def] currentdict end }if dup begin /NComponents 1 cdndf /MultipleDataSources false cdndf /SkipImageProc {false} cdndf /HostSepColorImage false cdndf /Decode [ 0 currentcolorspace 0 get /Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ] cdndf /Operator /image cdndf end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cachemask_level2 { 3 dict begin /LZWEncode filter /WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile 0 (%EndMask) /SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring not {exit} if }loop WriteFilter closefile end }def /cachemask_level3 { currentfile << /Filter [ /SubFileDecode /ASCII85Decode /RunLengthDecode ] /DecodeParms [ << /EODCount 0 /EODString (%EndMask) >> null null ] /Intent 1 >> /ReusableStreamDecode filter }def /spot_alias { /mapto_sep_imageormask { dup type /dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def }{ begin }ifelse /Decode [/customcolor_tint AGMCORE_gget 0] def /Operator /image def /HostSepColorImage false def /SkipImageProc {false} def currentdict end sep_imageormask }bdf /customcolorimage { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget << /Name AGMIMG_colorAry 4 get /CSA [ /DeviceCMYK ] /TintMethod /Subtractive /TintProc null /MappedCSA null /NComponents 4 /Components [ AGMIMG_colorAry aload pop pop ] >> setsepcolorspace mapto_sep_imageormask }ndf Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put current_spot_alias{dup 4 get map_alias}{false}ifelse { false set_spot_alias /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask true set_spot_alias }{ AGMIMG_&customcolorimage }ifelse }bdf }def /snap_to_device { 6 dict begin matrix currentmatrix dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { 1 1 dtransform 0 gt exch 0 gt /AGMIMG_xSign? exch def /AGMIMG_ySign? exch def 0 0 transform AGMIMG_ySign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch AGMIMG_xSign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch itransform /AGMIMG_llY exch def /AGMIMG_llX exch def 1 1 transform AGMIMG_ySign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch AGMIMG_xSign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch itransform /AGMIMG_urY exch def /AGMIMG_urX exch def [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY] concat }{ }ifelse end } def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ dup 2 index exch get 255 exch sub 2 index 3 1 roll put }for }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin /AGMIMG_mbuf 0 string def /AGMIMG_ybuf 0 string def /AGMIMG_kbuf 0 string def { colorbuf dup length AGMIMG_mbuf length ne { dup length dup dup /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def } if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage end } def /sep_imageormask_lev1 { begin MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get } currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get /DeviceGray eq { {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} {AGMIMG_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceGray eq { {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def }if end systemdict /setpacking known { setpacking } if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin 2 2010 Adobe_AGM_Core/doc_setup get exec Adobe_CoolType_Core/doc_setup get exec Adobe_AGM_Image/doc_setup get exec currentdict Adobe_AGM_Utils eq {end} if %%EndSetup %%Page: (Page 1) 1 %%EndPageComments %%BeginPageSetup /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="3.1.1-111"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <dc:format>application/postscript</dc:format> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xap="http://ns.adobe.com/xap/1.0/" + xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xap:CreatorTool>Adobe Illustrator CS2</xap:CreatorTool> + <xap:CreateDate>2006-05-22T12:02:18-06:00</xap:CreateDate> + <xap:ModifyDate>2006-05-22T12:02:18-06:00</xap:ModifyDate> + <xap:MetadataDate>2006-05-22T12:02:18-06:00</xap:MetadataDate> + <xap:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xapGImg:width>256</xapGImg:width> + <xapGImg:height>88</xapGImg:height> + <xapGImg:format>JPEG</xapGImg:format> + <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAWAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9Na7r2kaBpF1rGsXSWWm WSepc3MleKrUAbCpJJICgCpOw3xV4rN/zmb+VccrImn61MqmglS3tgre453Kt94xVZ/0Oj+V3/Vr 1z/kRaf9lWKu/wCh0fyu/wCrXrn/ACItP+yrFXf9Do/ld/1a9c/5EWn/AGVYq7/odH8rv+rXrn/I i0/7KsVd/wBDo/ld/wBWvXP+RFp/2VYq7/odH8rv+rXrn/Ii0/7KsVd/0Oj+V3/Vr1z/AJEWn/ZV irv+h0fyu/6teuf8iLT/ALKsVd/0Oj+V3/Vr1z/kRaf9lWKu/wCh0fyu/wCrXrn/ACItP+yrFXf9 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 rPgAAABQDYAYq7FXYq7FX//Z</xapGImg:image> + </rdf:li> + </rdf:Alt> + </xap:Thumbnails> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"> + <xapMM:DocumentID>uuid:1D5AD7E5EB1D11DA9AE8AF786C667F62</xapMM:DocumentID> + <xapMM:InstanceID>uuid:1D5AD7E6EB1D11DA9AE8AF786C667F62</xapMM:InstanceID> + <xapMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>uuid:1D5AD7E4EB1D11DA9AE8AF786C667F62</stRef:instanceID> + <stRef:documentID>uuid:3340611AEB1C11DA9AE8AF786C667F62</stRef:documentID> + </xapMM:DerivedFrom> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?> % &&end XMP packet marker&& [{ai_metadata_stream_123} <</Type /Metadata /Subtype /XML>> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 %AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0 Adobe_AGM_Utils begin Adobe_AGM_Core/page_setup get exec Adobe_AGM_Core/capture_currentpagedevice get exec Adobe_CoolType_Core/page_setup get exec Adobe_AGM_Image/page_setup get exec %%EndPageSetup Adobe_AGM_Core/AGMCORE_save save ddf 1 -1 scale 0 -101.391 translate [1 0 0 1 0 0 ] concat % page clip gsave newpath gsave % PSGState 0 0 mo 0 101.391 li 299.717 101.391 li 299.717 0 li cp clp [1 0 0 1 0 0 ] concat 11.7164 lw 0 lc 0 lj 4 ml [] 0 dsh true sadj 44.6758 95.5317 mo 38.2314 95.5317 31.2729 90.5361 29.2124 84.4307 cv 6.44043 16.9595 li 4.37988 10.854 7.96631 5.8584 14.4102 5.8584 cv 285.291 5.8584 li 291.735 5.8584 295.332 10.8574 293.283 16.9673 cv 270.665 84.4238 li 268.616 90.5337 261.668 95.5322 255.224 95.5322 cv 44.6758 95.5317 li cp false sop /0 [/DeviceCMYK] /CSA add_res 0 0 0 0 cmyk @ 44.6758 95.5317 mo 38.2314 95.5317 31.2729 90.5361 29.2124 84.4307 cv 6.44043 16.9595 li 4.37988 10.854 7.96631 5.8584 14.4102 5.8584 cv 285.291 5.8584 li 291.735 5.8584 295.332 10.8574 293.283 16.9673 cv 270.665 84.4238 li 268.616 90.5337 261.668 95.5322 255.224 95.5322 cv 44.6758 95.5317 li cp 0.74902 0.678431 0.670588 0.901961 cmyk f 160.848 76.3174 mo 160 74.8833 159.59 73.1943 159.623 71.2451 cv 160.238 34.0518 li 160.272 32.0176 160.801 30.2876 161.828 28.8623 cv 162.861 27.4385 164.08 26.7251 165.477 26.7241 cv 166.125 26.7241 166.721 26.875 167.271 27.1636 cv 167.217 27.0767 167.169 26.9873 167.113 26.9019 cv 166.16 25.4805 164.963 24.77 163.524 24.771 cv 162.127 24.7725 160.909 25.4858 159.875 26.9097 cv 158.849 28.3345 158.319 30.0649 158.285 32.0991 cv 157.67 69.293 li 157.636 71.269 158.058 72.9805 158.929 74.4272 cv 159.489 75.3652 160.128 75.9912 160.848 76.3174 cv cp 174.544 19.979 mo 174.543 19.9805 li 174.549 19.9854 174.555 19.9897 174.559 19.9951 cv 174.544 19.979 li cp 178.01 23.8306 mo 177.537 23.105 177.031 22.4731 176.495 21.9316 cv 176.496 21.9316 li 174.561 19.9961 li 175.09 20.5337 175.589 21.1606 176.058 21.8779 cv 177.906 24.7446 178.699 28.1465 178.451 32.085 cv 176.187 69.2324 li 175.939 73.1714 174.835 76.5811 172.893 79.4619 cv 170.976 82.3438 168.813 83.7959 166.385 83.8159 cv 157.423 83.8159 li 155.724 83.8301 154.193 83.1323 152.817 81.7539 cv 152.802 81.7593 li 154.755 83.7119 li 154.757 83.6953 li 156.137 85.0815 157.671 85.7827 159.376 85.7686 cv 168.338 85.7686 li 170.766 85.7495 172.928 84.2979 174.846 81.4146 cv 176.788 78.5337 177.893 75.124 178.139 71.1855 cv 180.404 34.0376 li 180.651 30.0991 179.859 26.6973 178.01 23.8306 cv cp 0.368627 0.043137 0 0 cmyk f 1.30182 lw 1 ml 160.848 76.3174 mo 160 74.8833 159.59 73.1943 159.623 71.2451 cv 160.238 34.0518 li 160.272 32.0176 160.801 30.2876 161.828 28.8623 cv 162.861 27.4385 164.08 26.7251 165.477 26.7241 cv 166.125 26.7241 166.721 26.875 167.271 27.1636 cv 167.217 27.0767 167.169 26.9873 167.113 26.9019 cv 166.16 25.4805 164.963 24.77 163.524 24.771 cv 162.127 24.7725 160.909 25.4858 159.875 26.9097 cv 158.849 28.3345 158.319 30.0649 158.285 32.0991 cv 157.67 69.293 li 157.636 71.269 158.058 72.9805 158.929 74.4272 cv 159.489 75.3652 160.128 75.9912 160.848 76.3174 cv cp 174.544 19.979 mo 174.543 19.9805 li 174.549 19.9854 174.555 19.9897 174.559 19.9951 cv 174.544 19.979 li cp 178.01 23.8306 mo 177.537 23.105 177.031 22.4731 176.495 21.9316 cv 176.496 21.9316 li 174.561 19.9961 li 175.09 20.5337 175.589 21.1606 176.058 21.8779 cv 177.906 24.7446 178.699 28.1465 178.451 32.085 cv 176.187 69.2324 li 175.939 73.1714 174.835 76.5811 172.893 79.4619 cv 170.976 82.3438 168.813 83.7959 166.385 83.8159 cv 157.423 83.8159 li 155.724 83.8301 154.193 83.1323 152.817 81.7539 cv 152.802 81.7593 li 154.755 83.7119 li 154.757 83.6953 li 156.137 85.0815 157.671 85.7827 159.376 85.7686 cv 168.338 85.7686 li 170.766 85.7495 172.928 84.2979 174.846 81.4146 cv 176.788 78.5337 177.893 75.124 178.139 71.1855 cv 180.404 34.0376 li 180.651 30.0991 179.859 26.6973 178.01 23.8306 cv cp 0.368627 0.039216 0 0 cmyk @ 236.682 17.5757 mo 222.922 83.8159 li 214.029 83.8159 li 215.982 85.7686 li 224.874 85.7686 li 238.635 19.5283 li 236.682 17.5757 li cp 0.368627 0.043137 0 0 cmyk f 236.682 17.5757 mo 222.922 83.8159 li 214.029 83.8159 li 215.982 85.7686 li 224.874 85.7686 li 238.635 19.5283 li 236.682 17.5757 li cp 0.368627 0.039216 0 0 cmyk @ 254.912 55.3833 mo 255.456 53.4189 li 245.832 53.4609 li 238.078 83.8159 li 229.116 83.8159 li 231.069 85.7686 li 240.031 85.7686 li 247.785 55.4136 li 254.912 55.3833 li cp 273.957 23.7759 mo 273.526 22.7217 272.979 21.8647 272.314 21.2031 cv 272.316 21.2026 li 272.303 21.1899 li 272.301 21.1885 272.301 21.1875 272.299 21.186 cv 270.363 19.25 li 270.362 19.252 li 271.025 19.9136 271.574 20.7695 272.004 21.8232 cv 273.133 24.6543 273.068 28.0142 271.832 31.9033 cv 255.932 83.8159 li 247.04 83.8159 li 248.992 85.7686 li 257.885 85.7686 li 273.785 33.856 li 275.021 29.9673 275.085 26.6069 273.957 23.7759 cv cp 253.621 33.8804 mo 254.166 31.8677 255.129 30.1577 256.514 28.749 cv 257.905 27.3394 259.302 26.6348 260.699 26.6338 cv 261.102 26.6338 261.467 26.6948 261.804 26.8042 cv 261.801 26.7988 261.8 26.7939 261.798 26.7886 cv 261.203 25.3828 260.184 24.6797 258.746 24.6812 cv 257.35 24.6821 255.953 25.3867 254.561 26.7964 cv 253.176 28.2051 252.214 29.915 251.668 31.9272 cv 247.789 46.2388 li 250.273 46.231 li 253.621 33.8804 li cp 215.012 21.5903 mo 215.029 21.5854 li 213.077 19.6323 li 213.07 19.6489 li 213.682 20.2573 214.244 20.9839 214.739 21.8613 cv 216.326 24.7178 216.807 28.106 216.199 32.0293 cv 215.088 39.2134 li 214.48 43.1377 213 46.5308 210.666 49.394 cv 208.357 52.2598 205.908 53.6973 203.301 53.709 cv 193.678 53.751 li 190.544 83.8159 li 181.582 83.8159 li 183.535 85.7686 li 192.497 85.7686 li 195.63 55.7036 li 205.254 55.6616 li 207.861 55.6499 210.311 54.2124 212.619 51.3467 cv 214.953 48.4839 216.434 45.0908 217.04 41.166 cv 218.152 33.9819 li 218.76 30.0586 218.279 26.6704 216.691 23.814 cv 216.193 22.9302 215.629 22.2007 215.012 21.5903 cv cp 198.781 26.6958 mo 203.896 26.6909 li 204.443 26.6909 204.947 26.7949 205.407 27.001 cv 205.383 26.9551 205.361 26.9077 205.336 26.8623 cv 204.514 25.4448 203.381 24.7368 201.943 24.7383 cv 196.828 24.7432 li 194.469 46.4697 li 196.634 46.4629 li 198.781 26.6958 li cp 0.368627 0.043137 0 0 cmyk f 254.912 55.3833 mo 255.456 53.4189 li 245.832 53.4609 li 238.078 83.8159 li 229.116 83.8159 li 231.069 85.7686 li 240.031 85.7686 li 247.785 55.4136 li 254.912 55.3833 li cp 273.957 23.7759 mo 273.526 22.7217 272.979 21.8647 272.314 21.2031 cv 272.316 21.2026 li 272.303 21.1899 li 272.301 21.1885 272.301 21.1875 272.299 21.186 cv 270.363 19.25 li 270.362 19.252 li 271.025 19.9136 271.574 20.7695 272.004 21.8232 cv 273.133 24.6543 273.068 28.0142 271.832 31.9033 cv 255.932 83.8159 li 247.04 83.8159 li 248.992 85.7686 li 257.885 85.7686 li 273.785 33.856 li 275.021 29.9673 275.085 26.6069 273.957 23.7759 cv cp 253.621 33.8804 mo 254.166 31.8677 255.129 30.1577 256.514 28.749 cv 257.905 27.3394 259.302 26.6348 260.699 26.6338 cv 261.102 26.6338 261.467 26.6948 261.804 26.8042 cv 261.801 26.7988 261.8 26.7939 261.798 26.7886 cv 261.203 25.3828 260.184 24.6797 258.746 24.6812 cv 257.35 24.6821 255.953 25.3867 254.561 26.7964 cv 253.176 28.2051 252.214 29.915 251.668 31.9272 cv 247.789 46.2388 li 250.273 46.231 li 253.621 33.8804 li cp 215.012 21.5903 mo 215.029 21.5854 li 213.077 19.6323 li 213.07 19.6489 li 213.682 20.2573 214.244 20.9839 214.739 21.8613 cv 216.326 24.7178 216.807 28.106 216.199 32.0293 cv 215.088 39.2134 li 214.48 43.1377 213 46.5308 210.666 49.394 cv 208.357 52.2598 205.908 53.6973 203.301 53.709 cv 193.678 53.751 li 190.544 83.8159 li 181.582 83.8159 li 183.535 85.7686 li 192.497 85.7686 li 195.63 55.7036 li 205.254 55.6616 li 207.861 55.6499 210.311 54.2124 212.619 51.3467 cv 214.953 48.4839 216.434 45.0908 217.04 41.166 cv 218.152 33.9819 li 218.76 30.0586 218.279 26.6704 216.691 23.814 cv 216.193 22.9302 215.629 22.2007 215.012 21.5903 cv cp 198.781 26.6958 mo 203.896 26.6909 li 204.443 26.6909 204.947 26.7949 205.407 27.001 cv 205.383 26.9551 205.361 26.9077 205.336 26.8623 cv 204.514 25.4448 203.381 24.7368 201.943 24.7383 cv 196.828 24.7432 li 194.469 46.4697 li 196.634 46.4629 li 198.781 26.6958 li cp 0.368627 0.039216 0 0 cmyk @ 18.2988 24.8945 mo 20.2515 26.8472 li 29.1294 26.8398 li 28.5698 24.8857 li 18.2988 24.8945 li cp 0.368627 0.043137 0 0 cmyk f 18.2988 24.8945 mo 20.2515 26.8472 li 29.1294 26.8398 li 28.5698 24.8857 li 18.2988 24.8945 li cp 0.368627 0.039216 0 0 cmyk @ 40.7334 26.8301 mo 51.0049 26.8218 li 49.2417 19.5278 li 47.2891 17.5747 li 49.0522 24.8691 li 38.7808 24.8774 li 54.3364 83.8159 li 45.4443 83.8159 li 47.397 85.7686 li 56.2891 85.7686 li 40.7334 26.8301 li cp 0.368627 0.043137 0 0 cmyk f 40.7334 26.8301 mo 51.0049 26.8218 li 49.2417 19.5278 li 47.2891 17.5747 li 49.0522 24.8691 li 38.7808 24.8774 li 54.3364 83.8159 li 45.4443 83.8159 li 47.397 85.7686 li 56.2891 85.7686 li 40.7334 26.8301 li cp 0.368627 0.039216 0 0 cmyk @ 90.7246 78.4995 mo 88.772 76.5454 li 90.043 83.8159 li 67.6914 83.8159 li 69.644 85.7686 li 91.9956 85.7686 li 90.7246 78.4995 li cp 80.7324 48.8525 mo 78.7798 46.8999 li 80.1538 54.2886 li 70.5479 54.3306 li 75.1357 76.3481 li 76.686 76.3701 li 72.5005 56.2832 li 82.1064 56.2412 li 80.7324 48.8525 li cp 69.0068 46.9326 mo 70.5513 46.9277 li 66.3594 26.8096 li 81.7354 26.7979 li 80.4639 19.5278 li 78.5112 17.5747 li 79.7827 24.8447 li 64.4067 24.8569 li 69.0068 46.9326 li cp 0.368627 0.043137 0 0 cmyk f 90.7246 78.4995 mo 88.772 76.5454 li 90.043 83.8159 li 67.6914 83.8159 li 69.644 85.7686 li 91.9956 85.7686 li 90.7246 78.4995 li cp 80.7324 48.8525 mo 78.7798 46.8999 li 80.1538 54.2886 li 70.5479 54.3306 li 75.1357 76.3481 li 76.686 76.3701 li 72.5005 56.2832 li 82.1064 56.2412 li 80.7324 48.8525 li cp 69.0068 46.9326 mo 70.5513 46.9277 li 66.3594 26.8096 li 81.7354 26.7979 li 80.4639 19.5278 li 78.5112 17.5747 li 79.7827 24.8447 li 64.4067 24.8569 li 69.0068 46.9326 li cp 0.368627 0.039216 0 0 cmyk @ 115.955 71.0776 mo 115.609 67.4888 li 115.256 63.812 113.992 59.8911 111.8 56.689 cv 99.4316 39.376 li 98.2632 37.7417 97.5591 36.0186 97.3237 34.2056 cv 97.0015 31.731 97.2075 29.875 97.9463 28.6362 cv 98.6899 27.3984 99.9658 26.7778 101.77 26.7769 cv 102.477 26.7759 103.125 26.9351 103.715 27.2515 cv 102.71 25.6343 101.413 24.8232 99.8169 24.8237 cv 98.0132 24.8252 96.7373 25.4458 95.9937 26.6831 cv 95.2549 27.9224 95.0488 29.7783 95.3711 32.2529 cv 95.6064 34.0659 96.3105 35.7891 97.479 37.4233 cv 109.848 54.7358 li 112.04 57.9385 113.303 61.8594 113.656 65.5347 cv 114.002 69.1235 li 114.385 73.0913 113.824 76.0444 112.338 78.9458 cv 110.877 81.8491 108.925 83.7959 106.459 83.8159 cv 102.01 83.8159 li 99.4351 83.8364 97.2817 82.9619 95.5396 81.1475 cv 95.5337 81.1465 li 97.4868 83.0991 li 97.4868 83.0952 li 99.2295 84.9146 101.384 85.7905 103.963 85.7686 cv 108.412 85.7686 li 110.877 85.7485 112.83 83.8032 114.291 80.8999 cv 115.776 77.9971 116.337 75.0454 115.955 71.0776 cv cp 105.711 20.3496 mo 105.708 20.3496 li 105.716 20.3574 105.726 20.3638 105.733 20.3726 cv 105.711 20.3496 li cp 97.7358 75.0298 mo 98.0869 75.3682 98.4399 75.644 98.7939 75.873 cv 98.2041 74.9399 97.8057 73.7842 97.6094 72.396 cv 97.5679 72.1011 97.5093 71.6875 97.4346 71.1563 cv 95.4819 69.2036 li 95.5566 69.7339 95.6152 70.147 95.6567 70.4419 cv 95.9399 72.4468 96.6343 73.9761 97.7358 75.0298 cv cp 112.447 34.1807 mo 111.691 28.7261 110.121 24.8018 107.744 22.3926 cv 107.754 22.3926 li 105.751 20.3892 li 108.152 22.7935 109.734 26.7397 110.495 32.228 cv 105.474 32.2363 li 107.426 34.189 li 112.447 34.1807 li cp 0.368627 0.043137 0 0 cmyk f 115.955 71.0776 mo 115.609 67.4888 li 115.256 63.812 113.992 59.8911 111.8 56.689 cv 99.4316 39.376 li 98.2632 37.7417 97.5591 36.0186 97.3237 34.2056 cv 97.0015 31.731 97.2075 29.875 97.9463 28.6362 cv 98.6899 27.3984 99.9658 26.7778 101.77 26.7769 cv 102.477 26.7759 103.125 26.9351 103.715 27.2515 cv 102.71 25.6343 101.413 24.8232 99.8169 24.8237 cv 98.0132 24.8252 96.7373 25.4458 95.9937 26.6831 cv 95.2549 27.9224 95.0488 29.7783 95.3711 32.2529 cv 95.6064 34.0659 96.3105 35.7891 97.479 37.4233 cv 109.848 54.7358 li 112.04 57.9385 113.303 61.8594 113.656 65.5347 cv 114.002 69.1235 li 114.385 73.0913 113.824 76.0444 112.338 78.9458 cv 110.877 81.8491 108.925 83.7959 106.459 83.8159 cv 102.01 83.8159 li 99.4351 83.8364 97.2817 82.9619 95.5396 81.1475 cv 95.5337 81.1465 li 97.4868 83.0991 li 97.4868 83.0952 li 99.2295 84.9146 101.384 85.7905 103.963 85.7686 cv 108.412 85.7686 li 110.877 85.7485 112.83 83.8032 114.291 80.8999 cv 115.776 77.9971 116.337 75.0454 115.955 71.0776 cv cp 105.711 20.3496 mo 105.708 20.3496 li 105.716 20.3574 105.726 20.3638 105.733 20.3726 cv 105.711 20.3496 li cp 97.7358 75.0298 mo 98.0869 75.3682 98.4399 75.644 98.7939 75.873 cv 98.2041 74.9399 97.8057 73.7842 97.6094 72.396 cv 97.5679 72.1011 97.5093 71.6875 97.4346 71.1563 cv 95.4819 69.2036 li 95.5566 69.7339 95.6152 70.147 95.6567 70.4419 cv 95.9399 72.4468 96.6343 73.9761 97.7358 75.0298 cv cp 112.447 34.1807 mo 111.691 28.7261 110.121 24.8018 107.744 22.3926 cv 107.754 22.3926 li 105.751 20.3892 li 108.152 22.7935 109.734 26.7397 110.495 32.228 cv 105.474 32.2363 li 107.426 34.189 li 112.447 34.1807 li cp 0.368627 0.039216 0 0 cmyk @ 145.658 26.7397 mo 145.535 19.5278 li 143.582 17.5747 li 143.705 24.7871 li 133.434 24.7954 li 135.757 83.8159 li 126.865 83.8159 li 128.818 85.7686 li 137.709 85.7686 li 135.387 26.748 li 145.658 26.7397 li cp 112.952 24.812 mo 114.905 26.7646 li 123.344 26.7583 li 123.223 24.8037 li 112.952 24.812 li cp 0.352941 0.101961 0 0 cmyk f 145.658 26.7397 mo 145.535 19.5278 li 143.582 17.5747 li 143.705 24.7871 li 133.434 24.7954 li 135.757 83.8159 li 126.865 83.8159 li 128.818 85.7686 li 137.709 85.7686 li 135.387 26.748 li 145.658 26.7397 li cp 112.952 24.812 mo 114.905 26.7646 li 123.344 26.7583 li 123.223 24.8037 li 112.952 24.812 li cp 0.368627 0.039216 0 0 cmyk @ 45.4443 83.8159 mo 28.5698 24.8857 li 18.2988 24.894 li 16.0439 17.5747 li 47.2891 17.5747 li 49.0522 24.8691 li 38.7808 24.8774 li 54.3364 83.8159 li 45.4443 83.8159 li cp 0 0 0 0 cmyk f 0.650912 lw 4 ml 45.4443 83.8159 mo 28.5698 24.8857 li 18.2988 24.894 li 16.0439 17.5747 li 47.2891 17.5747 li 49.0522 24.8691 li 38.7808 24.8774 li 54.3364 83.8159 li 45.4443 83.8159 li cp @ 67.6914 83.8159 mo 52.4341 17.5747 li 78.5112 17.5747 li 79.7827 24.8447 li 64.4067 24.8569 li 69.0068 46.9326 li 78.7798 46.8999 li 80.1538 54.2881 li 70.5479 54.3301 li 75.1357 76.3481 li 88.772 76.5459 li 90.043 83.8159 li 67.6914 83.8159 li cp f 67.6914 83.8159 mo 52.4341 17.5747 li 78.5112 17.5747 li 79.7827 24.8447 li 64.4067 24.8569 li 69.0068 46.9326 li 78.7798 46.8999 li 80.1538 54.2881 li 70.5479 54.3301 li 75.1357 76.3481 li 88.772 76.5459 li 90.043 83.8159 li 67.6914 83.8159 li cp @ 110.495 32.228 mo 105.474 32.2363 li 104.493 27.2935 102.605 24.8223 99.8174 24.8237 cv 98.0132 24.8252 96.7373 25.4458 95.9937 26.6831 cv 95.2549 27.9224 95.0488 29.7783 95.3706 32.2529 cv 95.6064 34.0659 96.3105 35.7891 97.4785 37.4233 cv 109.847 54.7354 li 112.04 57.938 113.303 61.8594 113.657 65.5352 cv 114.002 69.124 li 114.385 73.0918 113.824 76.0444 112.338 78.9463 cv 110.877 81.8501 108.925 83.7959 106.459 83.8159 cv 102.01 83.8159 li 99.0439 83.8408 96.6362 82.6802 94.7734 80.2588 cv 92.8916 77.8364 91.5684 74.1611 90.8159 69.2329 cv 95.4819 69.2036 li 95.5566 69.7344 95.6147 70.1475 95.6567 70.4424 cv 95.9399 72.4468 96.6343 73.9766 97.7358 75.0308 cv 98.8325 76.085 99.9448 76.6079 101.077 76.5996 cv 102.67 76.5879 103.743 75.9473 104.296 74.6753 cv 104.854 73.4038 104.992 71.561 104.704 69.1465 cv 104.482 67.2769 103.828 65.5562 102.739 63.9834 cv 90.2451 46.1812 li 87.855 43.0278 86.3643 39.5781 85.7925 35.833 cv 85.2432 32.2339 li 84.6357 28.2544 85.1162 24.8164 86.7041 21.9189 cv 88.3179 19.0229 90.5723 17.5747 93.4492 17.5747 cv 98.6401 17.5747 li 105.185 17.5747 109.142 22.46 110.495 32.228 cv cp f 110.495 32.228 mo 105.474 32.2363 li 104.493 27.2935 102.605 24.8223 99.8174 24.8237 cv 98.0132 24.8252 96.7373 25.4458 95.9937 26.6831 cv 95.2549 27.9224 95.0488 29.7783 95.3706 32.2529 cv 95.6064 34.0659 96.3105 35.7891 97.4785 37.4233 cv 109.847 54.7354 li 112.04 57.938 113.303 61.8594 113.657 65.5352 cv 114.002 69.124 li 114.385 73.0918 113.824 76.0444 112.338 78.9463 cv 110.877 81.8501 108.925 83.7959 106.459 83.8159 cv 102.01 83.8159 li 99.0439 83.8408 96.6362 82.6802 94.7734 80.2588 cv 92.8916 77.8364 91.5684 74.1611 90.8159 69.2329 cv 95.4819 69.2036 li 95.5566 69.7344 95.6147 70.1475 95.6567 70.4424 cv 95.9399 72.4468 96.6343 73.9766 97.7358 75.0308 cv 98.8325 76.085 99.9448 76.6079 101.077 76.5996 cv 102.67 76.5879 103.743 75.9473 104.296 74.6753 cv 104.854 73.4038 104.992 71.561 104.704 69.1465 cv 104.482 67.2769 103.828 65.5562 102.739 63.9834 cv 90.2451 46.1812 li 87.855 43.0278 86.3643 39.5781 85.7925 35.833 cv 85.2432 32.2339 li 84.6357 28.2544 85.1162 24.8164 86.7041 21.9189 cv 88.3179 19.0229 90.5723 17.5747 93.4492 17.5747 cv 98.6401 17.5747 li 105.185 17.5747 109.142 22.46 110.495 32.228 cv cp @ 126.865 83.8159 mo 123.224 24.8037 li 112.952 24.812 li 112.336 17.5747 li 143.581 17.5747 li 143.705 24.7871 li 133.434 24.7954 li 135.757 83.8159 li 126.865 83.8159 li cp f 126.865 83.8159 mo 123.224 24.8037 li 112.952 24.812 li 112.336 17.5747 li 143.581 17.5747 li 143.705 24.7871 li 133.434 24.7954 li 135.757 83.8159 li 126.865 83.8159 li cp @ 158.285 32.0986 mo 157.67 69.2925 li 157.636 71.269 158.058 72.9805 158.929 74.4272 cv 159.793 75.8735 160.842 76.5918 162.082 76.583 cv 163.356 76.5732 164.465 75.915 165.412 74.4575 cv 166.365 72.9995 166.885 71.2837 166.964 69.3096 cv 168.408 32.082 li 168.489 30.0503 168.059 28.3237 167.113 26.9019 cv 166.16 25.4805 164.963 24.77 163.524 24.771 cv 162.127 24.772 160.909 25.4849 159.875 26.9097 cv 158.849 28.3345 158.319 30.0645 158.285 32.0986 cv cp 158.532 17.5747 mo 168.987 17.5747 li 171.82 17.5747 174.184 19.0098 176.058 21.877 cv 177.906 24.7437 178.699 28.1465 178.451 32.0845 cv 176.187 69.2324 li 175.939 73.1714 174.835 76.5811 172.893 79.4619 cv 170.976 82.3447 168.813 83.7964 166.385 83.8159 cv 157.423 83.8159 li 154.991 83.8364 152.896 82.4312 151.122 79.5977 cv 149.321 76.7642 148.399 73.3418 148.375 69.3315 cv 148.162 32.1348 li 148.138 28.1245 149.135 24.6948 151.171 21.8452 cv 153.233 18.998 155.694 17.5747 158.532 17.5747 cv cp f 158.285 32.0986 mo 157.67 69.2925 li 157.636 71.269 158.058 72.9805 158.929 74.4272 cv 159.793 75.8735 160.842 76.5918 162.082 76.583 cv 163.356 76.5732 164.465 75.915 165.412 74.4575 cv 166.365 72.9995 166.885 71.2837 166.964 69.3096 cv 168.408 32.082 li 168.489 30.0503 168.059 28.3237 167.113 26.9019 cv 166.16 25.4805 164.963 24.77 163.524 24.771 cv 162.127 24.772 160.909 25.4849 159.875 26.9097 cv 158.849 28.3345 158.319 30.0645 158.285 32.0986 cv cp 158.532 17.5747 mo 168.987 17.5747 li 171.82 17.5747 174.184 19.0098 176.058 21.877 cv 177.906 24.7437 178.699 28.1465 178.451 32.0845 cv 176.187 69.2324 li 175.939 73.1714 174.835 76.5811 172.893 79.4619 cv 170.976 82.3447 168.813 83.7964 166.385 83.8159 cv 157.423 83.8159 li 154.991 83.8364 152.896 82.4312 151.122 79.5977 cv 149.321 76.7642 148.399 73.3418 148.375 69.3315 cv 148.162 32.1348 li 148.138 28.1245 149.135 24.6948 151.171 21.8452 cv 153.233 18.998 155.694 17.5747 158.532 17.5747 cv cp @ 194.469 46.4697 mo 199.334 46.4536 li 200.703 46.4492 201.954 45.7363 203.096 44.3149 cv 204.243 42.8936 204.949 41.1997 205.209 39.2319 cv 206.158 32.0259 li 206.425 30 206.152 28.2798 205.336 26.8623 cv 204.514 25.4448 203.381 24.7368 201.943 24.7383 cv 196.828 24.7427 li 194.469 46.4697 li cp 181.582 83.8159 mo 187.152 17.5747 li 208.063 17.5747 li 210.895 17.5747 213.127 19.0044 214.739 21.8613 cv 216.326 24.7173 216.807 28.106 216.199 32.0293 cv 215.088 39.2134 li 214.48 43.1372 213 46.5303 210.666 49.3936 cv 208.357 52.2588 205.908 53.6973 203.301 53.709 cv 193.678 53.75 li 190.544 83.8159 li 181.582 83.8159 li cp f 194.469 46.4697 mo 199.334 46.4536 li 200.703 46.4492 201.954 45.7363 203.096 44.3149 cv 204.243 42.8936 204.949 41.1997 205.209 39.2319 cv 206.158 32.0259 li 206.425 30 206.152 28.2798 205.336 26.8623 cv 204.514 25.4448 203.381 24.7368 201.943 24.7383 cv 196.828 24.7427 li 194.469 46.4697 li cp 181.582 83.8159 mo 187.152 17.5747 li 208.063 17.5747 li 210.895 17.5747 213.127 19.0044 214.739 21.8613 cv 216.326 24.7173 216.807 28.106 216.199 32.0293 cv 215.088 39.2134 li 214.48 43.1372 213 46.5303 210.666 49.3936 cv 208.357 52.2588 205.908 53.6973 203.301 53.709 cv 193.678 53.75 li 190.544 83.8159 li 181.582 83.8159 li cp @ 214.029 83.8159 mo 226.309 17.5747 li 236.682 17.5747 li 222.922 83.8159 li 214.029 83.8159 li cp f 214.029 83.8159 mo 226.309 17.5747 li 236.682 17.5747 li 222.922 83.8159 li 214.029 83.8159 li cp @ 247.789 46.2388 mo 257.581 46.2056 li 261.791 31.9102 li 262.383 29.9009 262.387 28.1943 261.798 26.7881 cv 261.203 25.3818 260.184 24.6797 258.746 24.6812 cv 257.35 24.6816 255.953 25.3867 254.561 26.7959 cv 253.176 28.2051 252.214 29.915 251.668 31.9268 cv 247.789 46.2388 li cp 229.116 83.8159 mo 241.543 31.9521 li 242.523 27.9922 244.379 24.6055 247.129 21.792 cv 249.904 18.9805 252.721 17.5747 255.559 17.5747 cv 266.014 17.5747 li 268.846 17.5747 270.85 18.9912 272.004 21.8232 cv 273.133 24.6538 273.068 28.0137 271.832 31.9028 cv 255.932 83.8159 li 247.04 83.8159 li 255.456 53.4189 li 245.832 53.4604 li 238.078 83.8159 li 229.116 83.8159 li cp f 247.789 46.2388 mo 257.581 46.2056 li 261.791 31.9102 li 262.383 29.9009 262.387 28.1943 261.798 26.7881 cv 261.203 25.3818 260.184 24.6797 258.746 24.6812 cv 257.35 24.6816 255.953 25.3867 254.561 26.7959 cv 253.176 28.2051 252.214 29.915 251.668 31.9268 cv 247.789 46.2388 li cp 229.116 83.8159 mo 241.543 31.9521 li 242.523 27.9922 244.379 24.6055 247.129 21.792 cv 249.904 18.9805 252.721 17.5747 255.559 17.5747 cv 266.014 17.5747 li 268.846 17.5747 270.85 18.9912 272.004 21.8232 cv 273.133 24.6538 273.068 28.0137 271.832 31.9028 cv 255.932 83.8159 li 247.04 83.8159 li 255.456 53.4189 li 245.832 53.4604 li 238.078 83.8159 li 229.116 83.8159 li cp @ 53.8027 81.7944 mo 38.7808 24.8774 li 49.0522 24.8691 li 47.7612 19.5278 li 19.8325 19.5278 li 21.4854 24.8911 li 28.5698 24.8857 li 29.0044 26.4019 li 31.6074 26.3999 li 47.4692 81.7944 li 53.8027 81.7944 li cp 0.882353 0.768627 0 0 cmyk f 69.8291 81.7944 mo 89.6895 81.7944 li 88.772 76.5459 li 75.1357 76.3481 li 70.5479 54.3301 li 72.5649 54.3208 li 72.5142 54.0767 li 80.1084 54.0439 li 78.8164 47.0972 li 71.0654 47.124 li 71.0244 46.9258 li 69.0068 46.9326 li 64.4067 24.8569 li 79.7827 24.8447 li 78.8525 19.5278 li 55.4873 19.5278 li 69.8291 81.7944 li cp f 114.002 69.124 mo 113.657 65.5352 li 113.303 61.8594 112.04 57.938 109.847 54.7354 cv 97.4785 37.4233 li 96.3105 35.7891 95.6064 34.0659 95.3706 32.2529 cv 95.0488 29.7783 95.2549 27.9224 95.9937 26.6831 cv 96.7373 25.4458 98.0132 24.8252 99.8174 24.8237 cv 101.18 24.8228 102.326 25.417 103.257 26.5977 cv 104.929 27.2441 106.15 29.126 106.921 32.2339 cv 110.495 32.228 li 109.848 27.5601 108.6 24.02 106.766 21.582 cv 105.118 20.2178 103.111 19.5278 100.74 19.5278 cv 95.8608 19.5278 li 93.1563 19.5278 91.0371 20.8887 89.52 23.6113 cv 88.0273 26.3345 87.5762 29.5664 88.147 33.3066 cv 88.6631 36.6904 li 89.2007 40.2104 90.6021 43.4536 92.8486 46.417 cv 104.593 63.1514 li 105.617 64.6299 106.231 66.2471 106.44 68.0049 cv 106.71 70.2749 106.581 72.0068 106.057 73.2017 cv 105.688 74.0498 105.068 74.5933 104.208 74.8452 cv 103.634 75.9995 102.595 76.5889 101.077 76.5996 cv 99.9448 76.6079 98.8325 76.085 97.7358 75.0308 cv 96.6343 73.9766 95.9399 72.4468 95.6567 70.4424 cv 95.6147 70.1475 95.5566 69.7344 95.4819 69.2036 cv 93.5801 69.2158 li 94.3105 73.2773 95.4849 76.3643 97.1055 78.4507 cv 98.8564 80.7266 101.12 81.8174 103.908 81.7944 cv 108.09 81.7944 li 109.5 81.7827 110.731 81.0981 111.788 79.9512 cv 111.979 79.6309 112.162 79.2959 112.338 78.9463 cv 113.824 76.0444 114.385 73.0918 114.002 69.124 cv cp f 135.677 81.7944 mo 133.434 24.7954 li 143.705 24.7871 li 143.615 19.5278 li 115.687 19.5278 li 116.136 24.8096 li 123.224 24.8037 li 123.317 26.3247 li 125.921 26.3228 li 129.344 81.7944 li 135.677 81.7944 li cp f 169.805 33.1636 mo 168.445 68.1577 li 168.372 70.0142 167.884 71.6274 166.987 72.9966 cv 166.47 73.7935 165.898 74.3291 165.279 74.6455 cv 164.361 75.9658 163.298 76.5742 162.082 76.583 cv 160.842 76.5918 159.793 75.8735 158.929 74.4272 cv 158.058 72.9805 157.636 71.269 157.67 69.2925 cv 158.285 32.0986 li 158.319 30.0645 158.849 28.3345 159.875 26.9097 cv 160.909 25.4849 162.127 24.772 163.524 24.771 cv 164.911 24.77 166.072 25.438 167.008 26.7607 cv 167.596 27.0947 168.121 27.603 168.586 28.2944 cv 169.475 29.6318 169.879 31.2544 169.805 33.1636 cv cp 170.348 19.5278 mo 160.52 19.5278 li 157.852 19.5278 155.539 20.8652 153.601 23.542 cv 151.687 26.2207 150.75 29.4438 150.772 33.2134 cv 150.973 68.1782 li 150.996 71.9482 151.861 75.1655 153.553 77.8286 cv 155.222 80.4922 157.19 81.814 159.478 81.7944 cv 167.901 81.7944 li 170.043 81.7769 171.961 80.5591 173.679 78.1733 cv 175.131 75.5786 175.976 72.6006 176.187 69.2324 cv 178.451 32.0845 li 178.652 28.8745 178.152 26.0269 176.962 23.5278 cv 175.205 20.8638 172.995 19.5278 170.348 19.5278 cv cp f 207.457 33.1118 mo 206.564 39.8853 li 206.321 41.7349 205.656 43.3271 204.578 44.6636 cv 203.506 45.999 202.328 46.6689 201.043 46.6733 cv 196.469 46.6895 li 196.493 46.4629 li 194.469 46.4697 li 196.828 24.7427 li 201.943 24.7383 li 203.333 24.7368 204.434 25.4048 205.25 26.729 cv 205.805 27.0615 206.284 27.5688 206.684 28.2578 cv 207.452 29.5903 207.707 31.207 207.457 33.1118 cv cp 209.247 19.5278 mo 189.592 19.5278 li 184.355 81.7944 li 190.754 81.7944 li 193.678 53.75 li 195.703 53.7412 li 195.726 53.5327 li 204.771 53.4932 li 204.859 53.4932 204.946 53.478 205.034 53.4741 cv 207 52.9683 208.876 51.6147 210.666 49.3936 cv 213 46.5303 214.48 43.1372 215.088 39.2134 cv 216.199 32.0293 li 216.693 28.835 216.454 26.0005 215.496 23.5137 cv 213.982 20.8589 211.895 19.5278 209.247 19.5278 cv cp f 223.341 81.7944 mo 236.276 19.5278 li 228.549 19.5278 li 217.008 81.7944 li 223.341 81.7944 li cp f 249.758 46.4717 mo 249.822 46.2314 li 247.789 46.2388 li 251.668 31.9268 li 252.214 29.915 253.176 28.2051 254.561 26.7959 cv 255.953 25.3867 257.35 24.6816 258.746 24.6812 cv 260.143 24.6797 261.141 25.3481 261.742 26.6758 cv 262.242 27.0054 262.637 27.5078 262.926 28.188 cv 263.479 29.5103 263.477 31.1143 262.92 33.0024 cv 258.962 46.4399 li 249.758 46.4717 li cp 271.832 31.9028 mo 272.837 28.7441 273.053 25.9399 272.5 23.48 cv 271.412 20.8472 269.537 19.5278 266.889 19.5278 cv 257.061 19.5278 li 254.393 19.5278 251.744 20.8486 249.136 23.4917 cv 246.552 26.1357 244.808 29.3193 243.887 33.0425 cv 232.205 81.7944 li 238.596 81.7944 li 245.832 53.4604 li 247.869 53.4512 li 247.918 53.2593 li 256.965 53.2212 li 249.053 81.7944 li 256.551 81.7944 li 271.832 31.9028 li cp f %ADOBeginClientInjection: EndPageContent "AI11EPS" userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" % page clip grestore grestore % PSGState Adobe_AGM_Core/AGMCORE_save get restore %%PageTrailer [/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 [ [/CSA [/0 ]] ] del_res Adobe_AGM_Image/page_trailer get exec Adobe_CoolType_Core/page_trailer get exec Adobe_AGM_Core/page_trailer get exec currentdict Adobe_AGM_Utils eq {end} if %%Trailer Adobe_AGM_Image/doc_trailer get exec Adobe_CoolType_Core/doc_trailer get exec Adobe_AGM_Core/doc_trailer get exec %%EOF %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 12.0 %%AI8_CreatorVersion: 12.0.1 %%For: (Todd Purser) ($) %%Title: (Testopia_pocket.eps) %%CreationDate: 5/22/06 12:02 PM %AI9_DataStream %Gb"-6rK8G8OXKo,q%!32c(r$QD+"@)+EVC7QM$BHZ_D&BiokR:`l;[DZ7,CEX'==pN`PoHk<K!^=.lS!W]>D_gZ]t61Q_[miGa"N %3uj&0^:=13_u"B0^Al+DL]@%jj6X\2D<^844Kd.\pu753qY%DmhtM8rijtf>eJ9>YLFXHEU))4C>Ebss[i`?[iSje7Vr)n"nBLq+ %hqrg+pYk0,^HCBNp!*BoYM]8/IX-#4+8>6\IJD"UqV@WZrcIqpoXF/<kI9pJcQ>>7]_QYC<tia=jm24ShS/m\ms]NVrVacD*nOt, %;=;0\/q<UYogR]rZP<H,qet?inEp0mW71W^s7V"mrZ4;BYPIckpRaXs3!^1VmH3%#j&\0(I/iHK"*["aqYJl0rV$4$Dnl>En]du@ %+5[%hca@XR(o]XFlXt_=m_eMN]K>!,huENIebpF*ck#kanp_[XX$d]bWm]dP]YAqL5>(84dr0^1Gg?N@[TuQ*=\*->k,-"6n%[+! %YL_j6YQ!\qDnc83c\4^cE<#FjGAf\$o45E]:gLQ4pffpt9puQ[ncf&qgI;iPg_$</OBQ4qn,N(JrEk"FoD?eepRaWss$rKPhn8nW %B(trfdoUJf?^e,_S],H.dbk&nmf)88hS9"WPJTbX2#Hs$DsuRt&[sp<H\70E11g*]<;;5-+9-<[M0S^2],r_@^HAAbIj3bFo$(P1 %5K^&0^u,1frr#'/pjX.8?hguL[lK#.CC8+->1_dI\Gpf4:&t['BB^#qdFu0k7/,RMHi<o`[srZ"rg/LAr;(=q^AYLE>[3:\r\33e %NVrfgrsOE8ek_q+h^cPh"?4(JrK*9BqC;U9%t>k8GlQpn43S9^nOSl7`AKC=qqF'%hYcrSXc#FCfDGSj]`.4E8A[dpSAX4qn9<XV %pZBIfS\r'\pshD&lC@cu5,5Nm$3@P$^pakO.g4?/iI&'t[gdJg%<XT*LXt47>2+d8pk6D\F`W1=2`GDqF+[h;DG]MD`inQH#\\WM %j7i.Jg'G]MYM^W:j]AgrhjliVJ\S.;1#Xd#@8&RWq$eRc?duoJn/(+C8k<0F$%MIS,Jmg[,]o3@0d?P7\FGSWN!V1lRK=S=0J<8l %Sb!_12F"u^BIm*s.cIS<P`Z@IK"Kqfd"/aPOk#PCW.jd#07&d!PYoVB11PQ!/WA"f=K!E\0g>NS2iLMo++FH8Pi+30@=7i#ZRB'& %F;=S$BKQ:=NIPci"@&S@C'i^T/i%I`*gd=A!`s]Vq2uZi%s9Qej%PCAX_$#Q/&m@ZW$VA$nHhpc/cMIS7X+XE387t6-moRZ]8_T* %=,bma\T!GqK#r_kWR+qT'<2FFTc5\p)6pFQm\j^DV0?W,^WSjX>U37X=lrt&,<_RmTC?c]G%l$m_PFS1QI2]$^2UROIGmDt/j*[- %?=qlh>il&()(!\A:r@60Hk!7N.kTq0idZ1hXZ5X]AW^?B]DV8,^6a'>GPGWQV51cI^DQ'ZH'a"0anM#.G1(l<PPe>8jkoa=HnXsZ %n*n<`Xd#&oq0.$1hoiY0S+8ekkEn@/Q$JY`p.aCXI#Gc0lhU5_HJVE]I#_VY$P9N)h@Esu>''<GfWT)dDZcIu+4'*rSo<Y4:@rBL %>27ORH;SDL:)qrP]]:*8?e=ju2f,@J=.5WZgIgZm&Uh1WV=2?b05OM#$g+Y[iQ$XX;$$.DQ!<7@NTkUJS^rMiL4@$`^]qK:Y$AHq %/!;p\B.^7]IEelWpWY"pp??Cqc?\!dnSWKM?d>^]GFC8c'^q>)Ds;K'f:[?-RsMt2DtSZ9O./eS(@lo@SL'lUBgZ&!4l-o[UYiN] %9HS24f1n-k69,K(b%OOh5>jQaN+'c'[o6]6jR3rEZJe7++j$Vc2"So!DSW'4QM:'j4e5YejjY3@c:a>jpFYHS4Y:l.H0WP_o`c=j %$lMfG&*HAsS.\2d=7X@H)#GB:8h1.-30.>>$N(&Y0]1B`oZmImoc.BIc":P4apI(M,=p7?0phTe5Lp+/A$'J,g*=;@cWn2SA_[JW %Yt>a)=+1BsR%H1+`2VLul5U_DWWgC=b9T__j>Djp[bT7=e,R4"$:6?Dc>q$OCf:<c[,-DG+r)A5g1!4uCk5rh->LWjoUE:RG3BN; %>?tF3XV2Pg;4)WnaEPHNs6_T8lO9it2LZBDOrAj^\FB5KCOdNGi-b7M+pB<'b%FDm>#&$@c8*kVr".I/[jZ_;7A][R4W_>1.X05Z %``Zu\LIj@nc(V5H-fMI!$]LNYptW_$fV0t6oe^Q6!rjO63RNm;D+RBpnrqV_??k6N?`'NRk"-kbq[d'Wq0"ZW78jK:<FQWfMY*mZ %6aUR?[I7W9)jb?$YZn\&'eXPa/D+k=;.sU`*TgRT=i*0lW_gc?&9Q<%3gYpqTrY<p=XWIX9$?"mU6Or><Q8<Z5Z9BrggqJnl5l*b %<j`&)?XT(7H*7#YfWsq%SKW'?,tHS#9QTj7La8pBJQ-ur"55'O8Q8/7]?1Q&>LQ7iG7)[NI%F$DZ4*2PA&"V]V)<],m6j:)QP%ko %k*OhK4>HL%R_M%'H[.`ud&P)KV&Xl3b.:hYeTM*A4`J\%RX`q7!9Su&I?DpiWgsSCkpkTKF]NpN'u2et0as8IdIJ<mf/>DUn27R. %kr"ULZcIjI]]-Um4MnFAo#?1JA00_$8L\_ZcJqj0Qo0G%mVE??Pu^r\,3Q!+S4]kSq:SeuVNKP92n$je''<qh&^;Q$.&a![jVF*j %E#*lQ=d`of'8L_SIShM+R6sNMl-VU`.`9%4^FH.Q`<+66&H+Sj\c*rKcRH&>8cc8\H0dJ)h+$n$X[As/Xf'\cM8^rHf!h`OX^7/N %4O&-l?A`WkJl&S7?]<':IL91mH6$R=jjoGnjs=dLB=`_@o%*GJ,sa"@Ut>%YmOYYBrYGl<%a*nA/f"3%MQ/Gnb%b)&)>fi982JG5 %WaQWF=7(#D3?r9TGt)kgCp+Sa:-+Qml)s7!]V>3GKpc-pl`uXLPoZ@O4Hju$ETLM&VDkolZ])<$MiH=bRo_o9%PBc@S_dSmC@h9W %.T!74T-@W#=5\;OZqG%QRW_M&3=@L**_l'5cJ#Z<<&9N%=#0!::or5W6'G<Y[CD$1.C..NbWH;bH)gNGNVInP3P`/r3)>qhB9P?\ %(g6Th*OD.rauV"OUUA*Q$#K:7(YuDMGs/4Z4)bS/gpDeBj"d/RZo>$e/6J$9WcMXqDA+NZH*_V<\+<S+W_):I>is/NDbc4n6u4rJ %S1`&9=NrUsH"Ws_%Z?"Kd`<Xt(CeR&Z7f,1S0_WBqW&O/>u+Z$Uj_KT(,&_agdYN7;8HB]M0UK%/A\ZR!?+o8Yt?XfW`75$QoY#7 %b06iuQEi-u.S[]6=05t:*eUUECgjC<S7cN]>3:]\+C88f<LU>Ia&9\n[YDW5Hq\k&WKe/M,*c:t[N`D@&G2&0C*?KRCL*b]Gtc33 %=:/q&c@rA`eXG[-H"+1_0lMEIEn(('s%I#)Y\cL=VmNM].F1rch8[=CAW`5kYggfPgOeC;WEqIPh)%06.Z^5j<k<Fqf5%!VpLLp? %4NU4h[T4HfF+_+>)&8QK9@HHpaJ;G[pbPQTZTd'SE=k^?:08NP$*/E9mmSbPm[R?*ZTMXAR9Z\dG`@oCm-#;)mPA_om9h_^P#^R2 %B2!/C88;_fS<R6:MpnEOVKn!;T;=^*7\TuJXP>^s>4bsXO:52LSaSZSB(qZN)Y[3QO*Hi@MJ)sk`,i_8^$Jc4[i+NV@ATm_MZq9Z %jZ/4$'"+5e@Zo?Hm!W#aK/l]HAG3_%QW^,7=+dX'SXDBtMb7_rP8]1aM)Aj*(#qHR;Hm1DoB[s_=%?@]T4`'JG%8:5@@[J_98#te %cF(t6o+6sTiu'r9%WPTT8^,5<Gm3OsX63Y1Z=N(mK>&&Q6;.".Mq6YJ#jNDZ;@I=+lPbptaleIn[`g"kW"r@@+)P$q%u\9&pMLU? %pE=T)eu$Sr]8iC\^<8!<ZBR3.O=`hY69NXfURs-8Bi7gZD6q!Aq]k+1lcI9]Mai,!rCu9MZN_W5?M/DpFd2RQVHU6f=a;Z(Nj3?Y %+a)#J?tW5nVXmQgH$;HCbqbC%&b.s6PO6:c$a,WED_bZ8HPRusl$.F#4YEi]RT92qN@_De^8+HsaJ=m.p:9NbbSHabCp`8)P,Yb< %cmV]b%Sj+^`?PNP9j>,R`DCn:cU!,Dl^qRo/3+b`IJ9%>K+ko?42\m8_;*J((,@pI/HkTFk06q2RGALHHd-n#h_0KZnR+/V?&R8D %MgiF)OVZ.6ot-+[qu=AN:#>![SaObErq@4Qn%V:LQ$g1=n:5>amk)lN2]k8sqsXjd/Uuni^:O@:_k/5`N5'l@G9<dWg\48!3rC#u %P.pq?]-$77^\RZ`LHkh+qsQ]gIWkS]_sd&T^NoG8O2pR1p[>lqroZd'PHRJj6)@r&rRZBF]6a)BcTcob^OQ$7UqAo3s8McmErXB3 %C9.U#doScHrH/'e7pg[sbd<GOl]48Xs2X.aI/*1`j4F9pdF;VX7K&h_N8JT,pOE3L.(tD3'm`EKO.UlA:oO*J&Eq0,Epkr*hS":5 %LQ?BQr5Z;(MuX98c]I4s(B?P3Hh6dA[-+XdIK<[Pp#5WehS&meTl=LAns_Q[5J@$Xh>LE)rVk:E_t1RthLG:Yj$Q6n0"lW3YP7KL %r4,-LQb7VDmI@s+q=s-N]#HRTp\+Qp,U"_bKo@)prer,jj&^_XoB1HipX:51>k>!(f_F9lpMW5:\NG'BogAXMqQ*[g;O0CM^F$p% %X1hs=iX).mNn<a#TE"'6Rr@2I[f,=XB<:@c^HMR^HN--KTQ_]PY^??9iL^V[q*9i7NaK8sc#:nZoK(B84,^K]knWEid`^+_d0iG8 %9WnaUDN94UoX['<h:u<-lU7q9?AW!N?\)N6]fa%L]u[ptS,"qt9t-&`HK!)L)h)'7DQi;IU=[Dg7'F\8^os#0SmRLb$bp;&9aJK) %l],?-j+73N^MA:hppK?:nLNlTk\J_8f9at<K%GS2k3=hSYNrO-%f_7(SYe5Rmj+#7T%4TR9IXgh!F6Ak>9_UCS$n`$<k!AF_nm1u %Zu+Q3]-cSmrk%QFRSNHg3Ot><XbTh7+_q4HlKNCb,Io,3T<BVgc.C.H]CskBFeDgK:=n7nM::F$Lno7HB?"j:g`6h1_[AEn^uO=. %,1fM`>9Y!uO@VAf@3#pu,S)^4R#6m$k*d`G9/B'o899V*?$M,&JYmbTWK571@#5OQ#c?[K3JTSMGmQS:h?&ahf>)Ic4n'S=&NmTE %Qp$/#1:tC_GP]a;7.,n<oC7aBY<O(?U-3N5Ve'n4T@PGbED"\<SVU0&`$]a3*N>%Alt/JcF-u!Xk&!<,f0#sA[LmE+1,$i1(/OXN %304RS+7-@>'*I#&0:s9XmUipfk<-;F_*s^Gk"b?5q;mnjEqY]hrSjCBIeA7ud3l^)PJ99mCYc:8SB:)eg$qKLdCP&iY&(Jol^DGN %QGa'9RDKr0i6Y,!6O5CX98+sf0]V-S5QYuH"J"Hk@</qMi8RAC4ssH%iidTa`#R"i[k+F"p=,7d)&KAibR=+J"+u<D`0&M(2eHVT %o/4_=/[P'i:YisJ4gRLF,WQEcK>YOci,\=4i_8AGF8IhQUN$,Ok+0"'Hk4L-mt:L#a?]k-&Vp[WJkZkD=V`+hOG>p[(m,+q"lo`J %!SK0kJ:'UK+<rE`#?DAE/1PkfCa(JfMn<Jm0sM%d/OXV;egK'PIVr<]&=X`6O'"&l+?A"V,#!PFRL#.7PR5klX$dON'.k!&"7+>l %McVK<[>8*>A;;^I-=S<..Tjn0\nKmi@WCC=,4YfoH"iXk8\f@c_lLSmqEM4@GHC6\f(.2Wf<!QPJ[P<r3ZP_X@Z>fZ.f.(U3O0:k %XE%t)WHUb')k*W;bug^n$T+'=Ap'dbSdpGR*Du?]k4/X&Si@u,YB]&rKm8D9Hm7#k:"D1AbXS*=M$mDE84W#,Dt)?HBJsaa-VhUI %ks-40Ltb(4r^'L:&[h%?b&3#T:;ji&Ua_C1H'5CcA8NNJhU/^e&9FCu_\7l=+;+8lX:#@%F<ImHdG3Uj#9ounOb<t&FO'ukH(AV` %mYF)FLeCMh.Z*4EO>?=$3#5C7'2@@)n^%_bnqlEV*D"cbdQ*n@cU'[+66)O5m=s9l`)3,9"B&HqeCR$%Ca)'Q,A+S3OZ8J2-;o)> %'V?`V\<%m[ks&ZT`X5207jK7;)+\f]B[WVG#QHHbJrhO'f!*N+d'D$)U1p<:7GE^6'ocui=1#-p?.HTCXF+rmnu^Fq.:C]@[0@Be %C`9h2_$A'Z:'mC.c:XIHn85(ULDos7-t#ugU3plIo;^Yi=m%-^\"[Y,ci3)08EJ.n]$m"u1M1C+`cA0Ugr;!\iQ/4<0?GKXOPGBt %o.8)jGk$0#h"6VPig0BAS8lg/@BmD^>QR(qbU_Ten;BAADZ:-b@FdGsfuB4s_b:1k![DR+9OOd>ZahhiH,0V(@)<H4'JU\ta_o's %@TET;D9O\r=Y;BI0o_Rn(1sn0)/q2Z3:SJ@JQtA`RC-ED?6bkb[%>a5O(umFB<'NFLtZB432leVR^:G5VEIY'RKdnLXbmm*4aKq) %.`t`?W@1_CW=(AL'35:fX1,aO?E88*Gj13h@n"T;"*<bEb')nr4gW;Ej!FYY(%4"5od=)<'<C'4C,iG#i;"\3:98^P`nH)),S%f: %*?,m*@^`W%EQoiOM=ic5p+PPE)bC:ckP"KBjf6q\^#n-d.^)5<jfqn1)uk#IY2YnrBWfer-V('`i9.9R?[Vh)ce%&Q(HB&W^UWZG %,'c<u.WT70ek];.*qVt;*lE"e;GoI0s$gk$_qFPLnL@3r'm,5GU)fr5XS,T&+u/UXf:r.Q*UP*O4C=3lnAcCoWoI?.nQ6Oo5u4C" %(Es*(&q/%WpHMN5leCcpRu9H']"e)`J,eq]o@J1+.NkY$/"l==`om>FoBG/WVoalF2V5ne5-p*[Y]1/j4L$bmc$&lQ=Q%cqa07e\ %UXNVhiJ#[8/f)9P=;-EKFA[i,K.%=f&q:2R6<WN'!tQ;nOIu^O8-b,6>[+Rd*?mI1&nHgbs.!gJ$-0+ViEGAkOuG&Rb_*-3%AKQ` %0$I8G]I3b7#X8`m%qPJWL;AXBkb5D0+16>(-04R+r)SmUhmMDB=^&&RrBF^>LOh]oYZeT>6qn?k(:PfGd2400.@VR:*,&IN_gE3. %@`+.SjAm*E?X5r^OEEpbi_-?"O4#L(idU]3oiF!L[;%So;%0<:Jfm:>'t08s<7sos+1[ZoLfmdS@0qlkBf5aL>>:\99tMX^LW$g1 %bsjo5>#-0(?Y9<8mf!#A&,4s&s.Dg$c&iGl.]&0=)+*[c553e2F3Vmpf3qhR/*JMGQPf7^^=YGC%p7idiYUKD'S.K>dt(NabQ3EO %SSG?:Kp@)Sa>u5aQZ?P0COt>Hp>O?!F%,D8[,JejiChrbZ'th1>Ql0J&[qdK;ob@3+B0R-i#`K(^tV+/5A(>mJp"kd`DMKV-3**T %?Q?[<aBO,(h9.a\[<[Jk($0Sb\5Lc=P.aWdFfhjQ)fr'`4,H2DbKrB(eHYkj)OBs,,-MoVOq:XSof;O\]lE8r`'KK#h#u`9eU_3U %&os9,Q#Up)h8685UkM*o3K5c>#L;:Wna'NMn)(XmVtoAIfAVu(QcEDq6b_WhB3om)p^^t,ULTqn3nrss5$%$WIm'u!<G`fNg/E:% %=.lr.NE%fGCK9UBCX]"T9rFF\XYd)mk"<=UMH(sL:d)F*Ho(%<AW=<94S1]#h&D?BhO4(;r<j&s+#$"a@*A\#c5M"s0dQ?s,+^+7 %fnMO\TX0;3gE:,=EJgF(Pi&+!8p$K=_##6nC4a5:!p1VENW=8Xi0pIf>-cJ/>['#Xn<b4Hj"UBa#[orXIu.SURP8n7@;M?f>1R&a %3?D$^[A!c1B;5Eqb!@$6!N^%4\@`9T^b)Y]!d$AOpB/S1+WS&<)]=rCEsd^EP!cg"<0"'D\[U3EWQS?,]Hk$7N]ta(UgM4\T4UJ, %@?cuSS%F'^.egG@g]9@1)"9GcNmX5G!%*ns"KA]O0<6^KGJ[J';K=lF1<6@S;;6hI'r%<N9DkOLT4^amTdB(F93MdddHeAiPoLO` %OD.dbZA9Lkb0_+Wlcr<EROL61@Q(RgTJ;:b/`pLqX0%mDA[b<m)!oHeG+jeXD<!ZXnOU%H3?.6=;kc'T%n#*ZZW\lS[5V2lA!P9f %6aft_)G@Ir;i?cAS#EH7\euk8C?s@r5$JM.`bWK!RdH_tjnWh.-pB]DT49:D3El^XU=We6.DN=fFf6Y\EIk;^^)$THpmDX&"4M:$ %7d`G.8"B!7AM1DtpZY7";-'Rc^R_409SYZHeJiD6l.-el([k9EMA>kh473uEXq@/[XQrTlhOppoU"U>u[dt"JdpjW$SrV,+K_BE4 %6Ond`.L`mI*tQ\O6,gdB%BE?(7?pbJR8Wp@$Di&aO,iSkTQ9Uf9j/n'p5nI3:TeBtdLn;QHDN9C*P-hEg!JQC]5$gjYnruc]I'5Y %1JcgI:Z&9dhd5n2Sp2_Dh6uLR7Q))C@)hq8M@n&^8n'bYcEer;2T<CZ4L[f5i:%^.[$J(+'&/g_p2"kh;/G?*?qF^%="J'nNMhbb %#`27/Pq6Hi79j2f]2."h^jc"#ea2R,rQD3^cXHK&gVBCN1@mH6XSre6qSN(^Z(V-o+5_OYs,V2+3gn:<=/*n/n([@3B5Tst[gdiW %[aaJWQ.5_Vr%/YuH.R&8Pp.+-hjO/pR<?`T:GLmNN;P*1^>oP45L_rYG08c+@W#H3J,Jg8Lj.kDjsu\,7ncG0BL,fKI3Wt8Mm%WW %1b?a2qo?JBfDe;^s+Lg[EqICZ+91StVrP6krf=h5OIH_%8r7_;r/uq@3-C?arc6U(9&;@k^R(M?-2Nm:>kVV"gP!i.5B3g_.Y30L %Y@Lctrh]8P_A2L)Y7^Eu<H>ER1Tsliihn50OT)\AURSGlm)o*O%T8$UDDsLc*E3aOT)Rp@-To%m^cB5cbEdJ,g^72/V25#G"q8]$ %D40D%9nB?\ML(X!/k\PK/ZOZcit^4].9iR#*G`Mo=\XQl\QZG=Uk<B[0JBr%/:7@%nS3ue+\RPnOeol^Bb6T28CgXDeAF+J[!)__ %L;t.bpn]ULhAKEs`^kfL?g=p,C<nQ#Kf)%T8]EGGm\Oo3&lS#;.`faeF\r[Wj-Z8l>#^^%32S=73N5S[AMn#WQlRg&N\EA<2.;_Z %C*FM<N4?>DbQo$HRC]>PC=jC#fk`l8,+Tr-2GSQr&R#M+qML1\R"e6[FGe12+@^rm'3E$+lR"-]0PM[K*h=X(N[.kXH(:EqWbJY1 %#3t[OHguTG-oEV%%N7$i(=fo'FAC(2``G$+)D*\*hpEo2>0O>Z>e7>u;F;kf;WBMHbCR`n(5BjWWQ&L&j;#F78f":AB_eLP63G36 %=![t1=7OJ1A>sQ'I_!]!WGrg>)rO&+N96()c1JHGonR7=aZHq]k/XQoOeN]VPA+!ik3)1C@YU#=^9R>gcQ%k!!D'.02D?WSl=$>Q %*j](:!=G1@UQ\5VP2$d4,C:r6-,a<%_N5]-(+)-VMg1^V+*hF1<#CBsL**!iX)#]GW(#G)K^T-9q=)VV=2T=+_!Br%$73.TWfqn> %(dB_9k@WAdH1eBH2XU.h3]L:q'obUh&HN7?(fagc29Ub>%2QLC/-@,;H>F<9/XD!D,8'FhML#28p-$l7S[Kf,\[NtWl?Ju0Vrqm7 %QcN\Hs%tkYLAmQO\-u3DL_--*X$gu@A@6N(bS2!.j$as1i*FO"4-RB_D&tS5X8ZGKWAQl7Q"78]4CrI*q#'Q!-QrTIs!.Vt@0khm %:N&FGr9NmR5Q-jC;<9IOGp-`<QK-s1^^S1"O<d0849-YpYBinOU$MBF.^P/#p)UZOeCoC4kS%NM4Fs-TL5FSG1FVbuQ5.[gRG>5% %,.i9T&!(i2\`aC0Ca;C^"F.g6!cD01fJ+-m_3^8c$Vob\cbWm]5&PreTs2J'1tV#rju@4uGH<WW"enXh8j=tCPu?$V.8di9ER/BR %fW/u]$DB/U's:):#`a+1DI'XgTq0%iT!M'kbIf/RSJ@/\`/i4/@cmhd4gis65c!.oKRfK2?c?k^7!F90Vdofna6$!E(o^;+eX`JD %o=AC0-0c'$Q(.8Nb]T*h+<0^R3n0_(k%&.!b>f[b'#lm\TJ^F%(F^R(1<f[H[c4QdDS<pdM[b8Q&[hQE'k^L%="ub^V9.E;5T=%a %#l]_%dCpP/bJkK&RXU<QHP1T0L,cYq/0=MqTjK*@nAM=M*B+P]$cV."A(firdJ+GQfSEEH7lI5$aZ*e')'H>T#^;_(/k\S9qLX#B %/M`p)YXsQ*U78Mr+qA$LemLr!k9BT6iL&dPaR)H*_h1^A)r02%n03S`+LU`M^#Klbj(FcRP*l:XCn=0=-KVR)RQ]'n[fqO7KP7.j %2]j#/PG5E1Ee1SH+Iar-Zm8F"!HGag`h9#O*9*W+E=U*F2c%73'31Nf9SJn%MWh_J7EbO)A8\5-'0*dYbDf__SIhlmOls.kZdD<% %,jIZ+Gi]7+/aAJZXjIHRNTr)/1$(e2nuO^jK&@MThHi*k:FgT\Zqph''c;#:7.LApS;F\DF:$'[aSl0'PDb%=Z<kM(KEFp7[Rp;- %+-)>E@*L7*Zu4<dmpqsH0aK'-<M?)YanlP,6i=MVQ./r="gYC%ST.gjW-fm?Q9)sHJ`I8oa_#^nT#$TEL0Qql>G+J!L.LW>eB&h- %(-U-pOne3@&mhs1K'#Ip<FpG7PbNGZb@Y2f>$LOX:=VJs.ZmSJ,S`\jUV]]0^6.@4b]J`>G)2gL(V^R^"tNrsoHRi7_'k^p0.4Y/ %c`TS(LUL@$Q-_R&pLk_4CK^3&lDn0PXKiS)8-j2t<k9RQX>F:[>iObNF[)H[:r:46(coTObGLK6J/]0-5.AM-X@cc/]?=X]0`B)5 %\k!JrdbK-(EA/e(a_>Wd1'OnX*1+VkH%A[]$a:jAau*n)Ak20LV\toR1<p2/T!W)]8VMd'io$jKPqph^_m+2j)(&\NV/'@Z6Gn]* %DX]%<=KdB)>-8fY61drf/=OHKe*NL9QW4;cX-Kag$TNI]MR;_e=GBADGQhY=E&&Z2lSSF^oX.4;,UQ:3<)j9_Ok6E]_T7J?E9Kc& %HT.P/L6*NOM)h$$9+=K0YS]Ht+jA&Mk6.7m25`n93K7`G:bE7"!L#5%RRd^h>X<#d3YF-/4=$AnTSf&nOMm<r+rs+:EOH-i1jN>I %%D(Ucl`\YDUiE8r(GL$<!IL<$S,;/T^4f14@=fO9dK(8ikL9d18sYPo,crUY:C^%0N/<cifPj%UQuGoN"jOp+&#<qU1PH)GM^o"n %Q=M<FBdd<UTp95"8Rd+<lXSJ22NrnrN?6/%WRPa:,[+-Ve--Mah5JJ@]e&0UOLS":5H;K"%$?d39=eqIS_c9e5pBjDZ2)I%hEdHL %^pO"_IiMrCq6U`07PN75dh4ENAA:039h740@>&3X*lrHsH,tQ)"#c#-R5h:_J\g>$);A"'"\e1`PecY%<dRZ\M:^TYfi0d4!^hVn %(?s)5iC1UTg@i&$89/]Q$0&KQ`rnc[>P"+L9Cod30=(i9X?!;KFT?C9Lt3M)`b(a*/Xn>r`6t/r7HA)&2],SZea*K>7LDMQBL%ct %/G5[Dq'#I]Kf?_Y[_ft#X)+ZcTJgfs@2G3:AqBtR$Ngj\4.AN4NsUME4i3`:$CFl&HF>R/m"qKL>dH"TFtZQ>%=]REQg)G#+q;:B %rOW)A_Z@puX[,d\`/EW%'6je!J;*$i0gi:R@K?jK_biRg:XV\=hTI=@bqP\jI5YA-Z&nk-,@Wo-ibUL`:F=V%mSOp3,>+-)B;S.\ %T4BDRR+<Xc`\SL:d-@.q_oT_g12PC4ChZ"&?$Q<]T59'(e\9uF28#KIAfD(Q+q8hfatZ9gSjOD'S*W`O-4Q6F-`6ZlPn`Rg/\$Hm %0uaWB9hB!JK>Adi>Z)Z+;!.!eY\jiLPr6I`iK8QKdKV?6VUd$Dq[,uMrMpAt[:OmLDpC)RbG307Rhm+fXHAoIGI&n(X-XP1?=I0( %bm=q5<e:4]2!Z%i$YP&`5nih;D.-W(Z>cGmoE!/WVu`PZY+J$.HEFFNW/s6V)iZ6VFV>@X@0!i0(/_)kX#SaGbH;$-m?'bkRP\s. %7O<p%pmG*_]ZrKsS)c#l&LsVbJ%CTibY&Ul5-+)pr56*<lg1HXUei]mN%jOV-:!CDUKLd4n^IYH$#?"$5d#k/GALgY_t[d,dLg>f %UlX/h/N-&>_r,[a[-Cr4"t"f7/O"a`63GNA!3pTEcnIW"`mqBV#-#MI;0OY2`N0Y0eHlu*W#NfMJ_1X!j_`5t0XB(bZe%shOC1=: %86%Re@._Ym<1$fH[p`PXL;>*X0Og(KJB_lhJM;Y^RLj'[/iIdaPH0XCQ$L4b"uRsf8WA_f`"/TJ@Zuoi,d3/4"I$N:&2lESY9LPL %15$0E_OM89KpH]bMtdLY-ZeTcnIDhfd7De^N8d[/0Iq.q?qZU#H:i62A?>p.-[MVH_m8T=XcL%G3.qB7\7KUe]r@u2.T1n0qMYh7 %dMiTVg03GH2h7]4)7'(nNMds'_Ru&I3g6F/aD;<B[(9.eVUo>0#qfVGq83&5eLD:h&>)^]R/#?;AMZ<'Pt#Q,@K^1XajD,M)i1ks %QtJ%1C5'I*#d_m9]ji(R?TB=7A8Bo8l'W3O3L^&DQW!u@,(/ou1mUef@J4YeM/.r0BmlL/3'fHn_jWh5-8R%]#RiQ_LtnEa9kt!G %)pi'&:iKeBM\RFm`oqrZ+crrQ11UTO&'P5W1"emQ3#S"Q<`A]_&X5skS648tfS,D,em9bu\.gXAE%^8WNmEEIG;jon;&XJa]U/uX %%)M]cm&E=OR7[N,n8&b7-i8*1fn>p<FV6$GGGq%_FfJ\nO&.E"!E!Bs-D(O!B5sVWb0YtZE<X0k?]tnEDM9$rVktEZ`>l/Hi^p9m %9o@7':D9oGA._L-Cf:,a`bW^D)\+9l`Kd>seh`jH1+fAZ=Lb9$@l/qO_NSh^4j0,rLJi@I\E9!JNXJm"$Q?o?JU8m4XqH,IE6ZU" %TQt;NJ1g!k/7hXP0^40XqH[36aipGr=q_[=_['5F?KE&?/+q4=XtuX63>Uq*b]q.9+?2*$`.gk*9PA/O%HA$[b>Laj,2D&*M_$>$ %S</[4+iH]&f$aabl_88ZQZ>KG:V;KZWt>th"]uBK8mA%Dh2$roeOI&Ek");@])^;\<fs`rqAbf+Q(9hO/QY>aBpN0uF!6Ml!VQY6 %dA;o:MA6m^qK-?;P5iHA"&S"8*>^?n2p^t)P5smfF"oam)PD_\l`"*^"9M3J`h(]o@0iZs3:)O$D%<J-NXjgd_96Z;,]'I.P[i(p %V!_TAVM1^'`Sut'INO4*TPohuOjf"!Rd,1%:A0E6Ar=D/EJ7jAL*bJt^"SJ/EYYj8`s?8;emuMZUt\-UcG/WkU&]u23$qdq>A[s8 %dWmaS+$1m4/M\?<(6poa!lIak21c9J?qXHb=JJV5rr^T\E.L=9`SIYr4O@aF8?kboU&Vnt&iGYfh.m)%7)bJ1PGLb7RZZe?NAH %]L=uI6p%*;h.#X\RpZe&X:K3O,0$iQZ'8enL]]>f2r$+WTnG.d/SlCP/.3,NP?h/;AY7Fb_T.9?-_*mbKRWDP#`%bbmRL<6EnU0I %"ssj?oJFJ^=0Z0=RnWf*27.HLXA$bu)\WMi[tXeSA/91mZGhm:6tb?>J06B^>:_c9Zj#.2`#bE$+knJ#81bIj<HCDI#VOS:g=sgI %MQ=b@ipMP0<$3m]:Bm*W#H>kk&'':PPJLjq8#1Mansa%#cQ(BSc4[*RSoSXWg,<Eo,enF)4/?E`EeD_K1Vla*P&m/SkDNMVjWR%e %T_78.4(U^>!=g4LO.]-a57SVSCeJRH@`b+uCpKVu<%l/<G8fl,+LnLiVN!,bNV,D:`!j7U'?jW<E7Q#&iKt6r(GFJenY)?JhFeEI %$R^tBoA6TA1]8k.G[3`kW:eA^K#/MogPs4-l(OANq'/'7/5?j8ndC&HR,&e=5c;")>Pr*^,LD"h04#I07<TGX%Ca.u,,j8UUsFZ2 %osb9Yon7VW#e1#g7?A6!B@slLY<a<bGF9Qn=?n97c%=brCnM>LGhfY7:qr2D.dV($2Osmp:A$G1A@t]5(;j`g0t&G5&s<@VZ3@:k %(q>K9lUHk$_aIb2=!Si;Me/em#m_"Q#(TGSB!S'gE!,SZ;0'EC?jEOEDrqUQ"3VpDHbq9H2N)EbdKanWYs"4SZ-Huer\k'+n3!$\ %F7(.6Y]u)<,#!`Qk:CsIL)UnX%c1TGFE/6Xfbf7%kA1b$RooH%`3(#,7hpje+fLMjlC\[V(Bh[=Cjk]+<lRhW:OY%r&NCJ>]ESL) %=^'<1^to/f&H!mJW6%HCAH@T<OB+<@Sp23:R4@?TgBo=65)>ma[q,$Gqq/Ie\pD5a>nQ*f*9p?`!@o$j(-^KW7*Tse:WD1^D?Ml' %`Q>9iWW*4&bBecoDdN*MA0Z[b>B:nj-Wf8'gBK+E`h!T6p%ZZO_m7NkZGl@N>+IWgG-T8H=cGWKU*cLt+@hk4EDF)+JHjcdnoM)4 %qdE`EI)Sh$6Ggc<(FMkk-VV0`0UqY&$0DlQ+m!9jb5u]\N\"m:UfC*&O$L%O'>BHR@K1as/h^P$Y5m.Y23P%G(<oi">$J28nW%bE %W\"WrXjTT50jJO+V,`Nc+a=9bs$8^+eH?A[l):Ps'LY*$/W9*BO^dRn>NR\W0>QsM3OaWS)$39r,QU@(jY-p5718K1lqZ%#m.Cj4 %*W:XS@^'+;W.]C)fQbu?G<_%E%IXU-)H[XcdRNeA,ZkRZN$G-#:#ojN.CQljo,!QD"`u::SSQ6\PRrlG\9#c4SB)i[Yfq@b1]rjk %=,/k:U"I7t<\rN/2S1tH.uTLU,U?7-VV@3C+f-gWX8T8!HG5%UfQZ9s"PCpYg]-o_?upu(X)54O.hP%&^F,YeV9)@k*pJLIST<ct %gBWpSpQ,u`-%<;h!s0[\)h_kY8g59[U?qWdSAsT#p16*f1>OqB6e3<EU662;Np+I;!C$hJVM7+(P;>uaD_.01R9:c"m8Du'Kf:`6 %`u)m+MegKQ%_IJ8!LYULX"!MF.T\l0Y1`>DVHC9!"o"e&=@m$1_Kp2^Ju($W&54kj6!8e]okKsdaq:G@D:-H&i(@mWncND`[+m?X %Cu?TiZ/^G:L.]YnE7C2DT\'_4@NGg-DVqZc>Ok%MA?M`=A:](#))ql*jFAk'.KqP-Rql4!BTds#\nf;h6P,?.@Mtik/'$3TZ9N/` %'`62qY..SlIcOTl3JD/sae&sC!G'cX\]Xj:#''1W,8s?iG)@Rr1e=9'/L;d/'K`4G+s9f>6>7Gc\W!NKK/tQ5KG$$g/NcT<mYR4h %>l5p:307T=.b2H<GqRb4^`%%[`D<]\09jV"*[kJ:Yh*@tkjN\)-pta'',]Iom$KZ`L)^]\V&PT*KS75ihiKc0qh.=[/<D8Z-QKu5 %h.I_Q86+B?*:h8%k8Zh)abeb5kn*/\>S,V'Z4;*=b(_ML*98,L.G?'h_HNNV4fZdi>h;:,+Ym$OjMNj7Z4HIFQ9P6Y$@SOr3.o7q %$&EY-"rW6o;-g7(<qu4+[V>m=L_ro\(Vtk;.N,.,#bP`KgD3Kl+'tErGYJa!eIZ:2`J8(3`R0D0Va2;ph&.'FD'5HuhJMX)q7E>+ %^*[54*XO$5/0APY\I7PP7i'B@W2'1$l&M]<'@$j]e<@#pq*aP3P`TCH*0]&EoT;PN$g@ab-hM1`qNL8i[mBt1A1uLNlSe5H&M-9H %X*,4<1..]QB+aYUGbqgWaLjdVBY?j_q9Z^<]*L.Eq2=V'6YTR2j3632NQ6k&%U@"jlncMmA#7U7NMK2/V=b`]rGp,bFrOMYd38Co %nf)!iF3[YC3.aR\^Mt2PNo2MA'"-oDL,+Qk]8fPp4cWT'X<5aLk.r<Gac1_!_a,,SD'35l3NUk8#Y9g99SCq,C]rN$90Q^",=&I( %W+mOXUD#&@PlTEdF]E9*5icp(UpUlIdC_^b,[Odr94?8-\&q[#dc61&C^%>S]s08\[p3,FE#5_^e!^Z.SB@ht"VG%t)@SFbA@p>n %%%);M;V*6_2k!C-_':HFVc[!UL>_qJ#_NDRLo@l=E]Sq+*f(f[)QkHB,atnLaL('do@74]g3#tuas.%?6t&WF#r#,RER'Dr)51@a %mkBQTbb59C;&o-PN;R/#=&rp<R&5u(Zidn,*tUHfq!8ROX%E\!@N1r'RZ4r#qVWV?c:j_W<5<Cnbf!Y93\!s]I)LS7e!5ku&'sb5 %OsV.]'ZlU2Y'>:Q5r?D#JXc%L!C8sP8!9:hdS^[96]dhc3EooJRS+MB+NT2V3nP#7b=U]"5-qQ'_bO<jVBE-B;Tq-m>Y^$HT;\iN %%2;QK6bM5X!nXHO77\ba3g@E'@L4P8Ns*^g6'!0lf)0(+;%gX:)_jYMZIkFKI0S/\k@/mJq[JiG0"NCcR#_CnQPV>l8s)+=cAot^ %[p4EPd_P)hRNuL("+!!QUM'@,B^5i&7kdNmMl^t(4Za!e(i2545:"0,fFFN0_-lV%9Ns*mh-aQ*,%tATI<Mq.Cr67bNm=BH[U674 %Pr4Zt$]n2N,O/l8<[#7n]AT^-)tIm_>jGtU/4`ca[d=ePh!1((d]ERem:JGR)c/F+/=Ojs'(dGQhC(YWGZ"4H:I)($Yar589n5'9 %3u:rb&l]'(fd)Z,DSo*?#c>`b.U*$U^ng<.OSiY,<At2F))E"CVA[`R<<89>U2MmiUAQJ&>Z4Z+3('B4Pc4['J$Ii'X9G=DQ8M87 %M0j<A"7!g1<<@P[ZI8h6c='"B;ZV]LjS[/<(b\niS7dpM,QAb#df!mFJ%4$@6(7Sd\Y!0Q[$BFmC1^38(HkgH$GUht[HoPH1:G<= %*VugJ+)Dk=Z(knJ2L_rOpe2oW#0@Cg,qn#P=F:"H.pGF:$+k+XF)lR6!KCFV!JmLliI]QT?H;36Q-D%(:39<s'%5ePoL.3Y%Ke#T %r!^DH6JcckgC"kO(3;g*kTjB4@BoI1DD[\83=`Qr<KbUmUimldR!;gHG)*PD'(Q`]LR"ZtQmC@Hj^8]6*Gt[,-:nWcONFu]R_8>c %_?V\ZZpNVC!$RYAO]a&W$(S^GQV7\IkZJD1'oKtuJ]HG!YkeB+bjX:;O\e`H/pB9"6DB1I,s0V4r='U!<44cG8`4t)_A>2gCPMtR %'ErL:")aF]29Sl>I:69S.n%'Z+f][ul1RdZ<Dk!Q?miHtLh4J,D9o.s3J4"G`2.98&Aq1BB>fh6%=XU*5FD4#k.EDa0KeW<1Oe-/ %l47nBPKT[Gk!i^$Ma0t/%R8!c]\>!MbQ/io@h=b,qqu:rA_q<2nlR*!2I`Q=N*WG#Mo3o&j5S0NA-X/*B<,-$4:qQJ/pKgnV<BpH %/kfiK%0D=F1cSKs<"m%[75Sje-0+`j5iC`/Su)[Ui)=.M7U3m_"9_C\Dqir;M8LD#_AP,0V8@5@"$o1C_/eH10jHd8HmjUm1+Xa= %(D[8'*kRV23?LgN;=<,YannVCaiAk\b_')VEg'*ZfE5$SEqUp7&R"lC3$,W5-0g,]$+(ugkL`stKHFb'XjsSuWdFGA<2NX?+On<= %Gj]QD%_:eP/p!(I1qqfpQ+?(f/K^h1P<U:r6%"F2*LhGH!.aBdr#hJVj9=P+CLjU&jP0)&de@SKOlRR/1WCa`b<'/fQ3tN@ZZsA? %Q-&J"ETuQEoJ=dppo-qNX=(qo[PIZe\`K_Eq8cQ(q@Ksto$Lt?c#FA4.ePdS'P02uC7mRg-1U83)+Za0]-UcMN_!<Y\He+uV$?tJ %k.VqV`H+7ZQ6\fiS>5TsKB:>9:%u<>N9!oW)aZl'QR8C:VqkO47rCkJ^7$X>ZcO4/\-QP"I_^d^dW*oF["DJn$\X^t;%*IE(F#tP %@&oH]iSEITlZOms2i<N+J!Tj^mqSXIo0.>h2E=-BZc[h+gcD^[>fbUk>H3F=,SWYA6=-M(3Jal6aH"X\J;FeUk1!sEG&cPs>951& %k-(A;Kj&(2'.NH6A-23(EUiDm7<<&H3YFjQp<Jq>>X%_CcT3E#[P!gC8`Zg:"X26\;U.VH(&^)s`@2p7VAic"]k+W&C`qfsi6Y?D %=`'\_ldfOBH5oqT(mTA!fl&[,!4jXg\KAhfZgY/f@R#+$r>Q2pnI"Q=SUp/T,e,(eco_pBQ,ja'1Sn$1ONfb8M:CXMJ1#GkOY^W\ %EBF;ld.rnEVqu7FF>FLpE,>&lY\l2G$6mlL.I+_4gC<._dJ%t")'@L"&m*],=W2J06dB@DD]VY,*n[9bnFP9AQqFqS)CE"[+B5>^ %!.sTM^6ZRH&n7G!OLd0eQk9I/$[=-J&FVW9$,"@$0I[Hobs'`@'"a93aq9$D.*>g[_%L&82BO5:>4!jsd$PV@9V(cmRaV^4"9_Yl %1\LP$m*$uG00p2DW@PCe3g6M9X3T[D=q2133*G,"o0"%>gaMfQjl[bj.&lWU\S5J2Y00fJ/7)Qg2=lGI6ppgH#Q?(fEuJBWX3;\. %=`AOL-q]4E?Zfb3:,0ElXFQcM]EpZ;,XMjdK`*7B?p_NXnVtjS&R?8[aI#GhG$8jmb6FhG1*]j0Z_NV02eR*`!F9Lgc?B%nj-5T0 %m>Og`iM8olXZ&5DfO1;T<k9j,]EO;ERCm?IOhc*1^6js;]NQ#4U<A8-.MMAlenep@IcSGPibW2L>-Q/U4#4Vp%T=d4JGjEo).qZ3 %ad8u:oO*['Y3cl<@7c%G_)HkjU-gK8BdQ[m4.KhPc;&*c.nee6aca!,_a:C/Y=D(RY*`-%OX3iPL"YSk1tWc`<86JO(t?dOd4@qQ %K8QWRq65<W$&2`$J_QS'"X?$s8iNC641]uKX?0fC:93Fe9F(h>8bbsai]a4_*BtKJ/jkI!CdrELMbf^^&7W@]-tL9h.R+>^Fsc6O %J0ZWQV_q^&SYW9l+]8eenk!nrIA*0T13]e.F!eLb]oZ%F<mjHhSg-atM!^@^Q(mZGd#_WW_<*Q^%\[DkFn4OK>prrXZ;mfsS/R"# %?F*:8Y[$/DS_A2&^(f=qWEc"4Wu5mr0X5I-/3<:B@/sI2XrkX%(5=.To+`_",oaRjq7me[=Dk!fI>tP_Y2&!8'C8=C4ufjeEXrYG %"P=_6iY8sZ;d#P6)kG*6FYGEb%CcM[.=^mHMD[7J`aXX81M.imq_-Z3]T`^HP:t'n,=I@)"5'\0*s:@CGT^Zl"dd&A`mmuDN,_r7 %i.8*J[/hEQ%tr)_!'c)@JmOsX'Eo!M'd0=f;`Q,;Tgu.<$Xco`SB5XWQZ<'KJokFb,S(nW1B9bJ_6=LNMKd-O*iL39aUX"k5V,IO %[N``_+$t%j#L>VdhjK6W0,sdTG't-:#P6:6NL=ZHruksVlc/G2fghiaO\;^k\nT1XUaLZJ;XNBg?,U_DaLcgk'H\B<F#c@?HtHX2 %^utRF]H7^\^&WqI"-(5O]"*Qs6Skf`R2#(#7?;g^X4E6>,*DCu/:W-"'HDn'fr@mGd9Og"dI+l)cbHDm)>3J6+?6.5`ohjH#iD.j %CK0Z_U7+A"3@bCdH-'#nr^!4g._aOb61g"pr(S>A1+%Qt3$Obq'&j[1B56Dq\ND7E>U\9cje]s!9I!_NEIJ?4dY!jjm=<:JA.(WI %`56W3@DV;R9M$c?>euZ.*13H;%QJ<q1M:[d(k>McNftZ`'nVU#gp:QLfl"T"QMH%ZFsaI@-Q(RGGZ.>F)K:G`c3<nD]%CVF&W5\8 %Y>\%B;Z\9J0%aE<)'2HUK\Ck"5#7&B.VU.N(^pTgcd!TbPk=7u.-Djl*,I5MiSN=l-jGHp:%a4B+9S^!QJS*u$V>pfmma(OaC$qI %:[DB6#?jW;`5qj/]rf\!ZMg9eQRB>VA]Y7/S<H7]'+8E_o>/Uf"DcS9(//r(pq0r_j,H-\0Ud'j9(3Ho=cV/Y0p]/PWk/phGF%]i %:M%ia2)Qqr7'i`diFG:="j#hUo>WF!W^ZS)[q'#IF`4$dcaY7h#",Q%JSS?;jKNLFQ`J1J)&pU(97E/XCc4K5(lO<t3ut8f\(Q26 %*qQod-4]`,!IESE'bno3/tRGsoD!u&,2F^O]PYb\lD*1ELQ"/epu.]@Q^laEl59?(WhBOI'^?0r[jAA607$(#XRdeG^nY4:"@49t %gnA!e#+^gV3'a>V\P'VQ!0\G0nnuK'RX"nq$SnXnT2Bp]Q:UJ[M2?WO&WT&]8\W>=:+bOb#^o92KfOd-;SM1!Ed<(@omoFcjFZ5m %Jg%>[H=/Vlr*?\<_lPgjR(K`kA=,?_!fnc`M!\k.QhhsN/f(.VL*>srjEgnMdlF6eaA']qcGlBLW&`T<6fgiD@LGcQoIp%,:!suN %QZ=Vp-W23'$Q&,2N]Cu1i[n/3*O+>[r]?E*bJToOV6Y>?0#r:m!=e-3@73:PNrsE2[?/"2p\9p-!tRBV`R?*kGnVNs35VHeN')Kq %.;,8HVO2<g8!%#";W$=<3R!@X:R38[GX#R&K'$\Ci0*!QVcd\,+2,l@V)=I2*RMb6J/!Bk<Wlrc0=.3"k:@WaHo[*.i+t9@j02S( %X$n+m5/&Z2c7.$\$J7sLIhc0]I&B?iI5>NE[-[?.>9t6'?;Fu7?ZouU^*V#aVn$-8VHiSuij;+fK<H<AB`8$6'"NUqZ$P*^Zm5[7 %cQP<nro@>YR*)?T,u;60f'*2a5+HGu<oXf\^,@38I-[<tg_f](b_7<rMPNp`^(cX(oGMKeHoZbjR1A)5k].,_^^a,k,@rcK!2h:h %:0$/U;\]9QAD'jU2*feD"lN>^Yk%E4.h*C>,e9.6b#AIN]l;Gj.jB6rCaFYTWVf-2D,mfojZh=/.JhF#`LjUOBJq('-0^6Y[`)>p %pi&V,ndk=T0CV`u+)Xri0[#/t[;ipIJqHIQJ*?f0;2d.g7&Ef;a5l#^Z=nkq^1)`??"R$UWV?R?^<35jcfN$IpT%C!?S>X9Ju%Gi %>W$cGnGSJ7A?pu`5iBN[d;1H%:%:[!XrJ\eJ)KiG?7tC",$`l[j53tiau'R>o*@Kp=k7D(OmMnOCj@c**+KUta1<A3:u[Z[0b/5^ %TZ-umlu3ua#a.d"-C89ULO;?1+!':?,%q^HI;IO435%0XA]pTRC4%@hDk8EQE]P$%fo\m#X7g1"mke5Y?um`n)ofiQNUmi(R)J:' %lHRe65BDQ72H;T<aT6`P>J0GM@,=I<)Sadkm5B]aDuY$o6aYNlj`P1!&M^u@0&^%d(O[e1f'B'".=N]^<9%pn$t9\XlH*edE#[JL %L_aIg7l-TS!+$IE;M0^UfDIIal:P;lCq<=jo"M/VOEC\q=uk[JcLiGe9/2_A'!W!FB_V$@Dguc4/QZid6j!!+QOCc[Q_c3\B%@38 %-JMG)=DU3pbH6-)1_pJFA8.9uc\_NN^"q>!kg]ePB.4GI!7(kPhH[KIg!iI=m8hGP=Lnd+i*<HgV&ZPiGagQt%MeWH"ha4bA^d7K %!Pu`1[@m+LliAc9?9aCrUa&RN^70"_lVQ];;PKdpN:B@4.3A;6bi7A"mh`He>*^XiI+U5A1rb\jK%c&$Tin[pn)D9pMWSk%PWfR9 %nm`*ZS2&/9#A'e/5SEEf\YZl&^)P)RX8/i@(koAD1r?WA%?^a]i-'Q]8ofq$[[3Bo]G%\m!`KRbU5TPM0UI`.No9E_bIC;,5EQ+^ %6T2YTfp=':@/Nbqg=R=$bN\dV#^TL6ouW\6_,V"]kf,D`cN+iN2g>Wk4]k@;h,ZW6*0"E[_j@K?gg>i;7prKSr87h`^i9nW;B;]( %BSK%uQKg^MJhZE&^-r..=jNaQ2C@QhOsED;Pb%t=0JM0\hFc.q):&\L3F)'qa'`;NGU8'--V!Ssdd1t(#9>2,@kGn$@Z-27e+dE2 %:M.46_3Kol?lL>MRL`,=bC=.lJ!!s1K1/R5=-!m^`M0mm9+0dFYN^hebbdR%&i0Uf\Ai]_f;k-;(bp2<4/06(kP<n<W.lDU)2!=3 %h3R$(Yk!2]5$OhHAC^5W`&1b)MaV]tFNHGu,"H5?pgs/JSZ_ut2eM[5gDs>/liBGbkm^Brag[i7,J0<hE81TJ3N)/R6pqf`i_jGH %1Zu7+K!Zh8c-1NO\1,Cu/SlBaXA^U,:n6Wrm,Z>6&Js-cTPDja@Dl=.Kk\6+,r%$8YtLHpV&T)"Mc>:_r?+S9%u<2jOJ6t"&)%Mk %4qd;]%sai7I\i4d#VRP2@[n*El5Qcuo&V#_=K/Oa;-C.#ngq)=.TMJ+LEJ^==k*c^+!9##FMRu<OADFuP.fEWio4ZYoF;lOKdAl4 %,*.0)3.b+-HT&S+"ECq'k'L?EhZ;'>nTKc;UmDj[50EV,i'>C8'tsE_aG6:1iuBGl<K$DC+,SuOPAZa1T5LrrQ8s!,-(QpgQ->BF %NFt*03;(5Q&8#9%i^$5Of+-VRH$Bg%>7rf_EhRBo]+XVd1kQ"AFI<HY=)(&H+_6p;VSg'lH98t.Ec,:;3-<9a0UWKKc]Bn.GS?9l %-R3k#Sne+o3@Wug^\GTSH0EE5Ka*MZ"QG5bXC:.S;4f`ohnM2@\Ja(:.Wr<t>RO+BjYA$Z4-j2>#:U?X)&o^<qbI&1&mt=ABro4W %epQ\=r9?8ZJ@Pjf$R^b5p,d[k:KnHMY12+s:d`VW>/\f(DPV]^/X3YpU3K4gXm]]Q6/gQ>NA][Al<THN&L3,!7D@:dRk'N$D#7Lh %o*t]3'?N\df(DiU`8!b=U**S7Lb4j):^S7EU[=`oM[e&Q1&:>Td?<4())Ic6]P`0R`5YRp'aj8NFN1:rR"S@Mf1?'9)s&he[bM8J %HWi_`n(L=:Yr\lQ,jccFAU1><?sAOj;O-e$>S[e)Dn8)dgO/d?rQ_b0AMS9Hht>r4382Bppc\AVG&Z">No<n$[!f$&38]Q`96i's %eQdk#$"PUl]bCqmSY?VDJH!jO<M'PW<l]?2\/()R/hLS6/GB`<33e'F\<K$k++=`U2:/-0f(!=A\]bA?fK+cJDbg.(RN-/$d2+]Y %YsVmKl2,/PBH&I3*-349KB!n1Jr>pppi@PUG\im@hValc-?4/MW\S`p$-,#`:^"Hh%(;5rcJQAK98A5%Wmg^i^sP&@`].-DEGFIb %GAY7-j>orca0LK<\k)W7\P#\9F0*MHdN?-E7*l<0]ZQ4^B*G!7Q0\4J&)Y7O2H$Em<cT:eK+fapL.eMpp9F&EHmcLUa1oVLT=IX, %$TDOHL9$nG?M$-[qp,&S$/DOUha[c=gK5?>7IDCDE+/o>E3VI<lbi2Mn<7pXVS8MFWf6+M<S@+-=0(Tk?d7c63[E<s>p$5'UMZf# %k9BX44#kc<Am@s![L^-.UC[7/:fJKK<Q7!B[tk\E<.<UJFLLYLKZe;1:>\PD8)$S&hUe=q=?8E7"%R<51;(&VGn5\nF-Wu_Op^+/ %Z7%hj^]L81Mt.3>E(bZ+r.OZeLuhZ[g-0ll8)%,`o3C].F`:4^a)J:ECY-V<LEk+W>X]8%X\<D6aKr^nlMOWV9l61f*H*J'L7<Hg %%TTW:57KGb`eCH?''4SnWInddekAIhf38'#eibj:GTum;gp]'&;OEU.`1OP]_hh$GL6Fen/_BaW>%lJ\$Cr>UrO<o;lU]5Z\W/MC %+2<TNK:_bhI!f8GCl#*5(67HDEje!u^^5;=8'hL.=UCiY#=G2b\*pAOBe=D*`3W'Cb7<[__Go<2]t!C/+(r"soi?[Pda;&4:KGi_ %YH3Tm?Ze!9k=NJ,rudA&S[OTiKqiL\9_E2h,Be#U*M%2T3_S)FZA2BE/q3GWCK)*7Rhh$OkmMr6QcgjI^XejSeED5J%?t%9aePqh %4-i'r(<Vf6A3?[-g@qi>TR<YL%i<QNgd>"n/SW6ERrV&9k$1u+aN7L@K]EV1Xl9*t>Q]\L<(/<UgZC]^(<TlJ;*:r"Y(n'U4U3f. %5pt@g:TH7B"dI(a[BXB(q"nkbZo;6ra\Gj='6_'B#*u[F@+?ND;>S,JT/A1qrf(A8plmgf06%6?T&;-%lr*/I;JJ7(RP_gbR,46Q %iQigE.W&Iilg=Ra@9UiZ.QXEu[Hq9R/PO,8f:-u4p#@S;0YLSBe=&]60(>i$H*iS7bYTFnZAP[(=YQLRe_55s^pA3pO@'FV:SEO[ %)L..)eI&pK_B,:2R6m6$^,*#dMTpj,YBLbO8HQc`,D<IT&b3:d<jhWA2=R\Q/ei\+:Kn?JCZ%&^UBY`*aRA)EN&tSXhR8@<WQ)JF %nAWpAX?s-b!/)Bk[fR.)bo<Tsoc5V94DU8k"lIbWd_f9=GSr$4j`VZT4ZpH68?]\)a'G#d[](3g>#\@"K216io?BY5PGNu/NH,os %RC_o(87f<1)f:S;FQ3"UKY(<r=>oE;mY@s,'Dc=Oqi>s):l081\UkTEUGB[>[BA&&j',pBbR-?`U%IAlBYK4u.-4':hp&_;VU6m` %2RX6HXNL=8,91GpO+eC8Zt6Ef7g7A-4Wg`RoML$\<?!IKlc!ld>6edkE&'%L<oM2Lo]+%lCZd78[;mOm6?*!eC'SK,VF^OA>>h5` %p..$hd&5HPI6XujB$I,*Vur.Y#sGXl6Sk74>$X@,%o"\"e(@s-@`rm;#DR4n>p<bs3Td+7>b_WZcfQ_.[<DL*d&`WMC3Gm8ZhDbs %(7O/l[488#>C>-l'-Xdt[F8),;,s<!X(:$E_aB9qD)E@q7AX&?FVJ&)eh.d(aqDt+Rrn0lB)e-%KT&o:X7%J(iL-khl2a"hKmEgX %kAe\OE$q9u?)DIZH/)THp&2B9RPcVFOUnT'gTe$BbHQmRj3+[/<o9%s_\6s61,#q8hfY@>c-p;(W*%X"AmT8X^8Dq[a`[<je?H$> %P\%HepS4$sL/hC6)'>uE1![ISj2qb8)5Yli5-(E.q_-E/SL7Z%T$.8%YH3)q9[5M=4k*<8M&'rKR]H(c[8=:=MW,d:k.ZUr#DM!n %`JU_0U/Iq@jE7oVFXLjn%=r9+BUoUS;JXl[$Vd,P64(isIUWg>2UE-cX0qTuoOFrqa/$IA2e!i>_F8[ijC+UCDT;khF6<V\mts+\ %V42"$5H]X9c#R7@IBo4BFtL)/JsLC+[CUh`YuLf9(%XHdP)Cjk,(%D[XFZ/[IP1^5fnZ.M!7LPu)^sE.Mb3t;qcI#MFT=i"YSpdX %lOF9jX!E]'<"[?SN9pf(Em*ttND/nqh<"BI#B3r%YB?DEO4_=s2H$Cqa4uI9i)G9NN/Q4X>p!bkL\Y"MVm+c6ks[F/)'@fCH8ZRp %>>Q]g;sX#KDkmh,<[63f>p$&"_ei!`5L(\OiB'$5JKq[h3di)334`HM*f"]nmFUO,!+1KL*00U.B<5a("ip942pt6hbFs'+hhc7p %EMHdY%-ikLQaMIQerUT8>\D[1%[*oqRM2<n9r,?sXBhWtZB(/kj=J`CWdQ/<i+96D/urL6cdY:fAl>T)5c(*LLK4ZW1JUrPY+KtM %NAo-VNosk9en+3L\uZ;cPi1+*bVKU;XAZEcmlU%k,]/dhf\XfbbYnm`/nSV5VUXik=ne$E3c.X]ju^5h4g(rP+q8OU%ruY*<]Ik: %j'jsJ_^43=EtNCD>uRrqC[,;2b?VV2bH^>Ifn!CCO;YH2Dsk7&7p-[VP6WXIB@`Qs>SZfQn(B<I`-DbO9<3iVX?]l_D\"A+;Vt8b %Tij0%PXONdO7/e<)OfVaea!"ap<^NPM"5ZRFftJ*Ep7+]6BTUbTce:47&s4&ogCgsf@8Q!eUk/o\MS42Bj^HAk1mffe8ht(l`)%< %f&.<C>#LW+<>G),L<F''*Tj3E[O2]gCoH%\9hMOjT=KTOc#Oub7U,^\4gZ]];K/pF9A`N02B-bfj?9=1fT]TCZ;d;fe-H:gW",t- %f&&:F@hNpKl_L\EeABTk<[Oe(g;c+ZE41Y)%%!thgW-aX,OW<aGH[8F>ft!/olAf;f?h?MHeii&!iGGQ9-)XWiEA4p7`p</6>@U9 %K+mMMM;hFu[!h^4*-E(YJDsfSAh%@3RXf)SG4E.Q#2Koumq20DnZ"We+0L<mD6-E/M6)cKK/6SJ$l>u)]0?-6%eFPi#:QW.`\E3+ %5T/1%J.dpjXTOf-mJ9rZJ]"LHEQiiI*LnT)O`@WeU$Epc&tn=\cGE'^W_A1GW#5r+RPf@0*q>A(b68k2e\#-;6d2FqV>;762H$DV %f"$jo"02(.$T_:iVOQDG1B4AX)=#+aV9F1F*D;FQ$XZVSKm)E*F[L2?V<_W*iFj/\Z]eM>L[3m.7SX)Q;Q&p"mGV`eG%1kDe7I:G %p3\WW+#]MY=V8Y(p752JmmjL&S\C/Ua^(/dDRkh=K/5H*";`Yjn<]BABb*_qFHP`_9`/;dLTZS[+(C<:DX[gb'+8*Q$M^bj-[0Hn %3aF+K$V;<!1-T_bHC6icF+KR\d5mui,jZ[glDm<'=)=ojhJuu2OS@Tlb@k&?A6D/D*9j^8>ei>_1Df=[D)ZM@93^LEmo)?7DIO,- %<kpI_<bpssksr2:9&R`/oih`!m`eda8P'E[f:nM=!:!b"IMunE<e=mhQ[\djMpQ<G#YnF$_RePqW1h>1;(+GMH-fQb+R<"gY6FuN %")Br*AK0jm;:k+0=^,RjbR4$=K_;\Fcl,QqE6>RThbVllP<l77i`s/q<XNu)9D?l*mCYM<IU&EHB4'q-]7(Z3ek?Fam;Q2m^5(iT %BS'0cjnjN)*h)o@Ou8c06!&bl/1s"\6UT<3-DA*fQmZ[H7]t;71UYT2R2"A?Y.:1,LK:<nAt3nD\aO1f6i0W(96igAW.*r'q$&X> %LfWHG_f..d#9g20)eBXn[Tq/IqXPY#CRIik1j[^([Y)-@0JdTH]tU\!S9Zd,ITTK>DQ(]'0>W5jm,IP$:r,N6o1"K=Brm?`47OmJ %D3W3h0-U(Q3_1Q2VI5VRFIfL[83GWF\(tekhoa/;f@[8e?*hP+CWC8B(iiWSm3B&Y[#L?-Df1!I*Ltj&2dEFZlM=%u3'=*b<tC6L %b6Q@)Mk6KekPk[5kRDE>eDG>=G1'UAX#bYN%304pATIdiqJ[Gpf>%u'XA8'W8:*>/FeVHWYmOr>A\=gXSuXu+LkTPCV_V9b$sk*5 %l#N?&lXOejBH&J^pY8:(i)C1g`hh1!qZqO.4O0IM(\8D><?rMG[a2JQ0uGk]r8iQe3V>Mdf_&'.d3`%]FFtt8O]j04JtdK\NOeLd %hEeshIs8CaHu]!ep\!A>Dh%B@e#3)(n)aH>r?'n1f90J^J+gMKn)$7_Is]\.j8AMdT^5336\ZTZ7pZ.6^o?O#cUIlo?hs#;UQ>FA %Kmu,Zj0+ODoZu"V>;#rrhgur2qQN!PnKhD!eYg>-P.hTu?iL@]R#e`3_r'K-bqEt&`M4n1LTi9]E[2F_'?W;550L?,E-T;CJoSdN %nt(hhU0k[ZotEQ@&arroTN41B`pT\/YP^dILOCb'j<G_^$fB%[-h_L+3BF611Hus=2moiI.5$"c'eX0/9l[-P[_f\*d`jZSW^VZ+ %[B396H2eDi6aMa,_bUKI(X_gd-G\-WHkjK'iN\$rVp7#A4LfJG[ZIi[`WWdY9r9!+]B)gLohqu)!bg_R$1_.d)EF?'dcC.%8E4,h %'qP"p*S/`S$8qIFdE7n-.G%DFfmmh"iFHdUPT(qta?BH3OF%R&T@3pA>&`dd*`KreX_mNrAuU9A:L7#D<'KYj6X^!`7tIFP>hR_' %j^m!D08sSM%nsJgBF(&gbM!j(=Noia<JNfopiG9aQA_c[@NY(;$Rhj4__*`p2M1JCR:@pmBuX#rcC(o(>AS-Pl%@,_*s'/dM8j %Wc;i,J(c?(1@'1bBf55PX5]'gcmkRa<$Mj]\"^*J%>jJQ&Au42WN<'sP5;<%Cd@C.d#tq+\XEAIgqunl\JNZbZNNKe`WRa63u*uU %3q[4@1BE_9`<?";+s#8>l+#56f,B^-9Nc,ZU-#pRg<eNA(+ie=fmqe;WMOZiEl/"`\VHdcE\F0MB:/`DokF`C`H6P([*oM344$c_ %*QT4)fe),qZ!6j!D$Og<>#X#%^.u)8AO:!'<<i!_8@LC_[)d3l[M?ru*N5>fr+(n9&Nr?O'8Y/=*N2p*;tXk&*VOZL1-tp)>.[4# %-2t'/Y#Sja[B+(>VNn,l[*"grX6#5a##pKhVcpotR%PSrn<60+7J-L/Rm<cUm6LMDbeO'aV]5>QT^Ke[YHbKE^s?i9k_I:je.OL: %E]]JX@W>tq<:_Q=`MFYkMbAs`1/ht.<P'br#:^2o567il6G_!U"*MobJofE5jjQsBm-R'/p&$\UG)N(els(]>CV4+k=js*,.oRrK %f$I6]qQ7hT5jcV=P.<oi[f`\as(NVM,'n\R';Wa;+D#i=KqS7*:48T)9ONU4D8W4dBsV"X<O,gYV!IM?0t")s$)COt<fXJ]L<`?4 %.WdSAp1%k%>bTs-JJAjr1m!%r4[1kHW/p>A:QqdSr*cKBp/YR9N'LEHQ-h@61KsELD$4U9.EB!(ZVkXPH+=nU2j?E,oI?JJ.nbf+ %)5[("B68J&:pG9?8Kd^N3dtrX:hQ@`9r@@MLRgcaRsq?Ar![)A<"r,=4qrtA!(\iIXD*]j<48&i.5qqZU=V`i$rVtgm3GC6]"QWq %c2@VALqSV)mpE6b9mJm$Ar.:kh2sR^Ddnn*Ws-H)-75/GOJHe>l"qQVM5*!A</\Po9'7[QqVC+NLB^V=1<LS'=dt+(_[Od<o@LBU %GV't!e\e`t?]3DRYbq,:WGR@%Z@lhk"m%Mlb@WR`ojDj>?u6YrK509YVu1[S(Dn/g>jB/VI?ZV:RbHAi?5%B>,rL<,-s)&786`pr %h==s[9>!+lFnWT:HY@N$79/oeb[NW@MQ5afI&WH_*1;d\3&igITPW"mAgLE-TT5#(>a44'Q,.(aDeg?5*.D([_<.q*X%%1nfUGud %lI^]I>;KCY)JZZm9sU7Y.s6J=-3glpd3@$ffl$MCo:*M+<oL"#Rqgj4(LbSr-b!jm2N=bTY+ARG;`X+rO[5ApAX(kKGE'J]0LIY= %r7/1^`rZcM4j:KuU2[35I@Y,,PPporN4#>V;RVNW4kOS7\jkZ.R^!cIrp![@UZ72(4kNq*(PQ?nMrLfP:=cGE)/MV7'adIM]2gm, %op].V4b*3c_D1XFa8[Jb30j;GpJDW"%KXKpmLU=u,?p_L;WVo2:uPB+c'Ck9'MbbJX23r%YuNbESi,#MXYk2t38)p>lG;2`WDtoH %"n)YBW?nA&=KRs&b?Sp92#E^[[?UUjC[4tP<<emFMCkm*gobfFC0T+)#qi3c,[Y3g<?o`H#:[f!7mVlUK_@"P]ri4r3qbY#Ud_07 %k=-bo=sKHU':NnVFC/GW<<LJu[M3;4,=(X3C=JASS(i6f8(Bk?ZacqYCRT+k8fO1LT:1<HFD[\Sbs?B&*$k:Mj*J-.NW8R+>CJ7W %^W1;<9ib0Jha@CG4\BOhL!l2W].^dF/;$O-QhD;i1Ph=kRBM-b50,%'SA!Ggj.JB'Cu#hA+*O>[haq0m^%CF?NW%XVe!Jh`^7;R5 %O2qOFo+6b@4[848T6WSV/2J@]GAkDAng8"2jLHTu]L'PB6(t;&]dp>$^>)"0\%ZSP:^T#rTVHD>4TW$3:02na4<E[[nf-q0.A41p %U9X7u(P:q)k_sYU@Z;mNc\I5\Mrs!M71%,2DDr]V%dEr%HDHL'D9[hVKo?DnDbi[!#r[ueZ@YiXf;GE+BY]<Zh\N(7$hbnXVlEjR %TDK?A9(9ak;J_50Z>j_@?o6.lNr*g,&Zj]/GT"V,Q149RG="25i"Df,hl;60Q\2#&374$c078Pq!7#i5<0nRj"7WQ=lsQ?1o_6-+ %(riKb8?S%l!L?8\XcoUi'S4g7Z>&,n@<"(5=5dRFY^VWH5K7gYHOru[W>1Rg;Pat!gaWnFTj5'1^$n#oX//dr&_\JB)q.%Q[Rasr %?-N[3Mhs;sZW[Z7/Qn:FMQmcCEa''je4r.2dlTG,ek]3kW&;KM'59^(D-.6aT[sD%c]G7Ip>[]G>3pN79=Chd&Os)t_Oi;8;R<"[ %O_2U4Ojo"(d;su%[B7dsW2btH;tX$G1eFeG\$?n_CKfcQO0r%jQ#SP,5[%-r[[*\oWp.\QdaWrDs7")`8*$n_("Gd2k]);[O2b?] %,OCLJ3f6ng<md/HmFB]r>+oi]&.YdH7,HtJ7t)plAPb-tfp.5*fO<dk7]dMWeB4\D]Z4TEmmu&5pWE&6mdYV&K]]\Q)HX@@X+?[Z %W(1G\U`P;r8lI(<dL]tc]"pY5@5Zi&VAs="N,R7T+)@R8Z^=Jd&4h-0`0M']i_KZ^4?V&gJZM.uPhnr>(ldghffZ3@A1+&p?uB2r %fjHY<VRSHoL3(mg`!3V9X-NNXI;)gna4cQr*jmbp'2?pmLA\q6"<%k-\#fp"e4NO#id*<0[M`J.?`VSugT<;)m/U?&LoEhEbC*T: %Oa=#(ICV59b(iKn2B'pHrT/80Hf05R7p<2#BOip5X9k6:.[gbo2aFP7D+C(RHqr3k2/PgOE253_;q8cBUh[c,&:L'UlBWH27Roh? %VIM6ZLc2!p#arEASs#F#U]&O].d^2r@&1brg.m@)DJR#=6lKJu)WbXI^)Ko:iK6<r$?A!rA#)8qXIb9rN&B>\U7dXJW1&9mWpC&j %r>[JLW8>ED9CcV<Y8d0P&A9qQ<Geg2a5<n]$:c[[ibVbK8`a<![Is<]_p2n@3/lY/a*kt*@mU!BdGn*#)Vj21qn5N0fcsF'3iMgA %q_3:tqa(P9.re^#md]WrFYnR[a7WMhSS(n0f/%=%^cQq\LO:Em1^G'1I(%ok;nKmN!#suhj]62J2Z0rC@cVDr&1,f/%Qc?5U!aGd %.\dj*+L:Q+r8ef_Eo_N6rDO`NRIOU,fZ*7'-1^W-_qoci3"2qUJLs'+4Wa>oSr$VZ@N-Q0?7!D)#/S)8'SDP$==8*4N<N!RFN*+< %@Dr8\+^RgWF2#N4Vg-AYGV5F>ML(4$L#9?QS/EK$j`ckA=U8E?T0pd(_k>4%TJ;6.N1BL;SG;:FR%_8Nn;EM6@OCS%Atf\lH+0L% %Ni'8r8X5("Z*akeObA:>1pE_Zp?30%lSIts^aU=-N&LFS^sMYPe!'>f48#HgZDhEY+HO1E53n2jk8_7!KD:ZUq4'<(Z?f$lEQ@rP %)ZuG+JDN/23/h.MVd-dqXN@0dq1NnEq!8+7'kDRVrb`S>mtRGVB0:BN$iH$cd;TK)'Zc(*n=!Y>^=S.O9KQ:sH+Hu0IlZ`!2fYDa %'5H`]m55boJe#.4lGPh)hoS#WL7+>fioE[XhFNWbMlc$,KAJ)qol2/9*;Ol@L6^:CnaP;Rb%dStIg(tXaC=PG4ZYF>*U$AR[`;uq %OmrP-qZ6*?JG="IrP$%)W?2>o%g2+#"7!&llM(7jPknfar@joD3hZJ`Vg]I]57XV6#Lj7dlA#E5qu/4Fr\gGK2P>L;:d5DfhtQkC %l>M%7DZf:&!VOp5qV.D6GS8n?nOt1P1K$@\h:)+c6#$-U:iTpIcNZi(5fKk/<H7=i`J&k()jRN-'t6]oALbt7FIXH:ZVd,0-oq$X %Q<OSt/dsSjW,*Jf\JJ%,(ed139Y`]VJ9<OHI=JHNEc.Q4r'7*<b1o8.ob.lA'+bB^&-`dZ"r#AXpL6S#%MW1c.()q*3`'q%SUbQ2 %!S^u`dU3.)?ip3(G.MQ3l+/RqCSS1XV!IlNRs%C+>pnhnMJZ1S#.cG#<nF1!Y,buC>A6p"#.e]5aNJ[2)!JOjctfD^0[Ot$&RC_- %\um*L)pmIO-D9hr`O[Z2FBo>t*DF70R"2ocfBTq$cuj?$f1'=[T^2F\Lk?"iK*_g9#mc.ikkf_3Y"Jk&<s)0L#tT[Tkkf_/XpY>; %(C,8'<#,\LY+L6GRF4XX2>Up\K18J3n'OC3Ku/g1-VYM%?J;@)>(8Qrd3+,DUbID-NZbG+8:?O'BcB=k7Zc%(;AqgcHRt,>PPSnG %"5@XUUcJLKHV#4BR!$<fnV0mfX)Q5!@I/m;c\%sCJQij4\20#3I!)AG:G3X'\jpl'[>n]#R@a[iB8`ei;,Bu6<(ARtaMA@5<7;]7 %pnOKCc[/o<flR/V[R[dp0CqFNr-BBpIH7>=f6,E/K;.Pg:c6/e+,+.ZJ7G3m!Cp"n;;A&2g!@REO%[trqjbDXMDC1N*&ZK"*k%K] %gk]m@F"^"&R9bk8cM]kaqg^rV\S9BeK;.PG$T7+e+,+dRJ9.>=kXWINOY:$^mcS$54.8%i5%jhS+pT@5[H?8j_`%*h(ietb`o>(e %hY"D=gs<mJGOK:l<S4E>0IV:n?#7^fgGJ^gk,m$:8*FQc?rZokHdrr@T8.CS4Oj;`i"ecfO8QhV449K)T8.At\/OD5nCQ<0,Et\> %e?7-2iUA8Dc_e`:dZPY_0$HM`;FeO3I8J_sS:+Z(Om#(7_@JoA!=ZFBil==D*_77N#m2;Y%j[0d'SgVb"?*V)d;)"Okn,n`?SIi^ %^Rp*DOW.!;@hEN9Ql&&TKMe-VbfjRJ=uVff5F@4'R2\iFU[^l6RN=\\MG]c\c-Hla"ZZf$'_epg-jkS5H7\Cu"qq[UP;+NpK*ciT %\eG>^'F0gV.LUk8H8LEj7M?I@P;+NpUC#Y*1;Tsl%U$!cYltfj6!543kkj-![L/$:_/U\bD?-[)EMq_E89"b]N$*fTUqXm_QE,j$ %%B293hhZ`0T*FYiGqO)uk7W9)8%;<Cj%$XTX$1sQV]bH_lg?Olqg>?bZsR%VCKO<![Jb-m+3N;)#aR0JVdGTm^f"Mp'>X,89S[1P %jo,:NpX1b[@\MT-NX&U_!j-lQYOnM]\]<e=8PBUi,a9[30EA%:^Qn7H#IY)23n=HCFAMB!h'd;BJ]W$GiK[Vt\.>?0%B$DYU"YOg %`n7ejU-bQ:>a[AQm:)]F_EB+9[&6n:hsfjuD(,Q,%CiU*nVUE>7e<,&@IdKK+rg-N7U@UaX(<bJR2Q(mD`\X<o_e,t5$Jgi+>![Z %]BlVX[4conH^)WV'B,:i%rtdN7^fF,Xc7bqHVKU9%\D4`L8S1bYL@"7%-*$u1jB*t1`AFH1L`Pa]5M'&JX+nFH[eJ![Er>MQbH57 %9:=#<2k7CYjK@8PSn@f4:64aT!a\,fCGsOf?pGup3m.uWWO!f-Fn<J5\O2d$iu9L,-!mA$f<P'Y>8,N#%`!eo.H^*"FI9L(Gp+%? %ghXI+_tKc<fegbFC.a`q*n$jb@n8&Xl.:Y7].3,95LH8k`VFqQ%ab=9?U2Y\h1+ZUe$IXn<G!*=@&K_c5S1CNhi+kEPS$hdARhO5 %AmZuSHt(P#3]h-_!qQJFRS)P,gm1W1/*D\O:;3u:=FWi5bnb)1WlDd)ArDpcGZ\\BJN;+Z:ijS/gCd`.kj.kcp1*?hQD0mU,*P/: %[EW/9@.oCAfFPFh4dus-VqX<lch]\3O@]8JlFAP)@5X_:/'O6LAZ?D!/tX\@U4(9i<b>8WL58,lSPeG%<lcZqe*JZBY(Be!:N:8Z %B89qTN)poI46A=^[d5XXgpaHL+ID=LRgC8Mp,$K5cZXmqf$FZdl_s4@(jia,p\9`(rX-hZc\=G,S!S_$"hG&_ecr-oTp=:F2hpe0 %A6iDLgt0Y]$)d0mL;&7C*Dc0N?_p9!+3NncP8tl?k"h6_PX%>;a-VPp[HLYWM+t<Z*Rat<*mO.c*[ldQXG*g3JU*3tgYY*J#/ktE %1%MpKUM$IX'Zi7t=rF?\bn)>!CF`q"5\W$[%Ji,n>rJ.Cp@fSZ",V8Vog/$d`d0*.=o16bPl"F\^ap%L@;<isf2dcoAW$TNDJVW* %l6nd\_cGG/:1'p>[3*^&a_;l5Sb<tcVOih'Vs8:Y=U`<+1jpD1K3+RSCrH!h`.5*6VPaCe[iL2*_S<t#)=XHXn$(G]/o/!+@2FWs %Gr#,.Q7?)l#!oXnNGi#ERi9Fa,L`EkA*1s5Cu<jtU"Kn:PpXeJ*A<9joGH1<Nm4ub0EtuSRD+^S@@T5t>P^AfmjYF.lh%]IB&FEt %c6^%WQAtKVb>8rG287:_l@`6TAD7W-oj4EKf?)U!1>^(jg!rrXjp;@XX7W@a_g.g#1XM@u1V.rXg/rE/p!coK*U71)<FZ#`<9`\$ %Hrh?[gqYo6C=JRAA),tnl0oZhrY63qCDWM4^M4]9#<(,Nam.`aTR)iN-0rJt26p0W3d&C5Ypo#)m#W4n9H@lHL%"I?eNVK@[Rm?. %A]AIe[RUbCaHYoSA?;g%Ic]q^aP(Dm9MPQSD]O9EpK+LA2<eE\d@Zj27$+^N_>53)G^Z-A:M&VRm)ct:AXY_>3IRG6dkZg4.D",/ %:Rb.fNY@@FHWeZ>L"t97A?)k8VgQ&oFi`jQ$0ph5=D%J<WS%JtHVpG]C35p&ABHA0MJ9GD<.1U%:qaj$Bpub2]eB36'_QT0<:_dn %qW1A%MVZ+=oHS6s^G+#6X4TJ?s5M;iQNq'94$9f_pko%Hce-FI3QW*4XPH$VO);3f7\ZgMHu,;NJpm,9H0=cXY[84eC)+U%Uk;pu %Fq/XK[kHURIX.mb]>JU>mhHf6YMG4cEi*/0Q)Cj5Cn(>_NrMuMQ!YF:H\n[1k3g4cb:ej6IWlWIE5#rar%kc%T4FH.d,iC:rUEq^ %1L0mRD/-d/3cKYM)=8idAoI8uiO=+NCGqGa\psVB4eF+Tjs?gK'XdJjI_i2N72#WqChpc%_1.<QY0$F,rQWrId]/S6#63*\gt-E' %>VpLTU!BD=NgKOejng-8Qh!#=NXI\p?s[3H=o%VR=M<57csOF)qs*RN93/SrkjnL4nS%TFL?!cjrNKAA04*[pe8`7Tm#A\*TN/1; %c.9`^p&I<%jF>QtG6r\h_XB3Pi45tq+(YuK'qq-6pgZ0q?F,^cR]p,+Ph"]!Z!$hTT_q6Zr$A.a$G4>Zq<,9aa4asJ9c32YWHl`@ %d`[9/okIGnJ'D$ICNgV%0_d#>lGcKe1S"9^aeBO-^](hUmsjs!mJB[thuDXO^Q;ngE)cjVpq&cNQR'=NJ,J:&5?^;IkRj0@!7K1( %e+#j+s5RGr59--`7H;icI(&5T0dV#YYZdohM!XrJJ\R"\F)\'`.K-P(NHi#e8][68(QT9n52IBc[tFWII7VkXpLLC:P<?6;Tn`qU %/(6OT*Rh+"Bk?@%SG68u0#e(g.%H-ri[0Alr_&sZ8S\rJQlIP][T2Wks40:\.(75#d'brON[FmAF$(0\B_+KJVffncBV@q`GW:5C %"'FSJSN_M6IJ_9e[iaJAq=rS%0<+/J\8F@H&:T*+:LAMo%f!s3B@kb5Dnc&+iO9mm]g:2@+9*Qcr4hKG`aZJ^&dKL42E,JFS-=bH %8W/Fg>.3,Bk/D%;7@IeVF_lt@0eUF/H*(;*0umsud_pGPgD!;-RdaT_8$f4LlYN,8q#?/WEE=S+LH'`HMNem8rNZ`I,fK;O#eM[k %=u_4-WPGurhe35ujX'\pF]Y;t(!bBGMnkB7mt%jns2Wm+XkL3/gL4Gcs0,i=[U9hq^H>+]HE`gW`c)DK(h:KJ.UU,q#?_;j^NY`p %elq4+A#rtQ*1N\$=g@hESis8sC!d!_0>%/rigDdHD9R\gSiq-pk;/U[`O:2Dqu';D6EFL_iRqOKmq.!VbT5@ESm6V`PO6'_BOL5\ %1cPeQYk'GT@%X:<Ac(l\s8NqhSp:[e`dt7E.sdadSf7l\pSi_G)MV7aDs&aBpthF^rr;oFWhH]q4>5#f72mG3RR<OmDO@/'Hm,U3 %.SU1QZbl,WXJ8h?gN/]7j4-*Y,E8sBIpUf($[^K=Z(pXicOp^/V>Y\jQe8V(TZ"tj*6>$XSaYUb6euK7o-g6$LdsR+NT&^>,+L/e %F_fZ`G+Q8(AAW!H@=C]4()P;fdFgS6X'Y>nlCaITf&"!(mc\d^#G0+sQViCVeb6K[b&bp;=@\5>G4+b:"X&9T^P*4hM@$baQR48[ %AW2N2Bl)_?5:9`ABm4LR\\brGU/cQ]I*d!PU01:Aj\ej@X_1U7irFI46iUuGdhI]t\c5aN76c"nF".Q1Zha>_<a56LlI!Ufao-iV %g)iCan8(%I22$%1YM8ES\Y#q8@@M+DG)UEgej8^EmC#.HCeZF8nCbD]_T2:P+`&BC,+b.G:]OnE5T$9^^%I#p)bBn\?.MsW"m=\t %s#El&DCZC;kN%S>4]foM'2P(RoFmuZTE78lV:C018**>()XcAMrb%cp?\U9F;)CAQAS-n)CZ$@PF],a!\R0_ih\F&cCT`%#f9,Hg %V;[h^\o,-r:'3(LMX+jb8lrL]W4;NUD-Bh7"5$U#Y.O_Rc`M#VQLW_a1&,BDb3*gm-FE1'5b-ptN0+Zi^FXGd1DL:,qVh-ME6hh8 %L#*c/njcs^^uD=F/NhcWdI>E^i>>gtXnC-CNdZ9->SYS&23;HUFSWI)EoRp1"Xe#%dSfgLDbWDWB#h5ljpL)8%H!W@b_cUr1SEpM %BB.KfKTF-`q6Dh"/A8>n"Y1k:?/i9bls/>_km4anTsEZ5H,Pa^`%bqZ4fG][[rn;a9J'LRc0R_;4GANtMshR3G(t0O6\%A&q/hk) %:UOVCk+:pSSsq+K3$7hmodt;-D9p_ig"lrPGTQ5`cEd5AcO*\THa/.b\r5ekf,gt5%?,NbegiUDHa[m54UN\Elcf)Lr'_.-#-4,G %b4"'UgG8^","PmlHgt[oPjW,8YB=[\CAr[&^#28=nb!kDYmKSL;m[fnU-A7+rU\=Z&AhWIA-83`)(3eA`I:;Z4(Wk>7R*5,atY/a %;`M!7T"AuCVur**%ea:j54IpF*VjL^IGtk,h)!SjIJtI_V-NCSfW!$*m0mFVo?rTJ!3Z5iB8I)e$u_gW1WSntG$]!&.)aGK4`b.H %MU<m[7;Q8;Ie4E^>rdPO4j^th?5d_T[2eYPNi#.q-BHb@fRl[V,*CPBTt/TZ_R]?FB2SU#pNUl5bhF!n<[hXBo6=JJ1-EEWGC+U< %M'pSK's0)O4(5$j\'-ek_G.GW`+:<pL!M;.%*c&t@(Q/QEP)"/rV]O,HLu'D^O6'N^:sQG?]G+Vp,QDn4Si;p]CkL;&0@Z\Cp*P2 %j0f:VF\RniUI!6BS)GjlFU-bsf@u.1=Tj5a@(n4qJ,%JG(ZO0qqhsS7[+cDj&oF-$'3a8BSpNMN39`OBcQpG^5LYkV3h+H(&Ct!4 %:>J#T>U/[8p<6uQ&3d,pY(kMe;[_ST+nMsUce"sP[`<Hla19[DQPJC8ir&HRqPJBj:$]"^\`<L,`c5C?h-q/^Za`ncB6#AK_L+2" %'rkf(/t-`L!AkTVC4lu>XMoSrf;9)<_TPTtrpjW9Lq5h%i$1=m6Q`ZOT,&O'_"U<X*lknKO9d'`g`P,F$7#%SBl3e)]li`h0In]0 %8iA3gNKrL"25-^`(Z&,`=8KCea,\HJ,fT.+X?XFlN2(EHMl7.9l`8dQ5elM@`pqe9oqkeClIGPn2KNm"4@46:HKQl9;Sr\\YsWBq %/6[<p%os&c6?W,Q[$muQPsm@.8]+_<Aak.rIUC6R';Wb(IJRT#*]JGj$/uF0dIq;__tFt"f!p-O=:6a_<3`l3\tlhGhW??>'7J_6 %E*C8^b&\6]H;!3iIDh-1J16T_F$4SR%osO>O74$69VD'e\,lM`\*YYME4*nl'r*TB>'>N7_pto25qi!f@$6t_/O+igZRHfP3g+`. %YBc@sV?Z`4eF?R\44RR_4XM>AU!'k/Mcgs]3gOBP1::l:f;:#,CWoC@:=rE._C/7$-<.WmOXR_0g2&TG*`J\[N+^JspZ<7IE4S.n %16d_a8$M[O=AZN`Cp:"4@PjaibW`*n+V>X>K[bBi\A1F5)+)DA:DN8c&Jd^'X?J8@?P6.8o.Os[=m6fU$o-9PCEU[5k$u:TC34VW %fYk%G[Q-/NpH\HI1-KQXd@7S]1,P]\0#.GN=3plGeR.t,D/\<\f=Nb^3gM#O@T-$O^(j&45O6uNF<5`=_o\0W.jPuZVPgNJ2D,Dn %@+#6:Tg#/QX7STQn4B^sFJ&k#N$s&(*0!2<qaeDH#CC>Fi9kK)/.FG?W7tNBca#<ZLaXh#dTC5alLlGT\2TW9+a!D!"1u[Yj8.N/ %C7o\f>RG(+2g_FLm-\2-CsI9*Z7X?f*1Q]X_DE1c@\l"men8On*m`D*V1ra%jmGiL\FpHQ>FmVaLQB]m[JLBa$j/H1)s9Xek<'2E %=*rGLN">gJ;>Gus2K+SGFlmq"mDTX6*Gh"DMNVL`2hW-Z@V=gdJ.D4j?.4)\gkO[1`em]rK69;b([Ybb(hmY*a,8n'6<LPcR%ZnB %gF)pucSI\5(X_W"o@JKi'&3C=%XJ)?s'H#EH`/(9a[L^'7h'e<8_aRprV.k5?3km%Yhe2/oLhT_;;1+rGY=+#S\f#%,1?#gEEO#K %C[0GU^5pXS?_PRO^Dfk6B85n87@.l@c?>+m**ejTLAO*fqh4H!5+oAK3`AlX*m8LW_M0CjNq*JMW,/le:kcs[\(DPFO(5Gbg+d\* %Zm-C!9#M<IQIHYLql]J#&U.nFZ-rX=le%[/X.Ir1<RJUW"uWg#/&0B;#PR.;=fAD\IRfI3*,@N]!BrP+Z!Yh.V9p/*VYebGV]Y"Q %>[[W?E1Wh)\1$(;$n?_@9GsT^*3f/#arH&a>K?Ze=rUO0T;R6#.`<q!d?-C#WNGjJgBD11BDVoiT]:9G[&/Gras2<C3D>Lk-3<U, %TfU0FXPJpsZpS%C4bo4`Kf:MoGXUG4MD/FcgP4*ci]ab@nB'6r$\s6Qf"F?T--Cn1X3@.e8UFo9&$eWs3=r5Xk!kKVgs`#.BR'G. %2S*:&qJdKARVgA9:.BH!!?8h0fP59.'$TN6qm:AjmID:QWHP+Z-9&Y^:d9)rH4XHn?O=DZ-*3ft59Iq,[/aqI=.._*Ye=:$$\\t; %2&G_?q/S:U"!<ioJs]uIL&36`8')IVQ57?K[b>9uV?QVQK<N0"HRu:R1Lt8A4Ot01fMmDjps;W3,E@cDBqUi^&RWnZe*kjHfDWlH %o#0X$B&YhXq)3G"(b^BC,Mt_4[<dM`-h8p0J7.3%P$G4=9jD0J>^$[cYB>RG:!8:[eqA2=961U/qAI#Q)5McKo=1;a]G/^_"QZi+ %f`uR>L!-3YS`t$b7l]RMBJrpi`o,-hKT=01B7$S5O3m>7`19D!"!.T'B5Mj@5eI/uA09UE$u9/<K>cEO5M>;Io@Q4\?#'t.=%BkI %%/)q4'Y`rpV+Q>jq!=&u\'7%gKuVO=2EdEd2krm<U5EY@"0P1K?f?Ag"&=T%4&G\t]pei/o&(*0@<%'Iq)Pru0LONJ2sP_p\=c=0 %AWBRM'4RnbAs8]kK>Z/RK"*,Ngk\24:<h`rHYo*&XQGrgZ"5jZK90QcmthXZ[gT?mb&5(0R!q%Ji&q<'\0!sX'%_,[.<LWkG@A4> %C,Zs;Rfha1MgaR>iX!;H(d>Gg?LR4V@$:e`C$@Tu+f;uq62(X,2+hb]NXthra.t]eD%lV'?5iUm!HbDHpaC$A'[@Qa=l"XQGf2VZ %g)gl)Fi_L84YhU/EGC/GQ'es!0!V&DrM/]<fsl#DM_?8h0%33*!2ZsJ`"U;M<>3<b^12bYPgHKPi(_-1oW6+T?Fc@G.-*_dmp^lI %.*=_j"Xp%EA**NTJ3@'H>,X4<kgBB<,>]\@&+1=]H4Vre0]Yr1fg&3:W.?c45/DXZ+7H,j,Nd7jW[D$]g$IltMHbi3im,(FM)V%r %r5tMM'Un@aD7`$Y$e'V9B8XXbGb7Jij6A)p]sB?tkH24tpM]Mh4\*pdL3Z%M8(+aBGVnm7Z_u;AG?h(DDpP"^TC&N>'HGeeb#Qf? %8*6QS^_=BSlWhS\9Ur56qgSOl'r1_Dc@(VmlUKV9Ac^NHpIW3s^/DI1?XLj;VM9im]AH!F4DJg;52sjTTlTYIRuOJhr:-=*79r.p %=T]/G&&0pofHWfNb?W84ro0_>\'fk`HAp-:/Srjh=@G=Xo?+rO46uVs:aaFO=YW9>!u:Z%&#WM8!W.7tdbl_Ni7b[O^iM-4#;rrl %`<5sKX2P.l0nOTBE<'Ar5@Pb7i`tUH4:sZZYqG![mkMWE6*D:birOcS&LlClPQ5$$_O2qOWZdnkTSmC_XR&k)U<@EP#hp9mX@81E %T5f_"VkK0eXkTmK6UZW1aZe5'n4CRe7moI+$E&#*.k)J<<pF;$rrY!QbLp:_$q1f;eHa"pX)LV%k\s&1\,aY?N8RI$0"4\;Y\1s= %ck/So^0M)G$1Y,hE.%OCoJPrB*p?XceK<ViiQ&>3<be+^.rc@b/gf<&AS5H]%3i<jLp1=-=n7RHKLN<"4?F$2X*qh4l;"kE4!9Ns %AO=`IN.#79dIADoDNBmhe7Tn)(]tgoRi&i\'p'.R_7:Vh5+6D2b_CO[`cAO*8AgJ\lP[RLBWY8dU$"1le'Nh&a$'&#I@nQlE[]=r %Y`+PO1rG/<",XJCJq)^6a*qGp/]NCQ-Up@GGkD#&SXk"(Gr@JNO(#;B+IdKbO6>G7Lp%f:8t2M0X;_?!%!86Ebo46YG3Sa\_?M"F %jC3i`*ap+KI8P9'(,9H\W=Ag=Q\Fo!1HL2+Ctqro]ku/rAd4jRo5.!f,2NjD];NH5q10"DMU-dNKm!Z<SZRrtA4BD#dKQ[R/NhB^ %J>r');hMS^F"Xslh"?I-l@b626'(4_hEmbEMJh)P"Td,=q(>aJ6cNW4L5Hn9gUqI&YEpTcXI_%t]>L%#.Gg$@bu-N1*h\FF['@-) %7J=:'9Zc9T0"l)(YL'sVR.o\<$7*`/%sZKgE2L\M%H(c&N*F.QpQKs:Pf[P?AGY]8XOFP$5ob]c)K"9Yb\U\[5G!i"g"n]X"Y82N %qqKj934`J;bb`*4;"oUSc,3_Q\f^J>8I5Bo&2"0p*44#oTN25Res;o;l*Fdihd//qU-F):YlUj_aUf%H'r\?=9F22aQVTTu#%+e8 %=E;s$Q-!-?2kL,sVPDgf+:FWi/1um?JTlDh`07tJCr1p20"N`kL?r]j\BL74m2\Lj:Pdti2#YnieIOj'bJ]ngYtPRs<u=ZMQ1r]V %?e=Bi16j]X@jr4.WlNJ/+-CK$9DtXZB#9"&VLsZ"hb:Zpi<?FfPrE.]<&&9D_B".X*YTTkY!aq<h$s.;`T.8qFf="9Cq$L()X3n< %Ur1CB;&kCXbb@cE5uP;W4S$[Wqp[3#6PfnMe%\))gi".XVQb-2)=SLo&"$d@'W5d;alUj04".KjP>!rXV9rI#-T[f0XoNMGW)Mg) %@.:G[e8g%:>em5%7+B[o'DZ;fCJCo/*T;\h/K/pj(igJV/faI\C\Be*nE0\3/%pj/*S[Er3O>kHl2FdIqLS!W[B+7o6DptE3gGe; %j2U1`-I5#5@nkdERoTX?"bA/t+IWp9:sJS`"4,P!n1o2)Eeb[6cd_Eum5s*RVOV>oqTeu6GSIZ+4gc"s8!:)Gr7H[V7m]Fppq4o. %Wr`!(^,GJ_#Bj/GMgt:ubZs&pTFF!I59]GN!Kko?<LGPE5qODNV.Ph3^;"G/XjEiMW]&BP*"bCh@rH7r+p"jU*ZUf]9b,FmO`Qd< %Z=7#q.OsjBUi4TJ_&r(Oi#1$>\CEb$!CV.=*Ce9dWsZH=_m!:T98!*$4-6Vh4BpqAL3i?2[SNo!"8MX]=;nA_GL5s!&4a$9C_"$> %MtBo.HJhf-l\ZRjq>t1;fV:7qDi`HT`*s![79WdI_#UX\!V_rrh=H0pRa#)NnsH$PLC:>=BEANbq[sS\*85&id;%kRgem0mgG6VB %dR')9]t-:/Fgp_JJg]8h8M2N.pFUgtV'/^Jc8qS'lei"(0rDc:>.6H-9Gp*V^@d$>8.GFsT)ahrdk+[=V@::)X5TQ,?DV[>AbDLK %Uj6WP#"m<_:V*O-"$d+"qtEhp'9A`@!CJo/nBAG"([OVa?/.]6p],pB9c3E\"ag;7+=0':OML92hM-<HNc%9qn6%B=SLHh,JpFAr %FM&Mo"LGc";S*XGI\lts.Y9=hJ>\6$W=H+A=,+&P#-r2rALIZnSo='`@fm5;E$7#Q:(Y@&I+q:TO>)2_;U#U[Ol&`M*'P,lh+:VE %=Uk^+/?C=FA\JWf2[.RHU<lo;\*(,hiVBs4NNU)ZD?"9RSqf:R-!2:;WGc_!]+->]^O9Ar0CAVTnTTITra*d-FF-7!'fMr5)C<,1 %`I8/UTX^C-/2g5PNgM3q!C&bXM)]-,Bm.*$*6TE^a^*6-`kqhXR\BXu6S>g1jhlZsID+IVPc40S&BKnTnajstYh'IlciDM/OV %HamlS=qRc/.DhP7nG9h8(\./]jjc7Jn6h^J'S=QIM9I-,[\ATpL3+&nBqkoTM[9XKH>ZmcI/c7k2b$=?\-3L55:Nag+2D6S93e8F %Rl*cnfO0\m6&>"7i1qi!Ob%]d+g@-5*B6taE(1?('rM2$Q\htc?-!;=&sS:5WTML,\:Hg%V/Nd]mSX]BeMFg<pku\0gFiu3ATj;q %J++E?P@?DUU#.uLQ1MJHSI#OrF,6?]!Hbh"(iI49YLmfA^\6T`]%6GlZ?!kc]7rE)`$6mhZB^?r_?C?V*4<4p$Ld-/Ftjd*\R#&" %Qu=B:<t.tAO<`!%#K4,1B2R76e&4`1L,Y/$lEsn%EYG#0[LUR=q1KU1a]UulKJ4B?-3QH?VRY:j;l:sIP@2-@iot]P@)=RVId6uX %H;PN$#/SD/`!l!.nt*?&b@6VX-%rPl+T0=c8t;h9_DiY+?h^7C!)p_,,l<^E!er1H$U]KU+#]jVF*.ai%=X<)r#F+B*.SYmJScnL %?hjKpQhP"T%%=jB(6LKP8L_ZW.kN:m5[]qfb-9i].7N[O+YpY?VE*&[AO7Q=jp8B`V$!6u``-mJR%"-!$hCeQ"m7[oV;k^Q:5scI %ZHYM.!VmE.XGgP3*;jAB08o/V9b1"N^9pY#!%M`;i@GdGAZQ$aa=.N!cK<E2EK^5?A.m3HV;q$h?GITQp=nRr8]jHC_&i/=EDK7p %J4&4IPE7;UU4a'shh3eVP`;5in)BJo%1J!%_%lOp"--P#][Fm@$85[Q,?CHi;ge4AcmH,M=DEiR6K:k"?ML?YM1jrum=NIuO>8@7 %>A?(h`)dQOf6GjMRWP:S[b7T,*P/=+mFZERZ(h.9hL*pIe<]#eE.DSqcIQYF]6I8hb@0OYYOEeJL(k]\G`5^u^Bl%[)G2O<L,pVN %c4j.cXMGRif/n^NP^j'XM8B[h$!7e"[m$`qQ>mDP&s53O<ZjD>]$Z-GJOQ5<!@p!,4ImoHR'fF>i!5=P#e@O,2:Slo!67eG8N,Nm %ME<poCj,jigB5R8G&sWBS2B2mJLH<Lme2FVmY("P+QiC#:>"gfd'6s/r4///V;m$XZ,um9(-8_u=QHm,W.mHp1Wqf".-.Za!_&p3 %P^^>rh5)SH`h],Vk`b"#(R/k9%uT>XW1cM1OC#"\Ds_>HkI^I2`L:00T+\V;bjQl(DUDl,_E)"W?e_Dl@PBb&;VJ4#8kc,nm&Uch %oB$HCf7^L%;s6gD7q[0soEanT^N=uhX0Hh7ZSYnZ;rUfVS;)O7KmS8K@neqZgGUKT/M;8rVr?ep@B.gZ@s,NM_*)K(ZX!q!/OgBY %79G70H2#E65JNcnVSH%e^V,%Y2<h.=3$>Fh.Gh_-k`74-)!T__,N8+]X:m[K(dO<=c]/V=ldqK.(S,cn!e8#KHgq?[JL*60ZF3G/ %#@`&grr(7KPJS@:o2k=6lF,q2F#Y;D=;-l%YrHl;a>ssX9+48q+'"04(Tu5Y"URatLsHuFJfZ,_o%JY1rI!9S>!;tE[*o*uS(`Pm %`^p8@A?!*=3.i?lT09(b9SW^QXX=5JFjn@[-2NCe:l5:mOoc(1@dp%UP@:`'&P]3_6`UfV3D()('Oe0Kfmi<,h*K5PA1SYkf8e6I %YeuK'6#D9SJB3cuEJ2DNN4)4"9hZegOmfN+/LR)gDWmqB%T\uhIF*G5HHW,0SV&^9pp+O$cR=cl0e-qN%5@71JYeO7e>%senHl+! %k]kC';FkIea64`f;fnY])LMrK3EQi"[RZ7##g%\*orT_GSfI@nHTEtR5ma^ppr/EsKRk>1^NZ;C4=Y^3RjC(So0Ij'C5*l9G]tV7 %=&'s%EQ:XO`7i<!,bJD*3RY$>?%>8MEDXEQURt^thpr#K=;;a],M81`eo=$c.H.GhBU\3&_JpoV;oh&tN=bOF!f`e.ONLK\\68Dp %2+br\2PK\\$+M]JUdhc6kONgR:h&9D)d/t=*bRnD91c6mHU&iF$RE'mR<Vp;P'7o(59^lO(dS;Ac/W:RS4!>J.V@IRp;N_9'W;Yi %jl<BUQ6_p0K+iLo/ME3_/>3qXJPV0^ns[FQ)DNQo%]6J)WQEOIK-]\/)VDHK,_[.-C*]f5i=;)uEg%S,dkQ8c+EJ@BrG]?U(l*D8 %!j8(?K4'COi"P)f!"ET9:#p>hhe*,RjUVj'-%Fn]5Qc[rk6l:2Y<DZ[;2;S8_.LM\8!N#mH@(<.Ob/Vk5,g9pDo_c=lEtRQ')IjH %7@6TNLX_,IT-/Sq"8$YQZ,>5;_C+;A4sW_up''X.;SY$"@7J0KdRGAIV\9ch^X4^G_tP<srRtj^"(0r87I+=SL@TcpC!2E6Bfh4m %H#C;fN!"#j_f&P3VsD.6$6:I7*EtTlo7M5k]U'DMrm!cFM/S#N+STkBEPNc<Dgn?^&F94J_9#W-nKOD%Z\o!q6qgi!\K!0)eTa.f %Ut7m#iPJn8Y=Gm`4XkO3BjbL)Sd[M_bBQmn)#?qPk``/@'W)A%.-0&['L1o.fQ"W8#W"=Sf4m<$Urch]EVU/B9mV9,#)`-D.f"T& %#Rc:Q_P)A^Cf4]baoRuZ(0TPPNc/@%>.MEq:2q+X"sm]SR,/YuK&]bqPJ7t8X`qQ$6GSY5#f4\&+gQQs7Ct"3JKo'S&9)+<Vh'C; %@f&_^L2tV.TcT'),5BkiT,(^rZkP&[BibAr\gWhA]Z5)iR,g[I:'m.JI[pbXilP6qKm5b,D-[M(Q>lK9ZNt\76n4j\p8[VOX`@=! %]`A-0ji-mlW,P/O"q)SL)lIX`8u.:k=e-/UWDha@U>8[J?s(u]7%$1gO0N%8bf4)r7(KqFXG.@Eq&uPR=b:>I-\aN(?)5J^r]oaM %a)hu1j<IS+'^GOC;SHK=P+uoX'Y#51OVA1\Z!1T,$qs+)Wh=C`fg]@KL.YQJ-fbXTVCp<8?7A6a"c?mqp*S;*3j3oK.I:'q"V0UP %,\;II^jbWXZ*?;'VYaoOfWumKDl[qc==(J,>mM-`NJnr;:kIN?EL8a:"IF[9W3X%ZLF-sek^hVPej9cQM7@9rlYp,iQT.H^$71;6 %CC%s((g"kt,:5=^KI[cF<9^hRd-Sq6=gq1-X9BEX).hfT7LTu37>M^$`e%8lff-<odj,h3SCN9P-#07Cs)=HWC<55Uc3@1EQmE5W %-V'8H/g)V9^lW?e2Jcc6in*,qGKrH!Mc]-g[0p)D"*DWh**"#C"1,Z6b?$Zb!9jsjG$H3gq6`1uZ[T\-!r<(5K1g6>/8d3!f^IU0 %&9m7bd))h2VsN\a'1f?6^sd&f1IeVTqlIU.a,0n%D,oNu)f?[<-*Gqb(Y$<:-Uu&k&E[:.366#$[dV\\Tj8l]VrH9aG>4V#LF)Ca %]r6Ya%N\U>/:$!3km\e4BE8#d5eS(kb@-q`&3KA;`1)nf4h6N=P>\j;cN(Y$$e:mQb"a(?5WO%%rA1s7X&>5M_8GQKL"\VR$-H;m %YTBB0dmA>)-$%3Eo7uZo;rn*jG\m:G$D11`Q`j0QRYn#ogJ'TjK^])2RZ*)W\)n/N6`D1SO<,QU#$M?%*8;c]n6h66:cFu6$Qn]/ %ZbiKPggana0B:?<45W41K92k7+XG&\7?f3L58]28mKhgCLA\SbM9%"PDhjZL8>cKcnQ>i-?K*-*^(aUM#Z!#8pnCMi7Z+7+cKAA+ %N%"=Y@U9N76+cIE7rV3m5fC$E/VJ9pW.7"@FP7H;6.-kD][V%0*t"+$i)q'G@5hL(AA"6pXG<idQhMH[83Si:cUs89"lb@kbf&6g %!PiRN)U*p,p!75s;!hN^Ou8[`3=NI4HWW<-UgG#[R4Q(8&[?Y#+B*XS0Z.]8V7e@pnr^eOCceGNp_,!1$+XLRZH!?Sj_J6CF..Mh %3%dlG1*B9PE8?X.Jn>>q6bhDb(A3chm/12T/c`6>cTn+,e-&>h3<4^LQ_mY.Ma==?Y:Ko6RiA?33)fn4GS@Pp"&=1_cZXGs+jd=& %]i5c0ElLT"8h!bjbTcPe&IKWBO=g`NRN'VnU'F-l6.K`QGF5l'+feL0bk8;eZ(2$KMnHE##p&A0,@GAAi")"Kc`jb8oV8=,.Y4gW %$hG_a3;V9\3b=hY+H&CKJ^M&(;RQ@=M[&TJQ0FU[nu%HLC0Y9:=1XDr'@?f!'49%"'3:P;PVB;lmZ1%.;R6QGmi\HJ=oF)o2+t,M %/pD1aE,#,C+V:0``'_JM[ZEZq"\7-)WL:<\*\E%<R'6mBF-9&[fa+DeO;%$Da<_5mFljo48l?9RWcRrC1GnZ/nfH%a5r0Fg4*0Gl %&COI$^)Z:[X]2cMAKH1XO7X%b.sS)p`FfA\dZpFTCl4(cSEG6@ncOWPpmB_'%et[;<FREM"+(fL=A`nZ0LgihH-nK\4b/DfP^_dP %UPBpP';.gi.pktCBe%(=@I>4'gaU)ia5m5=ilrh>P<6=M!Q-%"%d<;bU/2a]\cPT^7(n!<5IeUqgVuO4*tYWplbZ6,.6`au7i>2u %gObi2k+(8_:^%"5bU6_qA6$1Llt&eV"Y6!&g..FI;VC?89UBm=8#).`WU4Kkg"L.<1Joa[4+@j@jm>gZ,?TN"$TqebYpIJp?<YqM %L7;28(S/stHoVBuZHI.eo'\VT1gi3N9caM8dVVG65[1-Q4=Y3Cpq7ufF1@$n90'0OF3^UU8>El30\\AE8<A^9,NNUI)`)moW-`'l %,T7>g$T:8;A!LblZ5,4d8^XGdMXeDn!u8`[2$!%f4R%?S"K)rRn.;VV<asU;L#PT6FrF5\-iX:?7FHdW/)bhGpV(;2;b@iV]\gqa %=gF]8`u29H]2]ZlDP#>/n$.Pufs@seCYM8@T@IChiWX'JFK2mYUpJR,qKtPU>VJ\s1*N<A^:OC$]H(=!esMh)bNaZUR0Bm``>/cL %Q8h-_B$i/sPWl_=f&b"O+>N\5*?K389>4>4kQZ[p-Y:e\4?(E&B:>4@6Ucs-epmb%PP@PPNA`qaFRj_gTJOr4p"q]g\;J5<]SRYr %LTY%$[..%-NRtDH;G>a)rQS)D'+ZiG-jOuLRdK[<A6*A3d5=78#lusmJ@Jph1;F*-jI=&eo%@0E1L.%[5:Itbb\O(MWG&R,]GB:q %DbR+DVM+/R4?2j^Du:*<GIp>FY0C;#C.3:/pjKbR(8+^2$m[/l6^UlQE:qZ[IHC:_&fV4)X<QkC=5a/?]^kea/6BVm"mhZoX.ZLn %'9g>,M[$1\FVK1XYfT*I6ns/k\`R0*mXkKQ1?"k^!/I*TC,ZsGoTt*QeqkEZ5cR?A,NW\Q>uLe.)1EVMY*Hm!MlpZ;"&KNYJZgab %d\6\\\Gp$n$Up*rBaq/8TpR5q'ZFQ_3dYE>3F\WoH$`PhRK?eN._ed5Vgh!De8.DEp4@FB)?$SZI/F:!E9.B"7(Ncf=&gj)F=J4( %i^cYZ%pUeRA@ZMn#`k=j4kDpK/J>c*lWgD5)bWR_CNHaORFcFj"2$lsKV^o;]Xt-/O^.:o7OR;0/LY^#_Y^foO>NLAJtrY95[?k_ %>!f/4:)'J([rZTP`I_nS(uj^b(?K2G1,-d)@;Q>h\QBuZQ?dT(bt<Z%<C]$<j1-LEr4%V-.d_3Ge@WbD0V7R"-[hMc@rk`b.jRmc %1/_X#iheh;/>d9g!T"%ffOVU.8SsaV`Jj[Un\K93/U=?/.uKa6:*P!R&@]2N&F!\[-iiWe]#?-rjc9Ji\@k0RC`fl!l<`(B:Wi5+ %B;,t8X&RU[0bG'C.GKQ?$3Y7<YNp<\&H\(l?E#2+7U\P5U-WaVNoR9Us#L<(I(_'HK<iG7%pkJ#"jYc8\9eP`gOgD0MoGbCR4"p* %^bZ?S*1Tt3cT:D)%1Jp_7.Yd9#Y-htXqQC8,nps\o,,q16eCF>p+(O%E(\3IpEM]N'-*`$,Xa5])5G95&Hb&8lg)S'H>BQb(Z9#X %pHKT>n8nm$2hW;2o.79J2\Oe_Z!-NEdnOq8!Ne3\Aq2rSI2IWVGqoM[K8c#bIGL5bjINX24_15>d=jO6*!C](bub?.G\#GZHAb+r %,:Gr'"D3+Q)FcnMK>kD5p2W#u.et;\AH6SnliBl/@R@Y&5Nt@3$a2;;i!l?P+Xi#>ZukGT&(]:5,-=jcSR4=>"Tu]2k"@q>1-fIZ %>SS\OM!Y'6\Cg5l!1jZqT)(KHeo`jS(qULT0%=V`6$2JLV)7@_]#>(]nPQlT=NRd2"'"tPofQObotXI[3/Ad`H$O-QCX`jJL6fr' %pA%Mpc>@=3s#"S^ODt9+`bc/jMW\Fh8P.K([%GL'DNRm5_G`t`Wh]L8%.YD'ZRpj<GrE"O6mJ\1op-l@2T[=t]]#Ap;<[!rRkV8N %,J"F69r"K)h_du94\/3-_cW9;V?5$&l7D^!gof$]$>nf.5.4!Df#e9ukPE&(!&hbt>\#_(<J8A"X&!5:.[BS=c6r8RqQg3;/g)M& %d+$Xn7-B[fV7Q;'SH-R?V&JKkGp)omFs>91hG)3Lj1_"7L\9\*GLJd(?/DS6j2Od5Su=PX]j90^>f?t!cC'NgU==.1HgM>K2G8;1 %Fta#<mrJsHGJ`rflc^fRi\MGXoBgNH:5%XV.GTS<R)(=&4B%XLp9>U9O+.qrOI)_Ke=.*($D_:;3:3H<9.IK(eUBuf!@BpO]"5N[ %rFY_eHFAds90+<`V@utbLUOPulUrs33j0f]I;<;(HaL#;i)`6'IQu_u<?8D7A<K,)THTgj?4F[\kk.Ru]ndD7C3r?okcocZUGPsM %IFXnijg5CSF%AgQqg#dq,#!&&U/5cnoA,(b8*;$CpCSOmL"st2?d*iAl2>7ddYBp)r,pt&SX#$hrZi&N-DX1cpm6$,M=\!]dlQB\ %%^4L@@"BG>d7a@+_QMfN^9gqYKeRaMSofZ)F!;\M&p=dEPRVaY2hEA6'/;DYXLk?J[`WY-j?r2$Q37!)8P'cJP8BIDG#a2lH%a[P %.t)a3>t0C")ZDt4XGJ('Odd"NZHO;I9WG+'<:8\"ij&1`aGi!Z4cZ)UjBf$$#%2>.e!G%Vg'T_8f6A&\6m7i"aWfm3oFgH)?qfZ+ %/kPf^<E+nD0Us-V`AGYKBKK]QpbHqV=C;;PK,J:p+rN\f7cuAXWhsr3)=C?n-R)C27IM^8p+)#R/]4ThJquhr$]b>JG:g**M?KII %CuEfPE\l\WnM1YpHS4q18">sCY4>+)M,X'J65oI;a):NYRZN:$9okRGejiXV6#/`3!BGIH%V3^[#okig-+/W`mR.n)("\tB;J\C) %<"UpC*p#ZOnk%!-b)\8#'$4lVO#`:qe8)F<m9-1%%jCAE;^Rp(>Js0I%:kcD:]NY8(SepK;ih^K1$+Y!cQZW"W&h5\1?mJ/j+q-e %"q`J=U9mt%hhfM7j^rp#<Imd\-d%<sO6oj-CRM5e'h(lm/3."Rlbj:o^h6>/&fLZq93$u2PnH_39jBO5RZ<]=UF`JVKt)eOSO*%. %/Q!]Y(;_>W,\ZHT`UEX"WFT"*`>IW:"$8tJ!H]RjpGWs"aCoFo)q;Qghe=+cjEbiGL&.j>bW5V-7USZG()R:6JT>^H)fUJQU(VX9 %cUdEIa8S"_d6U`nTBK5hc73]sS*,Po1>lTIm8'<BPBPfPN\pN](qc?E;=cO$d4.e`N7g!(75i=7I6]t_#]K\#prS-YHERJ8kXn"; %6KD]t.,RP>OEl#iDt?feb,QF3CLFH>O)*AZ_@eC#SGRp[i1s\AZ&dA>am:PjDW_T'b\J7c8Xl+[1#SI6,PuS$Yr)hT<#M0tL\s4m %\N^QiG&GGGXjIl7D&Tg["sO%of;+kdOKeJ>)[t%nME0R;#7mCiJ?%Am,6rRIq*o/+nka@W(flB+lhJ:<j15GMjWs\)8P^@LL%.FK %2JKt+.G<4(s)t!PIOc,D851F2/WVFLh')f7Q;r]4pne>Ninc?9@6RD$YXmY-.+Y9(V4uL-WbDbYJ\<HmhGKXoWc=5TCie"P#,lOI %nE6l1<_mGl.@m2jlL>HaM_8(+ZrQljH$XF8o5hANd/o1m"0Ns8r0\WgFd(>h-aS!BW]@J5nm^=UCV?1[F]G_V8qlFGDsgOh:%BX. %`(l1g-[]:8Pq.c^2ci'@keq/0),p/QRCFVbm4b`?,cT$g%)H'H/UdbJ5g/IiiFeu,bp(Z:p%=^+_PZ)N<a$BRHT.pXB+YSD4pGsd %"^<MiIZ2PURZp0G.ti>5d=?N(jg`0T>Sbq(7TH1G<0B)YD2p9/1pREt78j34:0)P+odVZG[d#Y5W_MbX7G1!c<e5=8)l8XhTW>5] %WXL-:2SS*G<ilW>SfNOhQ`*jI$^Pi&b6@[bW`\5U)2#`K)MnDr`%[Wmk]/X.oEg:5!=/_/m]sCD$T(N29KMOCc_Y+kHAOOY@Y$:C %4-u<JZL6,Z:n^[EPc&ZKR%qA[0]E7JI26Ib/ai]$bq,NYm1-58Hp$H'5EH[d,.AhNc8Pj%X:f!##afseKJG/2O_rhg)IP"on^_T> %n!7bfW*,tR=rk\?%/HB^D#6]=cmE&Gj+6OtOK>PH8^:2EO9p@giB`F['0r,qjgB#,VN$G/@F3L\@;S'N!n^Y]'XrC`V_]"D/et3n %'cBJ$3BkRXXjfLd3Q$nXi[XtY(o:/Ifd[6U]?C)'`<FFn2EVC'#.7K#]46fPN.JM3lk*`@Kl9/5RD[#Z>T*>&VhR:?*0e)5pbn.8 %[qcSU_2\XRMImm93Nc5>_dOX0TX2Ys-j2;'Ho8q"@W4A'4.QrbV>Z;:[$%?a,''t$K/9;k6%U0Z`(tK&*8kTmr(a_qj%t,hSFm;R %+-Db<lR&YrQDGf_.3:h(pPU\bl$J_A0R;FB>V(j@>';\.=BCsV<EFbH$<#J&WY=>O?.^?/oNoYg"Unl)/-Fk$7?csQ[&UB`p&!#W %N>lu`HoPG$U.[(@VU3W<B+5FYf+[2(C`AgV<+7F0j`37sp6N8bn/#bG(EH4;rg;-p(5(.*0ra,,m1#Nh`;?gI6?mC78Qp)ZW0"h) %i2C3d,_k4ib_o@V?f3U"2#7e!l;69Teu>?5Z,p5F:XK+lJH].PIl)/fOB6/1-RQ'>C$%Q@5TDBf2gL3k0fOq)>$!VbO#Oaea0fV; %%]-N;,X3W7A;3gDRpN(pUOgN4:,a10o@X-,4_3;"Cnrl#QLZ<TcTH0#^IO1"ChMKUGpZ_i=nm?peHV0hKICBTcCtEu\[/&:!\R<H %J;JSfno!tP$Lo(Pi"-!B4IZ\l=:/G9'G)a==dQ>\eA-DL372g'd"`*6"PM)lgZ/^lM,Mek+N]J=l12tOEStT)*kY[<$I_R@B:Z@6 %O)HD_4/Us"/Njk,gmfPSkD%4mOnQC,gTdWs=H8R`X>'=M!B]66Y$#t+l)Ms\c,?iUmWNRg_c^^*(5F0!@[a!n+Hl0&/RA>6[#QP( %m8lV%8Ms/WB9b&pa'9YEFL8^#A[,c3T]WWCO>a,A?e2)E@W3nSrGoa,aC7]GS4m`/:`o<'1WiTU+no@W/5haF3W.k5RV9MW]\Q=h %e"ViC5[PY66cRJS\S*oQs)ZO743F8/Vh`%.#./G:rXY=U0]Ah&j&FM^^3g)]Yq7M,FfSTB[TG)'IUVo[.u:sdE_(/O=TcGcQKoXp %0uDON*J/GMjj)UD3N5D,`0p?Qm?EgSiJF#Qnuq[]A@U:8OAKjCI$,Cl[/?WM4J9&2,`oMB&CRg@"?/tO)9T7]2!+lUoMs7I';jtQ %F0U#1VBEkgiBR[OS-,Z;/dc@XfUSsKBBpBk3jn1G/oc_5=S]WXl_=5Jj.;`fPj#MfDo%]R$1X.-C*.VD1VkpLoebN4'd#*gafAG) %eSX_S<SfPGNZG(X\&sS-<Nf4Y0nb>0UhM3SYS]\t9M0?OnIJGMnAI<:CTGTIc&;OrMdSLb!ed6a;i[5I1b]VZ94?3h3nhm00oqP8 %GRj>6*#lOcE^U]m7O8n_rBb`q2b46q7M#?%*/!hr^X&oP^2N.n'=VO&E?3c0=jGp)b\^7ir_ru(#ONc;5;2+3B6qV@+(D%jq6RH% %Cad-a<"<<lB&cb_kRL!t;kp*9Zk#auBY4uYA!X1:bVbq[d04:coe;8\McPI_dU+l-elr6G^(-;4eIu0flp"P8cCEg40%%h;aNNOA %/T$lM])[A[Q)J*AIp`AW/p.\M%An(MeUd2%\a7rC4p3@<G1ja`X.YiIjXOhV?a,@&a@elsjX8^MQ^\P[hf`:.`niF@L!FF-[?L+: %1c[$%>nDU2d>ODPTBK:I=re#4<^f"5!M)/0o'=XG?EYVNgQO]Rpl$u9^3)3)59pp]Qhl+SXL<I+<EFBiEVC5n,n@Yd/oA_1H9BJ5 %e)]"dfX%0-ZRSLMO0W'QATUNe:<ohGCZ;1h)VJQM"YhI1+e0@+Y<&1AMb3^8,`nM"cjS1k7hc\+NUR$`DUc`b%,o&4>EKKUZH+kB %HZ:*]T.V\tDJ!\UKX3t">F-Onjli;U8u6lJMa#J^ZG;ZJW`U0@e<WG.)l^A[AK8QahVN-C<s6pS6?/T.<fdmChT92?V`&=&H$2XW %I\MCROE_.5nOF:4ROeHsNg=pQAlq4(I%6?PF)eHuB?RR_mB3:e!P*?bnlibldOm;b.k!s^^.dC?GsO>o/2p'fi7fbpdJhe"MjNP% %J?$ftLf>u62OY3@i=]<E#.m\\F<*k7.(gPu'0eHdEoXKhFh54`%-s<X:,ib'ElK!q="]oIdE*]Z"Qu(mr8rMZY^pkqZbk]Fh+]Be %C^btN!Rl1@f^Idb7puf7,$amj<W<Z.b'HJXs8"dH.ZT/`ise"bES"alnKA]ck.?q'(,dEgA980@\Mg2tJ%jjZa),[N&=sibKVFL) %T;Ebd%[q,m<.t`&k/4Z1jX3Yd&GdV"ARRBk]0Kj>bA\(/7B;<IVGgu&[7KZu`$s6jAK)3$d[[9D._N8;].s]:;4q'.nqc?4-En1/ %$MN.,P(pH0?cP@>@,IH#1dOo"83di,2F)YK<C[/uBi:WVYKoaNoaiQS)*l\36.+\:p>YaXp%9Uuk%:-/)IW1L2.o9I9N;k+\eQF= %RQKcom:?/0-2X>*MXsIApS(%NiXqcXJTQfN]rd4D1Ynp/.t03pG.?2kbM]tVkF>^r4_Kp`\';!c^FE3=E9WmHfbTd`0DGQ1R?)/Z %L@Z5EFpfi25Q"=TrdluBHXsug$a6iClVaH]$/i.eVGQk/3O3e90nN$YjY[)spjUQ1$@QJ'kT:A"R2D&'M@Tnb>oQ*4=qdtj^4;1l %p\,.Q(,B]YAIB4.Z"R@V_tG8r\oq"4B6@:uB+Z]J[TI)8Rde\Kp'Y-75XAtup>+eDmIHu"LW5AX_'c0h[)5P,JWjcf/BO7=[A!S! %Lc=3Zh=oP?`Yt@\Vsf'E)5Iht8ZbmH9a.2%^6`IW[C@4tPpW4GMqA@n&0&-.ilR=]SK'lP[@>EgbBMGTh:3e9PX:,I'%frLD5*1a %9SX57$;@+EZ,_[sZ3h!jZtRO;R`j?BlNqS$)]8K7pr<)4qNiaL_.JUe'4c'iG7@^ur2t@>6j.lk.JCt/'YX9fgYF3WbI!IMGh"Kj %TWB%3GEWDiWgtbC1HJcY?Q5C(/-FD]F\lCS2./)-JS4:Oa0aLA5'Q<V-6'SDj<gg6#XAYCFcC2qDE@&!ore28dKY[KY#03te+nKX %B.Og`1,]XlSad*;.op\[Lf"bfZmh9BC/$7a?45QW#:pKggP&+299I<]op\?V55a?JhR[=fP*g)nAPjCVE)pXY=aM,dWt\os!N3on %e!72(#*5IL"?A\Pkikif"-p9\KV,=N-8MQL4T>k96N1Z#10mkC5$&2P:dX!^*$Q_#B\uSc^PQ4,QS?)49llg7DumAVlJl#.r!k#U %cZ0W*aOk&+-W&l4Il%/+\4a0n7J4k#jYlA$hVl:c=fqS@?!ID'miMI=,kWuj"hHcjJDLuRDn>sqQe$JL-gj>%Oj8pVkAT=Rm'6t2 %9OECpp8^SWT2uYo?[]Z$Su9]$56?R4n]V\Z[S*[*Mja>PdK2<+$XU5O&TqY`oL71kb8T:aIL/ctbe!Z##Qa68PaSQ/B#:\g3<"Xr %<U@*uJ%Q)sTI>?^KFj)j[P/Cq)G-1[:$"jV74.9/i\oFdbqGB5_@M(<qq&^'pcu.oe2JO68%L2EU(l$HAD^h:PheAj5m"?9A:Zt7 %N3?(]JnoqgM$C7n),6-B;&"9CZIZ/.boF)oY6G8Hl=*i&#-bkSn=[[%qNrP&aHA\J\70I!N[b#s'=I*R=8q^B8&P%5iFjBh1Q(`j %9U0@+PhK>+1`@\FiKF*%63/&R)nqGLaG!0[BI=-JWepn%h+seOR*11o\^AK;DN2eO5.U`c#7rSjE$%HmKE2QM#uJ,N_oUl6jE@5< %*oVYq&6M&\&qp<?NWp8%61&6;hY"/7bNV=GZ,TgV=_D^HOYL1n09^SG=O==8-BF:/P"nbTGI'YpP!fm^0kF5hLKOU'2e79K?AA`< %[A]7Z'[%Y8be5A,E%o.I2K*'.8-M"P'NL,^8\nrsdWk&>>L8$a[bs2(M`DTLnd>Y9MDL-KO&Ol^57>$"6_SlLJlqRgDH@<5!YrM% %la`pkK@/Ub]B:W,3Q)cu?A_<4!GpJX8bd-C'.DO"Fou(`_3A*`$_%`U$m?.5H(dgo`JaHm5fYi\]F+AIRnk!Q$-J98o2N"4TfINd %b^adO".tX*;JeATp>d7fbB)hn3`ugRZ^D%:aNDLL,E'Q$>X?Oj4cWsfj_%(Sj6sg>[X=XcaZ1so-B>^XnW&67*gkV'?1nsEQP](# %%*qkZ\IQ<3;%1[1CSV?>?rMYEDTIZDPT2CMa5q',WZpA+'a(@bYpZ4N;(#8nQp))A*=B2W_3%kd"EJ`tNO9XCj[!/23jiB$X-^C/ %+cC=@UV/Er_=*dHA+W]RF;q#E?)%%^isI1rQO[=*>L(l<J1;Cu,`h[%?T#Op$\-DPTID_!O^X/#K\u7:Cn[oRaCL56Z>@?CLQN1J %_IGI_UI481o@^D=qbu'X7/\SK<iN>k%,P$5!m+^=.SIKTDVCrscopQG-^@>?EI0=C()uY!OFlffd=Cp<KT%`_nWeJ"6OpqhVlb8F %Zt&H><O,'Hb@'D6.Ka0dq&%,9#d01&3mIuK*:\G;SB+^k7lMM8\J?]YfpdN$?_K8pX@WG8bT>fA;l)en;;/?D,ZN,!9o'0o?]]r+ %0A8-M(2RD)eN#_.;ZZ4:ZJP,'#2I#hOB>4"fm)c\>=h[>YPHVfc"27^GAL$)9:_n2B$o7^OE7rH5P7ZbK1P;r&c@)%moY\J/\bL\ %:r^S.mF+bKW082TSZdm'Cd<`"SR[tIUH)o&.6b5BZ]I08*>VT[),K#hJ,?e%[;lWDR-N3]1NY-m/=/2;%(eNoG273V%9/HgV?hJ, %NnCEq8:6"r*+TL?e`/b:8mGc.7a/h.8Wh"QFGKI"?V*H?\+1]]CV'G@ee._,m7'KlP]THR6Aa-W+m.c&+'0EqV2(I;g^%3hiL:nQ %Zsg4s/u<]K_;'^;/1b0OUOb^(f>S?=*C`dQ:-:L<8&&-<AmsIn:)E@9GC@gMG,Dq[C?3+Wg[/Q>Q03,1O01#+/<8,]lC(ArISBA% %g^$)R*u#NW@)M4nR])gDWg4(`8Fh_8PqdBRY]B"g.#k4,I]/LQ>Z\l$)dr':M,;Xi`";?U=IN5=4ZelOrgrnO/arW_m*K]OAoCXG %U[3L@nFsJVS!!]5;.Ve)h>c%,YjJ;<%G0<n/\XKrnH&7M*3#`7+3-CJ'\O<n_qlcE?t;\@Fo\=)Gl#re^;lhp)0:&67ge?.3WK0+ %8.),1\\puN1ie?^RLRV*Z^%b+63Ih.5Zd)"JB%m"lL43o<-XY:?n-S[.JRIZ]#oubG\=&O-JmN6E<EeNFFL=h8?=\Xj$M\MlSuB" %VSd's1ql5c\;kpY3!9iZm=XLPD\>AM09etP%OSLr59T*^S@Rd.VtjqcQ8g(7%gL9$3E>`1HT%)lHX"]f(M(a$RuO#Y9p/G=@XD@X %;=@2/E[;C6+'8,]\#f@-U^PoaYh?Xq1lq^g].gja@!7'4P4=rpcIpr@a@_58=6WS0.K,8Pd8+dd<T6ZQs/:c_NmAh6n7eRpgcVl0 %1m"rLc$-dr.R6#_=[pFA#caE8M3j!uV]QJ6rbj;Yh42oM7:0;^$t6?81Hgl_Slg8SDWQ?@"%PS`(qkJ'mF!XV2?:<q59fL:#,Y#J %IPKJlhcus<8^(<jH:fM.[RD1>(W4@RZ(c9c"G79'"]a[7Kk&ab!!9ZZ4LnEMGb.J'l?p?:-U5tXCD.k/=#:[-ls5SPZsYBG[oMb> %_CDLDQ2[id%2P`K(SB1IimGlXV-A,2D-$4fT&"7E-LOW8b3b:&PO$h2X::@'"^=BIZh1@gBLJ?&]a"pXp7UT.05WO89WSVY353tI %ZP[5h/j)45TAQ9k>u*.6/_3K@8QP.4]_4doi6AQFXIa9$)a2e`4%4sL>^[$_XfQ9@5ZT#K!Bl!N16^s'g$R0Z:#<3O)=ZtXB]=n^ %G87IOW"a.^>/]1h%2ilsYjGA=[9ZseVYa*HkJ+f-@W'MP>iJP:c]eGHAO7YTT.+!"f4A;]OGOX_7R_3c(mQ$SDr:Tle$8i*^U?V5 %<ZDh-))obe`.W2*q10"E5,u7*!%8Z27a0&\=UQbR4^t;><@c$BgXh(chY!/K<48Q[@^EAQ_j88qbSm3]Ok/9;0JkYWeiUV(KAW0/ %Hs$Ton\$J1/Z`WPYA[``@+I!`.tIEQ_bf09b1rsr0L8?63LKm)"rroDCUm-Db^/EZ."-L/K!HX*l-Bc'e\ef+Y7)DO`<Unh(,E33 %Q>W*pF_`SL@8Nd7O,YMdctEO%D`l/g`KJe*+(4D!@@7j!EE62Sr43B"mQ,J2/I%rd^;Ot4$DI,MYN&j!+(oFLVg,+p`b$@99d`sB %1iXm8E^;iKer-:@4-jY\6-]HZnlYroP.1a`$G0K:37:hU@f/@knOjH(l`71(B(W`b!03;0'LW*J1r"uL\sM4$Fbe?U6::q@AgJ@. %M,p(g^=7Ws.YoTL1ZLh\;M2(^)Z#/An_,_if\t2Y#j/[VT+L%-oo$-iPYM5UB$"d@UWUdL98^_<*DXep$D&HEZbood_Fo(c#F1.R %PuO2o.TLSG6OcA]F@g2%6Rg@5<ZI5<q<\9U'B7lir&lN3>^D^PqK3Su%EkIE6[)s!<G1Wp5/Z03Tu(@iJ.hY(:>JY2f004d5RQU' %7"A+E8BCJ-ds#Zs<2fcJJi4SB'B3O"__t(4q"A2d_a(Vm5)kN[mB@WQ#N^im27uT=$XQNHcrkTppi&V'LX1%@Eit\Bff[T*q&:V/ %fEZT0D63i:`,)da:R\mM;J$h1:c;+G)d=?Ed$2Bh]e7jfqNY&n*S.=Bl4IGa!0jYhqt$=qW@Qm]_p%q0)#Cm,S&q8a%$3Sch*W,J %g:F5*pESs#!E_;@1l+mc&N!0:97&OpORO6r@T8'OP"CO=(N8t=$2@*K6Z_]]5tk;&C[9=-q`O4IlUk?h@T'MS8Xbpg&!PBhTbJhA %k/Ri#m<:BPPAH([+G%N<2ea6]WNjm]9tG?G;H4)'5"),FXA#*Oi$K^6lFp.CD$UNm,FjR_]hV!(5ah#V9]$,"<)rS<h"X!5P+5Yr %(;b/n=ql,aeBAd4Mi*ihl).a<IU01t?=R@j6e73_`F>e5?7uC,Y&iZ]@M)<UCqT5=d[9<tphtUj`Nf^;os.=fA@%o$+8_6(:F:A' %]j4n]#gh5td+s;25pe.p^.qC(1>5XgX1_30er@&e1mD(K0/Q3<XN'=V!qVb<9spp*(=#!Xfo&hj-D[6@,2"j-SImY_[iZ`pb9P*X %[rbN;/3kr_q^kg18u6Z<ng6b*N6>acb:T6]aG]bcjB\e@W^7lS]=PLf[Vd\c.jHmB5lC_'Po8G0cSpm8^he<6#t<&rlSGViq/t/` %JRE8]FUC(`kURbGgT<f8kpm4B(74frpJo"QCqB&_<`/JL[t#M@e-AP1CNUZ*Doj5iY"2c/*8YC+3A]AHLS8Q>H.e!s#7k<M/@tW$ %KoS"-1pmHuGXVQQcdFnL$5Y%"')[[gp"PB/3o-c/D"1[j,<dPWb>+$:\`Hi5]CXAR'N(K`_[CTrLa)tOrcR>`k0-2oP*Kf<:0$+$ %P&upp@fmuiI?Yn@Zd.QDm#b:`_A$.chWf+PPUm["LnJcNb6e5:WK,!."o>'@Q(^..2Oo7A(tX4e22kO$?r%Vn?g"o0hA<ps2%t@> %j0ODl$q7HrQj"Eg,e)>D4P:?M#`73&VoC7Hk91PJas\&Ff1.'Tm1=:4<$HlV.9!#^cIf,_VA7*3\IJG1q:#BLn3.7@2@DTN=l!Zr %S,=ab&XqhYp]#rnhSRe"]IX/^Ya"V:hb,URch+:OI10%C"7@#EbNP0GiM<_L"42`0_NQZgA<b_(;g2&=nSV:G.VMPg#Wr*UM$?_. %):M6!fq\Bi-@FsY8C+r/7Aj!/+O%14,VD2ski+HD<)!1R6BmrP"6UCb1?.&NV5]':e.N\,8<HbW22<\^dZXm-bN68(=:>Laa`4G? %4O3C(K^h/5M'q>'?El3u2qfma0]oI[\S.!Aft5@9Ysb\S<6e2m,k?X1.f'nD'D/?1;,Iqf5P*;tLC6"u+pA9Wpspi]3DZ#'(\u?. %/SaVGX38WePF)Y8>pP%BO+s38T.Z/EU:_qYb":UH+s2XYaj$eU]>oip6j$FCZ[K>\lW(SM,7'T2eK2=.&">.N]&V^fqIT(7k"f>0 %^W-;@[2FeH>o,;hM)X7kN-\\'Cb1PZS]jghF$$*S^N2?-!+@)L/h;Lk_g".W41DPck"MX0nHi>UmUt+e9SX@s'8>FS)3%9j2/<q0 %o:6u+CDub`FC8OGihN/55*R.YotbN,?g(MR!N8t@!5m<=c4KHn2F$0q%Rh!m"FlJo+ZjYr41;T:#;"33C]5$#qe[XI@eL7`ECZ2_ %RBWuoho1R<<-'eu"VBEW0%#N\*b&'O5DK>Xad]iEjghRF$%8q$W=F!,RjXd1]n!de*,ER2)CG-Re/F5q8uO,&!R?4.*W(j+m%CGc %#(!dA%MQ#P8J>`n!?(b*8N/:oYua<FQc%J^O-j!1+)KQXYbDG=Bdrfu>j/>Zhl.*Z7'q6HWD9/T!O6>%Q\sOI)&X\.X<PmqiPP@Q %&s]$ZQ=XnDMU?*U<I^<Wg%/h,MD`a;ZLC<9Rq0RlaJ&f`;(s,2>);LKk1[$Jeil7eHP=<,.08c6ps[h\XNFHtSMIO+](hi_U+%M\ %HkPt/::%5i0f)Bo\qEal.d8E`RoT!rFR\3EpLj5gnl*LCB::t%8%"\':S_#SV<h!07EMWFB<*6dl2-srU'@b6N<1erY8RZ&!/(/2 %e;Qq!68HiP?p?uR2012_*\"hr1HU-B*BTOI'iJ#ko6?d"/9_=V"rkLZXL/]"`(jZFYS!&^$5<B)/4R_fmu:tn."3`pJB^c7.1r6< %Y)[Wq<U2!SaGhj]8hula36`(3K=MNQii05:6V*s]n+KYLVdN`I0h9gM'*d5.RE`^o$<J.&2sZ;B!VTBZP,4Hm5`4hWS)Q@[r_kSO %9N;ZYQ;#hAj?`TVUsaR[,"@1I,-4k`,83E0YmrL`.:VG3:[s8E',>9SDNf']`Ya]h<'ZRU&/c(LI)16,6R?s3d>ONZ6hP/S$e2^> %=ne6Y>?OW>]A-r:`@'L%">l[DNrY8A`3BU"q8"[#73S\#Vc2R*Ghi->ci\'u*e'6R2JWd`,@G?o`3+rN-5ZfA5](,PdWK4SC8NMu %q`;e#f2RmbUO`c":85'_s&H4m:2E`1&HY.>S.IUV55#RmHq3;H.%%&4&*rj&Els`Gj.>o#nRY@US:QXNR^I=JXHQg?\)OZSC_X1& %cE-?ri_&A`C2UWp<mMCa]a6XFSph]d?/i,M,uQP"kKYAG(7Ugcm/+1)Z@&$D)pmh-q.0lJjdH=Wg/j_C:!/p\/CO=$!?Qpe,ff8p %"(k5ZM,?I&2_h2G,2b4]>r@I3BucrG"-&BUKi$#ISHW!=C_c9e#P$eND3N!Ij!7*2W^=6IQ"0\_%Cj4lqf0e[?7JcJDW!8j,Y#Y\ %NnkjRhL1*Ur61"'%brdU'V5S^_($dHN4)[2@_=<?cZPJcI>*#DAq5;]XB4P+gR/2'f!3<=;OuVY["dq`F4edAMls-sb"8gOGRYS& %^0>k21<o)PE!im0@$=YMb/uO+aqJhSdD@#nM@hnA.,?=W?7#ehd2*tdD=H5`?.)Bk6`)lI'Go+U)TCp''4Y?ba!^)RU)K6J:cI_O %TBXtnm=o+%-%FKB2a/ZS[,0.r>^/fkN_gIlcFEbXj@-8[lM"G@G-\.h14bW1pY%9QF8Us2q\*]NUPQ`KI5Wfqe':m9(n?1$>c>>= %BS<lgoFs).Mru?Xh^^H0j]A]tpe(iYPOKp[Qo8u(G)V9Z1C/K`LC2X2MhnG,QGmS#TsaMG"-k<-M13*cgBW%u6ts7;c#EN4\>lWW %AJruk[DcVl2<p!p$OhEJ;,+l3*:]Aafjt@kdet1Ojfa'Q>HNJ4WSYN/k,ifA-r-l[6KC%$\Ru!mE,$DO<"=7X(Ihn/$,;J9:CRg) %3R,u.a#aN]-0K8nIS_$B=1;jBRm"sKbAf:e]Pj8q,3t>T7%Y/h;L25R1^$,he+!XLbt<0qf'PH=2>1ip.1.D;)V3g\?7W+Uq5jbG %I@VC7<=+&kI/dRLRSaYPE[@2o@3os.6V-i5EYdLiMta'M)PfM-.=kL'pcLPh-MSV0\u7R/k@"tK:5Y!/CF$_rmN9]4alI>1Ulm'L %S^OK`F-F)JG3hRZ-Irb[;sa%R]7=)?;3?qsKc,=pM^2>(3:IOlHsnM!,i"8h1/YO;Ti86!f8)-ZI,?[P\-JF%R/B9k)Xnus8,!qK %9qOJ)/$JMVfk%@(TQ,&DWnVEcImQj$''^gCG$Z=,p0g=<D</'!ODThkpbuCVL%njsB4*t@\PTPc"+s#&"`@l]!DHhGY<9_qXUR2& %F=*e#40B7,..)C=`J=P4B\4Y$.S^WN^I-Eeo)7,jG#E2bTTqe>J&9Z,K'X,\iq-Xm!`ADaMG4t,j^N7YD4C-\L#jsb'Bg*=!ouus %,t#`nJZIj1()l;31&k5UW-Yi]]DH@S3$+A$/uYB'8T6eR^drGNpT`[[A$h0UFGJ"-f/8KHDUQ:'UQ`5WjQV$Y^u+M3&:jfG);.MU %U>BYc6;I3LGYqBF?qd:mkfs'Kf;?WkG47&16;/S+,S>FfBqjO1A9gI&\ha>\[=IXVEeaJ:(b[1dh$u@rKM<,E'QrPd[t?e2dG7NA %[_?u9o4Z6YpDWU&",a5/AG;E>`.hfg/3KqZJ+AGC'23k<L[u2pP4_j5rOra.!D<i`P^AXQ@#8t27fb`\C,+_VP>eCeRgXI.=9MXO %s&7+6W^q%lKs@X7N%^Fo-oJ`5\/=KX<&#:A/a`35pgl)fImQi`0InHGS:[!'^d(bVU)_!AG)QRLq&#W%^;iU[qX2P:"c4"qOVXb1 %!MJJ!Q(YG0(u4./<rC#87W9iCIZYA:%K;1JdE;SmQ,AiTM$Pa4WpOfgZ\rrVBs!\b]pD/mqYL3K2'Fj+A`Mo--\N5J(@0V>EhPqf %:k:4\*39OqB?s>(/YR"V/8p)lZrFe_J4jJ/Wiu5/k]<T<oVs;@cB5W4G%*&%\QI)SWpY%si_6Fs2WV/,m#8,2\A1dpLj7[%gn*[o %0nYcgVPR5N.baU0#qhI:,fL\ba="oZ=GgPBMWZkRLapJF#\R=+5Q=\9)U+>c+Aj;*Fe'/HFrjV_F]7t1cOO6PREp)bJ8J=!PIu@[ %g%sSEk"5a?M2BQP1_]t#1tbWrnEH<ZaX^\#mqSieO#(QJ<)eJ=jhq'!%oh$NI6l?UQ/#$8?P=1V-TMUMFKI8pkbNHmE%r?G\M%8M %n5H4h^DI^h:CT9DWA_#U)@rGQ+IcKN4Ut?@VGo_`=l)&V@OW`n$*Ga"?<"Vi*_!N4]a5"boa\@AFSAC/.\oK*&-F_7:5M:#pinhd %Hrecc&S*QR_IG=QZRj47W^$f@JZg_:>05_b9C^*d+2,r0LSWWRS`M:qAJIPI?ea]7XgiOTKOu,dgPY(=Bag3U4Fkiqab4.&5>e"o %EEJY;;+(j&.K6Nbc+!0)8/sh%&g?:2LhhZ@-R.%^I!UtMo`2d6)rYTDE=goLSS-YiQt1AB;MhF8*7@9Z'LC/lGM7JXDu2no"P3/J %`_kkF!`c]JA'e9$U[um!<FR3n$*,*Sf8BD-0!2%/7>kpR/gc&9V"NEI8VKN>4=t(cr-[C)Hpp7nIjO[V4s<+DBGfV^,0r`-ER-.c %;"_tgTZTEUf;Jsgf8BWta*=n;G3!1uX'f/XJe\CU'rgMSB!j&:i(_RfJMHoSH'Xj^7>#qf/`@T_,sup>:%p/ZSIFW'!m*[S!Q$'S %6qBYc6n]ZJU/aZOb*D^2i_tSuoTi(RW=gB9+$i*F=[N$GfIY?T9_Dp]BOH[!-q1]j4=&KbfZY5,b:J"kp/M<pS46Y8-AV>`^E6?p %ktu2NK.p52BNo%G9\CC5H_3k:q'u'n"G?5r;d'&+:QY&(642V<G^uBkUGafo[Gr*&m7E]<,\tA"&QWP%3lGibHnP4+qds1%1W^)F %;:;0uek^*$QDBO,pu!3WD.I%#8QCZlTo`hMWNYQ&0dG`A-b/W$05HCb,L3aTQO$`>H6Lkc3hY6V(iWK@cN0^]'JGcl-02WrBad!m %$6^Cr":r%?Do,cAi*(k3"XV)udH"HO&W6/a7T(omC_%/g4pr%[XU#OXGtXkp"/O\j/"=HNa]:u#<.s2n><]!e&s1-(;RdZAd^SbZ %Lf1t)^"Tq8Tg]m98?/7Yij)u'BJ^K)1p[Bc?JT+2&7Xt_FU7hE(4V;`J03&C"+\/iYVq045XQbqcD3f9r5bNb_I%6iJ@n$u4M5F) %`3B@*a?pI_s3)orch_S"&"F1-qBRRc.Ql1gZBk@gjOYMn+T]hi,R[,aJprTgSpEjHXN&Xnj]%VWYY_`_hmgPfr@W]3)qbU,lUHJ5 %aYM+WC7(RG3G3XR=/bZ&<,nC/:`ib*rk.kuju2>_@f8`r<QkB1LjE&-,/o1WCU1=NfM['Y=\s^5K5<3QZL3b(]e/ThCE&SlX"j\J %mI`+0jE[^kD=hl%<Mo=Q9_di9Wq3[]3H+4[WB#Y&^!Ul8lPGoX?a-Ao<"psScTaNWLA#ooA*?Hb_,1hN]X5i*p8'7g3Nf#NLj;R' %-(Yqk9U7kF)Cb'q]pE7!njXl@$@"LS,GkGoc)fj1Z.,`+6U.RPo<n.g!<(VWBRNtHP2p$J:J.=?T3@\#C].i'G(+kEs6;DKMFJfU %b^,6&4t57LV-cI;?^t=9Ug8(<>2S<T?I2$881;$tch*:mNDKl*X:i'?V!!pkCa@mW6kZR-VCE4O"m02;=XlgV%:N41Ds5DbS^^83 %>K^KsMnf;cqOd$hp@H-%Wd\f/C9;ZO_-%ff\:m-'2hJ4S/Jd7W8E,hB"_C(mhQGRW,S;(FRCZ^pc/Ud[Wgn574[fIB%=IKXg!kF/ %>uQBf3n(Fn(L8?_g*n9P:e,1+XIUiVr]'S_:jnVL!^5WT&V)\g^6.I.TU=6A7FCLb`SO`3+WX]cZ+utOSL@QmPVeRn%6mg1&jZr$ %OdA`<ct=8RqP9/9]9)*$Hh/a_d5?8s,p#e%e2DnD.E\G%Y?+FIGgUsCHXs"Vn"A6FG)C4M";OEhbK:_LLu1ODKiJM)LTs@LDGVP/ %A\4r[[1&5;-EpFZkpMrKmZ/B#%>=OnG:b3FN"9r??L3=&p<a`!S#BaDp.,p@p)F3m=gope$isk@]%SDj2O6aF?ER:Lg,R&@q&e>% %c-E2D`.T/g(0jQ]05i[%HkbN]LV+)&.Lbib?_Or:^o<4YNNDcLWfhD+qsPX`L5]jpO8l#cZfGL0I:+J6'Z6%%8M'f#R0h.5f'[f, %FoH\UDeon1f0o'D;)uG+Npt\&5MgUF>i02!p^:Zi"&hCApd`M]8:BkFN`MUKYlsD'@BZ0#_W%M'GpkLTaK82UOa=6,rma9A<0bS3 %"qjRKZFZK3pT1uJI.Gk(-30'+5hm\t/Kj1]\AOLlYmB:^qI.$1VC4,kjBI!u9TKbo*hFDuegLdUoVRc"qR:(h3k+!0h'Nm=K63\` %1!:3BmNH+0O5%["fBMM=\pt)nWT"S#AlBdQf@XP=/9*\)n>bJ#X6d7Mo0VRVQV6]`lVb@,b+l^e-H+pY/I-F9,@nd4+pQ-?fDX4o %IiE(pK*cMYPiGltKgSec?Ir0NI%KeUq]0UPoe3P\QkX.c.l9R2nP()(RE*;dR7U#2O/<aOn(g2X\)R.Zq9$N7DMCqJ.bG;A"BPq` %_4e6]ES#t4B#p86aTd?VJ"6YXp9KMRX`GGop41j?#]uY&HGF&T+bm=;Fi?Y++#ZaNX=c7lEs@;%C%Xiqd[--`R[Dj3HkDORXt!I. %a9Pspq)9[X&/M;'TE/R-2$SB<MM&%N04S?N`)j&aE)*NYgfcN!!CmA)`U:7qJMO`j;Hlp#h-Wn%UbT:&3G[XfV+B1JIZ:1J1V`=A %_<fI*[A.5*QS@;k:oQ'#N[S%\:IgqQS-+5V#er(U)bXe]'YdoV>TJUuGD)g`a\OE!PoZSfoBK)Io@[D,?jji0;-"9Dl^E85=1eG1 %bkSXWn1_tAEUQG3rhNjOO:a-P.p+''?MY:(\_*mfnjl8O!rTbtnYY5<nZ2f'C4-X2i1*6QY8o\f<^P'$Z:0642JP0Tfp*dha]4#P %Ir"Zp*&4sM`0>1%0X-#-%[)`T>jH;l!ocKI<&3.;O@281<4)MQK:c%Vnkk@*l/n1=3V*PVnes^r2[R1:k%^7Kc\[jb;iiWqg`feZ %B+^mf1B*U]Y\X-9rTM8a-cAO*49S0GG=$C9;eS0Bd0*(s]JN:,e8eDO="]=U0$9GY/SUK>],,`=%VQE:>h"[=T*<>k[jnC0pm,5I %nGDJ&f7p&5Q.=m='`fgnU$-a.!J=p>#)ooi5LI8+/riUjm]&3Q5]3Jh#`i!/6L$-$!>"XaaS0Qprplu%qpU&f0E9f"^]'_;ro:ci %O8nj%rU9dH^\^h,l/2N]^P;5brVQW^s7kmrnULL]J,S]Jqu$3gpmXp+Hc3[as5m,A[t"5OpYYu55Q0(&5P_eLs7s/(p[`n6]B>7T %o+CrahqE#KrGV`-s,qj.7sjfVnt(3+@m6f=7bE^!ds=Ro5%dEY;uG]VikP?Ue+Wh2Vg*Xhm6@8/Q,HUeY.&O#e07V!H5RQ_1r+lk %pWNISObF?T>s=*5MC%`!c]@Pkf@M5R@1<E,c'd-K"RKSD=NI[Ri^Z@H>(J[O5Me>NCkH;,HLeTALOMQpq^->AS41cDHNkVA;&ADY %$#<7K?nTf9R/"4'5X41eTFZk-*,'p97[&!eYo0YOO5UL+h[7ubS*k<]2TbRWnk"Jk@G.QD):IIM\'0pjR8R2jL2'MYo[c\?,Ne"2 %=^fU6$Ulop)Pmfh3AFYmaeY^$n,Xbj$O,aSS?t3sE5([S]DSm:H#u"Mkf_TSon=Rd<PQ7?R=/PI:9mId!WNIG(%[*Z9-4_S7eUSn %dj/L8D^;3*Z\>m%QbYdV5.hUja4mrbRB;M.H0s5*d6XGQp6&F]@Y`;"/6HLp/$Wq:C3hOr8597er2/;B)POTm`h-c=XVX0Z<_%/R %P7&nl3s`Cp$R\lY`TQ7,-M"FCWZ`FX+rM;mDuD^;/pLUq[b9QY%-(pG;W/hL\W<O,Ira#-:OC"rd,Ll-E3h4aWPT#$Bmb@/:E;T. %%q,#,U>sY='^cTa^^l5o,ADl;,<g3GOkp.`ZO(7kECXCXhRr7:i>lm&>>n56S!h1iCe#i3Fn'7!f%Ph1/#DFQr3O7J[?ED>L7IE/ %2V-`8ZeYF#@Mf7,hfS5WptH20@qM4+:nIL"k9SC*6AA=9raYBlWt3T!l`<%nGFr&*/Nhn(N$lBeYmej/9BsPj,<U##`AY98ZL!P. %M.u<^-]Z^];U'hsO8)ouVt!:QjWL!RkS)r)mS6_oS\(rPUhQ2B<r^Xa@Ta>q,[tr/BqA#dXrY8qp#MfFFtt*S!<`=73OP@1^p>>n %/f3dd^%hY'9'8EXc$VjjR^bPu"_,?4jH!b8J'bT9=?2UJMC0l]k**CRXTRpX,n_3_97T-1giPmRQo0Ds1hJ-Sg[l_R6^4:'c:X>" %[u3eGMf\(O^%$*m9J;PIL%Y#6A#IABo/q0?mdlKHpfu?c-8:l8gprT./,\Q_<5Rr<e#=>H;:9!*qSjI+U@UF*Id>VMn2]jk$c!79 %'1_0_r2\;WRH?/XK$TTW#.u'l'j^EuceBLG8[BftPQcoQZ\:Y7j5SaG-X?H89m9:`Kk<^CTN>5DEhG@O&&>mVftBrc2!.Bi^,thr %`iNdlNW%qgZ!!PULN:tNajlqXL:=u9q*#qSr5ge"9&/k2q>PLYBC9pf8'tFOmTuL*dqt;(G#Q_:D<+()6J9l<ga0dHJHhh>?=<f6 %d[]IRFuhX7<&c_[$<\qYS9HEE_e&/4a_OO/:BS/64OkF:4\4;&Y'n(`J=emF;$4^:S<4!F..<N:YCMR!Z^:N:LDd[Z(\1u'`Pn83 %0\<;IiO&^(=oQhMp2&TnL_pSBEN3i#m9&6:MsZ9s2qE%Z&f)oR>Wc.Ql[F#?qYTO+Q;IJP9\W4\c76r,1tbXY_6Mdb(*3P>-3WYW %!^A8iqDQA#F"hg3IdQsgQtC=ZUBKX"X:o,Uq9'OT6t1/Ci6HZ?!LsOu[9.=Sl]^>$GZf%gRIHH7%*u&tMY+VXdPr'3j6d4:di'6; %&4;]V9aAu?mH^!`.VHtd+q;sX(Ja5=JV8+'37Nsg6U!97Yp6V(9["d=K>MOIpmXDcP8,5FfG^2e_0I8Z489=%_fMbt'63tTcU?+i %J'&jLc/*]OPGP$[QKs(_qs.$^QL;cf!^1HK#)fR:FE6Kg6F@BJ$Ykn&Po2uGMfWM3:#isnN^qh8:#.@MCMRjo?3%_4<JVR_el@6& %m,fPuJVfqW/$s,_kQ^cTYgdi.S'5k#6(5fcPL?H6.hgVFGhujp1gtqjQ;<UuTA<2L,!h%4q+rDa%L[c0j@K&?p%/+jHr(fFKiQHb %=pFIb!"R*ODeA^5`^pQVd>pBjG+ica.]nkJIW1n+&JFZV'epf?OF245Kh>V>3R]0j!JGZ*(V(CM\R1rU8WK]KH9!#Cq@t)5i(@Q: %93TO^s-%.-U[]`6-1T+\Oi7&@<m?RI4sj$abas`a1+T/,BX;j;g,gD,@hppUlGA-ha$uG1E(.\CARA89:h$Q4:(J*nIeSQTAY%.n %b4-Q'.H&C\Dt7<Z8"CeGUA=I*TBK&=9D<uG:6:D0\82o,gjA8Z=an'E](dHj5s#oMSqA9LG="?Q9g%VA)Q.)UB.;d8Ye3rmH_`GV %kHZ,'lWq.8a-c^*]kFKqNJjMAe:tuN8W4tk\(ATecf/]Al-M(%fg-8SV)nUK#EQjBcF/#4i&L>8\:-;gkLk3lH[R\)Ds-iMnR:MW %r!',YSnY1+>Lo:+OaG^91JGu6!'RFshWgCP,)8u9Pa/s.,kJ/4JE@KC[d7.7ID^;0EksC(T"]@*oZTHIE?2>aOGe,#-s=F#AXc@4 %e>1="4'B[8X(V&CIJH#.=ll$<^\kI144ADan-Vf!3X<q"eg5\DCM.pnPpsOEJfoEDkapj$;_S#gdU>F+A<+5B[.Y>P2i.ImcN1\# %T;?pkhhLgT_E.U,rjfDk!;p+&T$lZ,<p"&I"YMMZhNn4(:u$[hb^..l]#jk&XSDIc(RL8jkb!#$orF4=#^^^m6Dr;OOnI/DL\.sI %P.F$N)\WHRJ6f`HD7.(rDf,4qI(XBN\9\7D`THQMmM%X'd1EB#d=;a`T4*JA"_CA`GebQj^tZW2943.56aoS>h^?C!_"PQZIm?[J %U5/=Z6JR`0."Kom%lqgN?.@kiiu)?O;4t4r9ZD'S.->/14V)%(jRJNFQ2)*.J*qF(f,A0o>5+ja&sG`eog5+fgO:mKfQ,UkeABW> %>Gt;=62cj%0luh1KF3R+AeRohk"8E,Bd/Rr*8&g-P7n^d">M8;jm(b%nB10%!R"8UOLUOXl]V>@q>od&(_Q-9,N>%E2IcG3o$87R %.eJq%**6WB>n'%F-UrF:m`E>uP:L3#,3<O*CB,g5Y+uU!opIWZ:l2"Zf2,'0f2bJd2Fqn6HTSm!:eaWW!4F-joAl-k8+ii&%@'^9 %<DaZY"i7\Nr+.(BB17U-*rOMO5P2^Jjd>f[c@k_s+qltpnBHWC*m(LH>h6'f``YjNKN/0NGtIe=#9:-s"W;[P,[,8jWsjDU9J]"2 %\HJ"6CZVmGdc&3Yk9NZrQ#o\:nXUX5*Xhmu@CKm-@To6S)c@L\\2[eZJN0:I>[BK^o-=I<ZU1FZUB/"^i?So]D0?1N`nU[bo90X! %Q.!eHDmI2L_sVsErX08O0dQLmOs81s_cX.Y%=o(NIN6(i_Ht>3moa<l"EDo5;"k0[Cn6B]^$,P?6-3&2kdJU7IVG_blF@&tUjO=Q %gk("Lqk%e2rQs;jo,?nNPF1l_oZUH57',_HV*G-=@?ZSk\cP0ZR#/k<g/Yp5DSe:KI\#-400S5Y!$iBDW,hW+4NY+Kr4fVX@8bFW %4HX:_J$OX*#1hA3R*Q\iAD[%<Vag&%ndb3A,ZX46A;DV.f-X7k,9P6bMZ.rbS>.uhe$FtYSh8!9pt$RWY)O^,on3=,5;-(gC&1Pk %k`'N]H3g-'iXnK1<>RUJWcbJHB*ClETY5Gt4Y+)pdtPe;Ncb2RQa>d7"jQ@:C;1Um<CDiQ--:fV$;V')(L(CtNSVD0A%cWa(<JZ5 %q?=VA"\Sf"M_5PE$L1G$[mCYhZ_)2jo6Z8UC(1GO=3I;."4A71SdXLMCH%.C>6d\Q;hUA';+TYEim]F&,\nl>!-Ct&_P3P<'3=O> %Is1D9$=5H&2*S,uqn!Pn4Sjc!IdP`q[mK=q;gB`e.4-)^@jlM#km1IOO5cB"ro4g',t=1d3k!Yl3CWR)WT^g*dtPrQD<Xk:L7Fc. %%"=7Vj:!%K<NR@n--$TS!\=t!K9qFL`jTi*5L7VEAY7NJRd,,Q&V,_TH"W(XYK0^%Ep<j2G6._\'1J"`FaL.i0G8Y<WH>QNO;T6D %[*7E%gLB/Y1eJ;OFsq.O[E+($!^5T_UTS%&h3j?LYkFb_6*YT7!gKhq?fO-A"m4Pl(tb%?@l_2I6a^KJcRqVr.BLatY\c5$!1hbt %.J^:qT\q[YSp\kfJq(^mE)_%H-8K#d(op#cd7r#YR'0C'\O.F5'['Pa!f(cts&ilXeud6r8tpM+IH0&Se9*l6-T^aE.iYG0Y3AfY %Qim]n/-G$)>7sBfctq'@(iKJ0*]k&>!]EAHV8I2DRu0)d=I]rRQJ$$5D/A4e\<<QZ=`t>2Y[%B4]ubu]")Q7(J4&!;;P,WTQ*]un %1BUoirT9X>$mQf18<*!Ab0^^@a/PfgNYBrG<H_K,mBD7#MZe+]js3\:J4=l2=@E=8HLW\:Zk1Yt0Tau$]%dhCA+88m(^GO$Ss'=e %a:F)f'>hj_.;#6T7@kg)4&EW,EaY86d`m`f&uEXd8Ns)P?P?jWjr?CQN)V#.+hVkq=p@UNC*KS(<;eB&,U3&PjH"Ci$5d-)eE:UC %:P%J[dn8m!:`I!ia*sa^?'`tb7-QnM%*6E<Qh8A%3iu/YZFIno>$KS-BUCS':1/A[bI\4_X;s/\I9^OF2sn_tR5T2f7.j8RR*B0% %2/`%G;9n";OLuT<iQ$C6.*f%!YkeVlMeF7+_.=9^1D:hY9$BYgTF^B`%n7LMin)SCO[aqpF(;LTpdjs(p8co/k:JL59V?LR`.o_K %WsI+oUp)Pd-YFkqR@E*IpV3I('\kR4$7qH^+3b)dR#h@2*l(LI?Dj@H!";/k&kIDY;XpL!X*J;@'fU^O>&^b<"/n"86,>2g2gdlo %=r`IhB:uNKiqic1K*f:0Qm(u#Ok%"B/;[5+=4-\<jSKa=??$sh!W$Mi1hn,`Js*[Y$F<0Z1/f(lHmYZ>gEU)Fm8dAU9fmiLeIJqn %^:dB8_Wi%K5AU[7MXdd\\27L4"-DiqWmb$!LMLkNg#7Zm,GBG9q9:`kA6h/N!A8nKWiHW.PUf:QK4Ars7d6G0+?19FStU?&SF"Y+ %A5/k^gAB4<MZR8Zrlsl'>.qi0_dk9N0kf>NAa+`^b-hB&$'Xbhp<eC*`ZDKY6=i&q#T/b"DNA5H3N51WA?fd>;2:jX2oaa4W@]lq %KSRlo`YVcRUr\KV#PBdr$pu$dqDCcO\&KE1+e?i&VK]1M6sF.-*7bW``=h+4M$\'%;4C.P.eArD7_6iW=UK:f)*]]>IN`NeS,8;X %RMaH@(:!$n?F(l>e$-[9Di&Il.u*5>F5UW#3UNWsD.mE2nf^SZ_!lIo-&<40j_n2UCiUWq5O?)JEhpfs/bfJI%eW>(P3`7/I8U"g %Mipaii*pLpUMF@L1c,Qa`[+Gp<M;slSpnPCit2SC=G]q"+VUD&7U<CQQglX>iShuMiu/Aj@FO4d'k?g1FqtSNU9Zh$08lnVDunt? %p<]7a@tk?sQaPu;:f>XP$'?(J9=naJ=$-J/q9c.t_VTUm=1SE511qX_!(sKFME"OSo+aUq0H8M]+K#X_;X%@8mim-7APoYM[_B2J %IB<UidWGP,NQb+gibE_#O;OSljue:WNnPq9BQGL=Kc<kKg8%`JeBQ)Dk_3QA;V`gE?aZB6BWFm<)Y=/Ee$e8u'22mTn5?Em1n.If %**VCJ_lEf36>s;;&pd1WKmGON&h;'m$kFrC\"t?b_TA*bLCf;Dg,W9FgaTVbg"u4F+7WU`KQ-gO6u-Cj(?Z$Nm=MuNN_>A?F2ndG %.0>@I@Y`tF;)>ee_5>$E7bT\oB4nV>KIqnT#mSt^B.E%_>8*fm\,&i1FE>p8)r3HHd;1MR)7m.EoakJW#&s]hXCt^kCL&K?XW2DC %#IUgS]OcXRk7$u!c=+jT4%-&\MgNSd<g;5^-->5.AS=?.-">:X#e6U#/P]M5im#g`[cZ]#-uti3eM,jn:SeURYi!.3[DCjZ>aZ%4 %BDj4FfW2Ye=-P_pA^E2!m7F&(#'=fNS6QaYZ:[T$7"rbm#ud]J&DcanTEI-'@O<MaQgt;>pR'mX37<sq)\]po9'H'jWB(=qW!fJt %Bj&I[c"H:h9jGDVd(+/[+c"BtEt9rgMO>B^L_<'4D_:kM33I,S,<37^.60q:ka6Po]d*)>*T`E>C!eKCR</("RkM3;XdGI[NYdF9 %U=PtUe'g"#P(>UriBd/R4:?)D:pSR`qA$?3IA&Q1/][u3B,:_l;/k:JZR+T;_0W@RY9^H>S:GXq"]h`#27E^>3%"^>'mInhB>U[U %#nb+Y9m_<+L5t)Gnj%]E%$u_*9;&=(LJu+e7`_)JZR.K#-Gu6AX0*sPKZUfrF%]jK!#8&_f=Z>E_7I"JC7TV`lsaUg$_q6XgorUT %0-s:9XgrX4cGgH?^aKen,e(slhK\QNM!>%!bC5UM'^0]gr$Af?BCUp?NqiQ>T1!E%+.'SbT;f#s<3iHo3tX@aKtgbV$^9#KCsNY> %T1TS&X&M]T.?Y>bnr7>ASMLP"RO5<lSeS8QJ@XbU:Q!u2"po'c#cmQW&0^g?U-o&;XA[M%N*>ito+^5$5jRMo27"*o)1a[KID&%# %N!i0*^o0B@+V$R)X/1=a)MAWM+jcp/Ggh1'cgWX2P-hQSn?Sc2aH_H$4JL%.6mrc*p=SS4N$1=?:gi(]*&7$k4EDXk:Q6ieEQBL< %3mt"YOC(a_>/6'mBdm2J@H_N3184g`=c6*VePZN%@b8!/3aNUB"G3kW/p;laff4%MU1M#HWKGhFOkERW1o8XES1l3,MtJ&Eo\OhZ %Z/<-$&1"oYU?2*)49_jB'!YPHH890^K8'-7jinkPF!rF+qSg>RH],$/bQ6M0QYmf\J5]TFJ5-ILn5e0,!Vn(9$`9%!+;`-;4PUlm %B6'<1SF#$fc@+2n0KTLD8Ceaopl=!n67@@`L2`Hg!!>e5;nMLa2O1Zi4'GUI%Thh@#\V[?]<E+P;4"h],56%X>ZmBt,I'i+A,0/; %%++GPFFo$ajS!eJj!k('A4ABX&hX87he08^,AIsuoS(Zu9r&is+GcJc[9/dL6cL.?gOs@p9aV3(?5#%3-qt573*j[G3ZC)GV-8JE %dP>VsGeW]^O:YMgU\g!NmRp0HgOp#U#&'6Rbih9B_jgdZ8Oq-&;GAS\76&P:KdDR8BYK=Df[b6m)Jb't+Ug<QB[s7[BPW/Q&Wq/X %D+opc\eT!1Y?;93s!"(94gMRaEB#?o!sFP=GiN4jIW;<l#(NB?UYl4b)91mVp;o7Oes5%g$gZm5NRo^4WB>e,("dY4+l9H_3KS8* %/\X#u1HF\#&E-TfBZ(HpcI8.gW8Z&J>R3L;<nQ6PWMD34%'43gF%HWKU_D)H66C^siQ:LaUQk23XQ12.r,*B/Kpps$Gk((%b@k$8 %_%Il;$SrI_;$AT3A7PgVB@\Z<-Kjq+GG[[K__(](cn$Y/>=JbU-"ML-7DPht"Y2oK@n2Z-$0mh/K&pBFHdkAPMVXcqMjN=f`FNc< %_BgJNQVO)A4ms(SirpGN"%3OI&hYZ/D&&^^IVj$='(#.J?<4jD"TDGP0pL24)Qr:W2pYj5&g\]qN8".<n-Hu"]^^snPTkVt#aE$= %>J3C+Cud9o$Q\qk=3r9Noo]kk$8XTI]J,mtBTnD!5]?pdp/4L6G?YU#@D,*7gMt[8Cqhojr,fQ'>Ng[GLjOLmOOV]/W3P<n*VF;N %7?MgsJ=*Vf.;n%efPpOf^+I&s1:PrG"V_6]5D6Sb6,c_I"Eqthd_Gk9lBdrKT4uf2C6k[^Zo!:6E$nSkT650re9YN1A%-bU4b"Q* %]eMd>V2E7g^,F`jg8b%'iSMiUL3Mh-*cmJuEDJb9[k93B9)c^1'[RtrM9\!j\R)<XPZ>-_W-,,SJ/4itMLm/`Ku=-eWi=N>67[s! %gHGqWOf2BlLp+c6l^Et,Fl@)QpTE(,=_.='oYoL%(L]'`"^lK<72kOe!Sc:o"ddGnn;4T""cZ+*5+^9#f)Z^JWKMZbPaN2BDA`FG %o@[9%RKCMI]7?XIal'\SkVrI91@k_Dn:]61(?b=V$kVfK(Y0MibM;9\<Cb[H"$eh]1[#-?MBX[UIt"L%GRnO=7Wuk_hEJK5<0GV% %b_O8E]XUe@08j]Pnm*'lBC`<`&@DKJe[4+hgS9(EJ]q#:$X>pVnBpXaR^a@n'+4\X`%@EpKmR4m[fXC(9r6Hn>`p7uiF^R6@>bm$ %.>t`*DORM-BdqAn(<Rk^1-quN@+c<WNUA1pDq-2WYNjP6d2r`/cYfRK@Fe!^:'MnQKcD+e<`L#&k3Bf]=O"[]1EBQ/!B7&'j_GM< %5NIIQA9cO!$-%rFB.TASSuF]:99/GM/tf7#>OYge^jSRiU*o.3(D]s&]$>Z_@@EDB/beRaQ;i</KR"tlD=cJG_)_Z[N<b/DA>9\< %TQRe$r"9C^k:.gJAbTfb3GiQ;@6_%/.j$Cq2UjLbc$$4qCMh3/j3KAdPTHOkq>4P-Tc&g"U!=(38<78MB1[5@G4!p`#-KTZf-?LD %KS<\9fH>5c>&3(4.]q><K'[=$Hbo&WJ7=5FRZ=B'>$X#OF@3obL9(fI1]UluFqV^l6l6POU_PaX65M6>;2fLUJcp&*'a[FJBuH`k %T-L9nlnimd0gMp]V`f<FB4'SN@=W&7h_@>%/A7Q.@Et=QdiTD&o;2d<1*BSf3!8ONV+G3#J/,7>h=\YiCrFarWVY^tTo6dnNi*[a %5]B_/!M$HAXd)$dC-=-/R",Q(lO(LfWc>1%coOa`)4mli'Vq/fUDRZ7ham.G7)K3;4*A@j7O1c65<".6MT0>Wk//JVm'esZEhpC4 %0q,.q7,$B$(!pWP[!,!pFuoD?YC[Upp?WAG![YZXD3q=n`4.^-doWS]2S[@&F/X`%pnZ?/EJ_,a!Dj*eQXcX/bYC9L?@=W'RA<t: %JtR7>6aboYDoYI.+>qERUpTo56m`(C=^=LH!VTZ(el$LV`tq+b-.Q>dl![ke=bc:XF$LYj3M%ra+R40iJi_E06E<a+Ma<Rq0F!%X %PAK"'"k(PqE(/t<6BmL4q0fY[r@$Sl*RrO-b)OH&WW<-HJ7u]ic%BFiF7EB;;a#5P>sK-.6E/Q@n@YOmdFG'78FZ[ZV&%Hm25;#n %=]2*[#6^-YXKIl4]aqWLn41EQ)b4kJZEPQ$W7a["kq3)%fu0D&)(JC,Yt,-_6A0s_>kA(oM'3Bl=ji&H;o3:qB"LfgK3R<Z4\\h] %NWD`WFK)<)pS?Lt!,B2<BUIpo`gQQ&-#5"^g3]mJ:KEE>=#sa3bZ*NX44LfS.W/ALj')R6;@BRM(BMaJ?klJg(6CdY\$9"8*LU#` %L=33*Fa<_1RfB$:#m*O/+dcj>oJhIT@P>F@iKkZ5&O<;`WPqfec],H5T@=+'>K-c<#UrP&//jicJJH_ING&jJGkEg6!(ER&lp[NT %YaQ$:iX'i74P2Wl0gIL=!?oV4p!ccsSr@0OgdC`@P4dTRk:dhfhi&BbC[=8'1sdU)Fk[7*Uer?LKSGETH.g<D6\d$NQ(`W/@X6rq %p\3[=&dJK$as>7\#Qj;AB.NPuAcRoHqZkpt`nf:RQPg0E*T/C4"lL+\Btfr@O=eN;MfC4Y@@"^=]q>K3D(B;L=m6OCb6L@b0O?'X %!87&OU4,9ZZlNg2lj9a$a.'OT^0'dT%*mQ^q7It6X$PrsZ/?8*/;Se+X!LnW$:QFb.*D\(+-oKa';_plce,j5$bSl-ZmFN@Z%?)O %jWnpJMZ_2]qZ=rYf"d"AF:Q)MT.FI%Qd(.hb.aWX)3*s!>`^RN.;M@/YYC4WlIFf.7&a87&mZAOB0,#*'T\2<27joO,(`i`b.(HQ %9Y/dU6gV2EENm`[FLIVu7WD>4kF-k)i%1.XKS!L5P^[>*N4)"9%,`HX*!.L5U$X\<9P4?oqXfL^E`h;f?qgp^((7$:LCChQH&]:[ %1]OeL^(eG%J4u]GpoukKDn*GjTg0Nh,N0-/7WIf&HKgN(]KTF@On\?[8?BFfcG>#b^:/GLKnPOA_\DA9d*V4h.RT!%/+\p_#:pbD %0C[Y'=!B[@ZJfo5h;4QWa&/F9NB%EpRTWQT=&C-NL>H`U7nE!N7o;5\MFF#sM%d0T7S11)=b\3;oKor[-ruq1_.lXm(0?u>$%'!f %+:m1MEgVX4FOb%-aYIZPo;b3_>/On8G08rh=;Xn6PbHedbR9pc<+4P.X]UZnihk\?jR<JFC#u_or>Xa&XI@<WE#GVI&5EEDKTRsV %ip]LZ!@*m5)g.jhT6qa]GgR`Q"r^K4oEG?nX.!rs@W-Q[F'm/t5,.N`n[H[)X>T<%`g'Q/XO/#lcn24kjGT1RTPS!i"LhMSdFhZd %`5Xi:0u+c3b5WXQ9)OdHC_``oDAE71,]<]ZTIlaoKZ+Mr6\>NdIsR#BU^8^D@eRsX3ga3#6q'K0EFt7Lfd<%8P'+l'-SYM(0EZ7= %c3+?-I5^69$o!ZE<Caj2H\BCNi]a)%LfA$t]$`+OLP9B^.`PB5l:B6eS^EiK6%CQ.TT+Ok[de^;G6/&"=_M@C8B3m9UJnS6D6R1Y %&h7HtOHsXk'8W_L!/E4p/C%eNFSWNM7tH;Q^2%fd?(Jt8\'af'(qec=gda(MH8!d"agt!o"(8uJ7&GqTF_2JC=`.u67I.;%jU;dO %MU;F@=`P?E9E9+%-f?/>RRsUR(bnWgSNKrjq%]Y^K!U'oaJDD,U:Gi;#j4cBKAM`+-uf(e)dnsO^p9XaXWZE_4BWY4Ee/([KFYCu %]]iFpT(lL!+1(K/A;Mo@3.mBFD!5e(ds,qY1n#$J6B1(^'H1D(*6K]=l;W]j/6`YK=N=0*mI[L-)e*[5c6]7ii#gl8MH+PQ/%$dj %+]%kj8ftAW@>$eLig5l1I[\eGo:.+s;ao5kTm<*O6'96N#SCHP$H-HWJ1`bg#Mb`)k:re65fR_FXcIW=A5nqa_KPdp^(g)aFTR>; %1*\(33AuPhL!*BSa9*]sX<WtN&R):o/^%c,L^<MWb$sH'\.(i,:;!=^bVq)9GS_M917;irnb\p5lGB+VF#?n[R'=LW)P-;jnCQ`\ %d?+pSB^^Y*CUP:8abbp&CX_6>!EMid;EK/6GL5q''QH)oOs,/H?7;@YC,RFm>>8t5@`&8:S4moLL,;9^6m]Ek^eojfMK.`HB@M&< %:pj$XX%B'Z[VHUV](1kpq'5jnN/6-upE?^]L7P$(W!NXA(,b61AZ'4#V&C,2E?j`,Id_nXF7>*YlU_KXG_#$lV.=m->=sO$%SUTX %QP6/P)A<5L@Z_M@0o>WJ!Ymf%7:eYbYnTsAo:@C&"J.=;\#='o+93c4nchNl]-iQN"efO2l3&0ba,mm/6??hEC'\ST;ZM^9+0qdU %/WE\D'o/q=XR*`UaGmCmGr1$a].abrXu6D5:rc]Gk\^28Nu/?SgAVgUT3[8I+$K[LqOD9#,kRE^.\8rZOMDSj9g9jFFG@n.;JZle %-gG?6[Q4lOnR1i(+$KZQPi@91Tq^qDHas`"=bdPj,W$!BTf$G$J@ddu-j'(BKY*b0O%;*J#]JH"d"<cINf-AiU.?^q>mM:fK(dti %h9&&F#"L$OI:UN8)89D`W'uO71pjNW[&Qa2LB.t=oTo5Z^.9A_n8[kZs0>b;)a%N'*0n370g_2S;T.jD'!aiSEL1?=i^SR6AQZP, %5Q3`<>)T%0^^G7H-t8XMAer8&B6WP"Dn-tjete/"-6X?ZPf#V2Jq[=TN_!ZU'eq-33:Wi^$o82)DHk54d^jKWOc_!K21r&V.g+na %Vc$8=8d0I<+`HbP4_8oTWhG5*Jp\fgJ7\Cu.`*Jf_poq)S;7:mL3gcKmuRE@G^Q1DHoJ>h\%i\;a)@sL"sab[`^sjJ(8\h0EAo&W %8;;HnTLCHCFAiQ.SA#N+CGsRjjWB13`$k7@U4;B<<sYp]A6H=[)T*^#@I!2j7pH2u3Aa^R1=^fQRVG\6*HU^cI<S)ZABT&QJ\/_A %Rt+,5$Xbp^J\)9&;?VYBg4D_>'LGYn>c8q#.^"MAm0:g#obl[('-k*a>:X3jN[*A3\mDsKD123T<YIp=V3lKXSF%AO)N=D]<\8q^ %+O)#4g4*3GXcY@sI"0"KEW*@O)^7Js]dK0uJ'ie<'c__>_NN3SCe<8VZ,jun'h2T`QjO-:.?44DmkK[HOLhnF)K7mq^]44@@![fJ %;`*LQaVnY;ep!?BHq,m+=c9fq@n[N[>TAR?X`l^T9FN,])+_Z:W8kgq5QH_T#C1Wt#"Y/mb%fT6![/GZ3b$h@$m=>)#l_a)RO"$i %#):tPC=`gbJG)8L!+"<O?YTS?\McRe[7Ih0F\79ibq/e'D/X#)d3BUUi;u+Zl;46T+[[KKF>toKS;2`)U9^3_8hgj2@Si6l.9f#h %=K,2MjYI3IU!Cf4YbA!U&l[)5RHSf7<B+8I;+Ec!n<#^*]Cj#04d*YF1kB\B@as1$o^--s7k0LF/;Oj49UoF]9:"@2I)+G/]?LkA %A@dLID]nIUXoX@7bs"Y>>]$r^$eX[Y(Rh<0j!1/f^r]\I+$9Puc)DBl!Du&\DH%SpElkRjVN3F$L@(rG.mG!VQ9uTA!u+o)mE+Q3 %@9:e%T\++$!C=arl-2?4bM!"O2a/eT@?CS<`6EmsnI_5H,P0h#nhfuH_%L6a6BfXNm`kDZo`)U+G\unmDe-L"9J[In-/Zs,6lM6& %JXN#AW5XjGGg]kb\Kku,k!1PAbF8euF'@LhN7kg?EUq[tSPkE>c'WoBR^(X2*9>=5Y9$1U#7`J7mB_.C"aL;%1^m.+dS^rFltcUk %N0o,Y!7U;nS`!m66Z<`"F`&>Qi(/u&&W=_EBhje<OpL$;(#c\_@Fpiea!.TXV!m1-d/>(ZlYHJ)jpONM"5#2Z0kk<MJ>@X[>gM*s %0edj[85#'fpPk&-IoHheR>OEI$8Tb'4`")n>eTe+n_[CM\k[R`LC`m,oVt]ZgoEUVd99[7c:08RTAm2(@Qb=KmLA`CfEQWRaduXM %$4o6,UVE4T4B_1tm53jE"%I%977*VW'h95]:g*i1[1uU5nE.'lM(^hW3'*#t-=G0Ai:Q/D;DVB%\6Ehl;B8*!i4.lDA?I/f$Homs %#=,SL1eio63Lj\sTY?*U]X3P26Z',(.G?s:Udi!;@'qcD8)C`u>"SAj##6mnFYXqu*n;<O*0ROjD>&)V1f1fT-?"+8[S(<qJn4n3 %Kl5PcD%;Z.9lNQqAgV2TZTnsn6;"a71ETji$j)Pg'$cQ28TpF'-8,nfr59Jn?n?E>0'K/N<C^3:JUeC;`BC@pVi)m)\3(q;'6AdS %,hX4Fkr+H1O_ogXRkIg\RF0JV:$X/%NOG_MgfPNsMo/[D_t4=LIh!+2q_WD4/hTFHi:g**GA,*Er#U!?o1Z#2UcrM-g-g2&"\cpI %6ZCJ6G_ptu#mP8EM@CG@&pp)L%h9BDKug_pG1(>rgiulW2Bmg;*5_-6%fl/V(Jm4L2'p9([Z53!(Jt_i@O6U#cNcI:g-#ia&b,k( %_)t\/kSZUd6+Xq]G65b$SfBsfY_(-G#GDEoGEZI1_56h"SL@6SAqi&PSL?G>Zb7Pa[9;_9/>41@l*b1R#SNTg9]fJZQYdqZ":>F& %kE99(Z9r>7C1*a)Gu(S0"C.Z+"5Hno1G&ck.-4&/Jq/fjB[C.fI-'S$aOI+6F#4i]Zic*#-p@kYMiqdQ262i]/d%c#8QppAL6s&[ %[SF.Yg$V-RkY^k@;$o]*B0b*j]f@E5M`41oY]ZH+nbTu8j-a'T")u+C"t0]C6W<IX>ePk[%>mMNB=t^R-3tM,-di_?2(U;+(1TW9 %:6rJMg)FFJ;bs\k4OKU2peo[qRPBKO+@8=AO]-.qNV;EV>[Su$b%p.)&:cr0q)JG*B`Qp\M84^%aEosJ<_\`Oh/0rBJf==h$4mri %W'&ff_0QH-^3Di*$kS*.=1<p8"_5>s@JoZqen^[_;bn;PQ\(RG(2QoP[[pj_MY;cA<'KT[kdAR90Me=FStHM[_#W;I2?A@78P8)d %$#!U,j6)Q[KMbNQ_253h;LX5tol0pE&t9R(BYjH]"/.P42N/G[7`\V[1pb#W2;C1+0L,peGiYkb5S0@X;p54nEhJnE@+r!2,*,sQ %@e#1Ob>OJ6ES`JSd;g+>*YDMZ!p_euaU!Kc@;(6V3g>=6e15B+W.rr(9V,YuUTn*?MiCQ0IB%`7V<Or0Pq5LK$rFQ_i06#41JC*Q %J2(*2Q*h9[#eQW`b`RQuHSp`kd$Y"JWKq6WrX1>feoN_,gU;f'+/g'/p*G*TX:s/9:nNFa!Pb8/'V&W=#ao?r]@V.HBZ@BQ0MWL9 %BQf"s!i-HrKH@[6CHU#k0Vq*(Jf/TbcfNMGQ"`Z:i6*_j"%i!%q1p4_YmMe*ZaX@UWJ!tTQ15[ps!0Ztb!q`:A&83c[[3$\@ZmGJ %,6BVh/)9,8!F;+7M8mLq1k7]GKNc*W%F7Zm/e'-<g[Q+gbU?:KC?@8Y&EXttJ-d$Yn@]^@@,OKXj:mKQ"'pbN!g.GFCU"\Xs&Lt: %,;#7J#L``-!linr!L#PKWJZuB-Is\<&?r:X!kQs6[iO$B#sEIKA/Zc(?,6MS>sZ>D/LHR(ViX$dOBKb#iWtX(_3^l6eV(=CE!Kh@ %["q`Z:&o7RKOF@Y>/(YNIe*V?<KobGc;uDP_"\l)<YQHIgeFZIfl%J]1jLF]/;^JO64;59Ees>:K&r3CEe[RM,&EFrJ_;Sp)RGQj %kD<'\d^6J8)-`7A/>HAbLKMc31q[88k<i*]bS!g?hjV(iB;a3p[G6niRBB<rJmo?2"*QQ88^Cp.efMP%Iru0mVDutFAQ[@glEsa; %`,&aE%:H:/TF?n82b0Jt:AV0R0e'O8WE?*,"[G58V5qf#r?5QWJ3p,UWmaiO\tS(AZp5hN@]J`q&>A\/)i.9oV.O?-,8#M;X-er6 %FD2clGT9$`a-b)d9mNF*!s(`[7!)EUF`SJdU894S+BJ<`]'K%DciIlS)cU=tHA0c$ei!cs*Nb9jY[B4OE\:,/Fqa%D5^SOEUa`_u %F:Z[TfU#,R4>"E4g5`3imb/I!&gT.6AQ#sk,,@4H!dZ=]l*?<PA.YTt=aVh63]#rLP&NleRMSSBqRlo2J[HiSPANFdW=fiLA&U:j %c]KQ"]f,gL;3Jf+l>@4-N&TZM?ir!(J-/(B:I:,^8M/)RATT-!lipT`7#kfuC''J/+ie&.,/h/34O,c?T-lA/6[=AE14t[g@h7'9 %A#],rhL7[.D8B"UE$Bt.HQW`+"&ahUlnC]h[^c5:O(9jZ4fEli$o)51.Y04[,.?E*1U`].$-T[:-A_cPC`DGM'3.;1rE>ESMdV>m %Q-BQTL1i$UZBDN(lg$j)Aq,^i<4='QB#=VG9AmZr\oS)H8QAuY-njagg1]KFa^T]#fV].RR8;aXd7YU67Wgu!_?j"s'ufl%-@'o@ %LGb!_#D!hX.7D]JoEkf2B)2SH7lH!j-@K(?"ToD(X0`82eo2PL-jp=aM-[K*QSC`s#+3h("D's%?Bm=?Q4;6a`A2djP;oPt=fgtM %nf\Gc1%b;dTpaAWFCO$9NlJpV>Il\%blQn1'I@):S.*c1Y1UkM/MP`AK:UV[a<#m(6Pq#kTOL+a_eVQ(4'+5YP=6<Me>G1HDT6a\ %(Jn@OMrfeJJY'\m,--I0kZ/I<<)=R+(E\DOP3EY4H%k6hIKJ8cC&U;!lR5l<_u]44B>a?^_?FL`%L@4Ao*?aD/[QX/9Qmd'E"dS0 %X=P!TYlW'-[*2^?p7'<g_'4g=..1Y$G,kel`j!J-!tc%2C']pJX92Lr2LmaII@X0gX]_lko?^tN.-hb;)rfQ*!V=jd+P6/h&QWPQ %?Si<P3JZJ:iJ%RcFpdioW-=+QaNa?P1L.smDg'\i1QV3fM<C:B&)5=R?U!EW)t5VQE6/;_6ksA^U7\[$Fs9=bYXk^J#G>[e'ds:] %mFa)-!0DS=V<?=H%@]19CDi]imj<G;1QFFr@eS5L:*-L2ZQje;OMcpj&rUbBnrghn8?u+39\0jl)bp:*V;EMMh0%5OoP[T"KG_D/ %<?AN#%ZFf/<8E>e@s]F!P_4\UVJDZR\KGWLj6,5"'_Yh-L$4H2a7HB$==k[/X*mmIcO1&3A`&,_:P;GL,ek`00H:+#)nl1!BP1c% %TIgbh2l,;uQsKuiQ&`s]@$U0a_%9@>W3BHI+Bt2L,)p&SBc;^(liND.iK]87#*B>K>U6]_T$?r@Zl&[3jtdePMt,E[=diTSJ;;hl %##ks^_W`[KRu+]l7_f_beUjq56%pJUP9FSQA6phm7[Mh3\[4[+KKL1fSpD/q$cSKjc;grm],*LZ/h=gFn#436T!gpTgHo<7$b%Dq %);!$QW()G7ieC,)CjR"iBiD4[=ITH1jsbo`Ep4EBcd^`DQ->s@C63*NQ4q.k!2WiB\O@YW2+(%cM6W&eXc65`Sh"no"9N+D=P2J! %R*&1"Rpn2pWUY4JHWViAe?"QI(#d$BZ<gtUEc>U`-Of=qY2/oBH8T9ubXjrL3i:Lfl_E'+8"dl5:iaom>XQ;J;[bXP+:k/`+'PF; %$l)566stBn)SkG?[RJ`>jlUl>,mDOD;)O!SXQpg5!19b)H?IX9)V$:r%\@LDpFB,JL&m1^o\!;>QEMg:)OI6p.eWq0^SgLK^,CB- %Nh>noDn\KBE,/V?WMpPhm9DiZc;]bpjP6R'Z5+r?C?a3RHA)91jLunm66bi*bG<l-9@'S4UN)Cub197@@8/<6P24`Ns-t2P`\ul) %\7RemZen$qI#bj*5`;)$9qSBu=Z@LXm:D5@90:(DW-]\H"dZ#;2_#k,gG6eEr3LT#$;4#M1sQNr;;Xa9$(-Jl5<q*h<n'?>lQUM= %H;u7E\mT[`/(k8uMJ+m[@L45W<4#5g/f1#`O8XHn-b,FRfZS)(=4S63*s,%Q7X*h&423nY#XR`V,]kL<'ME`f93d]tEO$ItUB-ZV %kiVqRF",,+6HpUQ1IZoQVZqp)p*VE1N1aYI`Ca9W[sCDq83C:%LY5V48H3P7@Dq'"SkL2K8O`A#Zo$<e.6k":cX.O9Ff&';_U^;8 %Xk]ROmYj1n/O@6k6NUapJ35&bf2\A!,tOa5`F9S/ZdGs-rFVb2@Z1hoaWWNS%6*\qFpIlr/N6/'X/pK[N6,o6*"?X%[H>u,Y`>I] %f>)-mR0+'LB_heiP0t*r*SCtgcS`m:Zb9ADHd/>p\*O5W&KSGSBYBk.HC?/AMf:B0pW^NMR0_]uV;[MP*UJq9kHrOI[WNL;A["L' %CWfEMaHV0IRr_tB(D$b.)P3aofn+t76fZm7k:KXt`3E_AJ1cW2K3!?V@Ln32W'sN9(]\Xp`L9[?8heNm0<5NOJ[/f:BNT<U-3H#[ %bqhXZT'mE_=a=RZh%eFhSO`uF1Xgk7TE_;'PHLl:^+eh?QM'ucTNn9!]a.QTd/qXo3eLDR#0-,pU-it(3l+%]r[DN(QVApQ"\o0P %P!OIn)Q^ef:c)">[6%r._5V>FfaF6P;X;nCc7N1Bkl!OcFth`cj9?U34g,ZT<g-&uNYf:8,#TI=-r_Q?<u10L_A!H!?q\-f;`o09 %Z?'&bSX,/0gFK\Yb\^+Mr'"4VBUQ-0QoH(&'d;RO)bXdtb)8!Qf-$Vc<-`0'dpU;%Z4KpaYY:JX@L\W:0!ccSU$1FBc7fP8@%']] %-T,'tb.5Qn1<24m/2.&?e#;Z_E3h<p]F"eCZdYcU<9so`\ec]dC]3VQXGp_tr+HFKJ@G_\!GJ1POTpkIhG]S_KZ.R'GnN3FhR(^k %5$'9N:(bgAmZcZj)\miKVBGcL')0oka_37`af7;3@5bZU#6--8>ukCN+f;IWQ9id@>TO@?ER8`&r_19RCbAW^">QRS73YttK]\BD %U_C9r7EirG-G;e*1-04Bl#;0gYG)Ujr(o+FC:&T;,4QoeMJn([]Q.Mg`G3eI>:IPX.TVaA.uQ^clYOpI"H042G&qba>(Wob@"P@p %\llE`NTAu4P4YU;!5k;XA-&61psc<'c-78jQG#&I.F`(^]Yu_^Y9H*4Vu;JGDoG3u(-U\aYOgi&Y0^^$ff*^a'MOHSnsoK'p$KJR %cV*gSH0`q:D,I+A(^%:.O>i'NC,2g6+qQ%8>(U007&p*#,$#m6r`mPEW0pAcAeeEH$RP+M5-`9gRn5_.D:Cj5@V16=(q?iZ&bF4i %\I4'V_g`q*J1rNX-lX%82OaZ7(Ru>h.^^fC'S@$/!*VLN]iQB_&pefRE$&h$#\KFci^Kg(F:uOOX$rbFRgXMoobeipSn<+*VQJfq %?"<TN3a:ojlHBOt&0hjfCb$\<hN#,.0u+3SAIF@B!"J6*.4Mhd>(N%:X!I$Ib-Cqle/>pD.$J31l"OA:YKH/D"eQgRkQs"R=%_IU %B=)YF!_DO;k+B=QWO)@^[l!;GX2.7Q(mV82NA.E\\-mSjF]d%p]\)5^=jRVMUU`_e4U(M_#f-,^SF"c8UPd1sNJMSoTt-d!%R+-R %p+b7o0pMbdi*EEe-rGV!.0Tb_gkfXOL+a*5HE_(kH!;jk<`!If5&De!F)mHa6\K6"8,=&>^^)S^'\FOiSRibqBZ0+p)Fg:EAL+5% %N_^_>,A]eX"&>QaAFiGGDVo-dNk2/!gP>"sJFP4[THMM`,KO:i\d4F=<qs05&?OGST,(/G-h8f<@lG32)[EJ>Ph[eF9PDn0gq"MK %A/nB+;t4+J*&o[X6'>(G`'h4lTqD;;HNfsg:KXu'KH0O(AiVV*=[6O2>*^qY-L.h"OIj!$;7+`P^l4"*lkJBf<,6A;2*buGRi^** %8gT$AL(spHJ`S]5=q!$f2_&9lP5c:,+-VYtR@Z[M6A5%J%u'6l;.R^R1$0:&bCi\$P:d]oHO0=E`S6*[cehqa$!O4RlGt):$`R6P %HY55)FtdtX-.)$eYboD'!?h]o-a-@r.F)Zj&nd#eS'@BVPbXmQh>J^o)CXAL\-f5\%]BouEXC8F3X&Q`KZ6H%Bo+M\Rq#<7J(#2+ %1>.CaV/*2&OF::I(@57E9Lrq:CC1'10Q\A"S*:77['-r$<gnn$UMb$k#."43[I#5dj^(dfo]FMWWt;>$3c5*t)D*jG[mN-CVQ7tG %q&;Xa,"4IcSgMGPqJEi^><:FOb8R;U=bU?[-b$u'nYS8mKmt]?G=]PDf7ru;?rjC4BPQX$Ekl)mk)OI2!.;lbn2<P(^:(=SY(Yir %BkHSD:r*(OXt"UiN>lE9aRmEif0qtp1tZDGG91d?2(W*9:SA\c[9"ke&?nEe4BWT*HHXi8it)s:V,bh-<^n5R7072l'80i)317_m %+t8`74T^."+hc[_Dhs3QYaYY168:c]nha=:;c#29:X66L%ZOX^'ZJ`8+a6*cU$`L"fG]%W"?o](f7T4jTdpIWCE6S8i\l[XLQ&F% %/87,T3j`Gt7.N)>`4r-l9DE5r3sr4BP(RM]7^:GhWYc.a&g`6X+rSf;Os]ZLkADg^E>!G]8^/%t\:H1a>g[4%91fJ*T+:]'!Q,DD %Md\2\QEBC.]g\'f9l=`r-+3@n:[PATAr"YTp-tsCZQ-n/['iVR?rL+?'`D?:XYYb5bUZPIcNnFHnGmQ\+NB+K2q.[-4J8i(9&B,4 %`C5&7l$YFE:Vm<BB_;b=B%TOc3N"uDC.)Q1b^%l#BYp:G'rf0?i5f*K._f%\1+*IiL'_@Gd[OJ_eIhpdG@iWh*t^8R\)'be"?B)U %S;#2/K`TOb2Hl!"JN"U60,i<__&S(5l89;<HuZ>bhZE`/*5EE>g!Gra]^bnhalbiK.\W+^Mi;tG!Lsn$:EJmHS-KF&#G^:_n%uqo %;/HqR+!egDkVj3W*>sgg#A,ih=X9`S!Cf!ddB*iXJ.sSA*/,G"KP5-C(DL@9=#Nh5fL]okdG?nJCrlS"3@#/Y_Y*t>2ds3H<Y;:n %M4un2j"0NA:#_2X!P3*AW)Zr,Pg`ol[=T[HaL)d'H5(&B$)?5e_4>A*.>>*FAQ2M=kWWM&E99rL_+=6]&l*>t8(lg=1iC=CgkbMh %8WA^V%&G.RP(YSURq2i[N`2ba%&u>4ASeHj8DS#j3>nJm_.fFI.boU[Wt;qFH$q/(X(#8@IBp.$'I$'3cla,K!uE7LK&<=ET(]o= %X<\3fC'HbD.=m@LOFe=p"1STP9,3YU#UZ=)MeST3=kcRA<Z)@^X?%dJni+j7*AUQdGWF5)"2qU6;*`+Qd\B7k4>@aGahl@m;U$K* %Komq3Ud:6HgBgs;_#oR,lP#n'JSAQ)SglTJG)(6tjI0Fk!lW+5$.h\nDCA-g$"nBW@;Xs*$t6@KStDk'6&IdL!'e*-7OtG`Tu/et %g;/@8%k8J4/AtW;30b`0>Y-i?T`SB1G&EL0c#VrA>NjJ53)h)KkZD#-$%+Ep=]c"a\C[+1_J*o=4%"c+KBuMM3VA]T!Yfk7/DOV: %"se"u$Nq]3#&'l-h9osRrK;d9,L.E,?kDDs#K4G]CBcK3FX'bXWYLS-5kZ<O#.7Bc)iJ.E&7_pWTLCA`,&3X*%Z.O9K);3M/SgDQ %-=0C0'<.[-@AU=3ctf2o4X4bq7;`YuOLJPD($n2L1eDhC$kSaP7d?[c@3,1T,7"ZMn/tDV0K)qlHKEa%?'\<<T"974aTCsG!QqX1 %i8Nf7@nI(;o]t/W&"c+D_^[r<$lMc3oEO;HZ)\.QNrL"W=W`WV)8I(JPH<<'jqOe]3n]>H:*:>Z$c%G@+<#CRWtu.3<JI7K2;[:< %hg5I<=tqt1#_h7I`"hMRH\euc,LBA`(5kMDV4GrMEL!/T'/G;HU<)DTMQ=R=CIUp.FqijAV@uZ<K`WDmNge1p.oq:&P9K^ZiS5J< %^h\9P3+[t?_3;]m0bbnP!=[6m[:N=6V206\XMpCA'[dC\@a9/QKra(=hB*7t4d?'3jVbRZf]0f4E4o/+3ARIth"-80/>mVW'P8]@ %0H"1h4doc*&g.PUDQhBo!EW,:6^!.\,d9(c^H3+/d7b[O4;#]>+XfBZ@$M.R;O=*bH!%TSZc^$R.ur4cSdMiL@Hih-=jg5NgOV2' %V'iNF.r^1"D#5>f7U6O6Y:MRGW9^/2B,tW,$O0>AS'bBkEha?"M%ul!hLXg<(9JdOp[A3*N^@"9lI[f*J[cYC"P"up^KPE/gi:9q %D#5>f56Rfira\Vc.)M\m]![h-LX+nc9egW+<?V%jG00[Hb2Gj1&u"irb/-0)@Tge93Q'#Y0J>*j.e75+SS*XIc"ODQbJI=R@d0hW %MflFsWHY?ud-N(oHgpQtgDX$B@Onp-\d<;c4KPiSQe;Y9+@qZ;/`^gn7Rb]hBkEO?=bkN7C,-Nh=25X?I=_hNlR,BH/#L@[s#V:@ %)=aEHI-a\S4V!fjhJQ:$WX(Hl&\5DL!nUTS>?O)MZ<m<'WENW/YF=F<8Z;P%S1ijG8k&8NNl/-mTE>1,h%IMt<7jE\6oQ2oq@[VI %#ti>Ha_,dKY.E!t\e=CA%n%n$`@LCSWYSNkN^DP'B$X3\*CR]4FCJ#$>&Mag.Vs8@Fi9?>-8i1Kg33U\TP@]MhGXVZo$o0\_4J;i %ek/iZZ?<jXpF6`L=If;Jbj'a_X=0g-?1Y(kEp+A))-q!!ZeCP5fdbL4:SX(?EUif(&YS6M"Wtgm;WPhi-CL=+BVQfpn&Vc#Wbk$o %:5dA_MU8S12Fdak<._0(0:X\,&!+H6f8M;,73)3$.a`cc.Q\cSBddjeq.9M2?+sCL1R;?K\pbdgKE7Uii6t#[l!a8k=;Wkq%U*+? %8*8_l>`!bd'h0\#57i">JT\U>\A`TFh$>Of]F)K;8Z6Zd+V7DnMNnJK/kLs>B8'"o6]2;rXRR4HY1^+[BjjH)fXcGdK"gGT/r]HO %,".PiO]qW*>E;9@Y_T*jDa"6i^AL/R]Rb9%L!_ObGdXR9>1b-sRQ1RL29^(b[09G;6l6dQpIiIjcj)oRP]+Ru&ETC=LG0K-,Uu*? %!O*bfW]ECDMFa<m2XEu5V".c0^ns:%ak=2>'1cefEaEJaEchI7$I4Yt`g_cq$lM<VU.CnU+B1b-i+*b57$M/ZY=oI'B-E%'o!KrN %(fE4f.sh(21.kt3CK'[:%Q.#Df/sG-XN>3O(AN9eMD&"QgdE/q.PJYOVQY!7dbpEKKlToDno]+qVSZ*%Nis@@I'!JZ7m_D"O?0qF %SsthP_9*+U'_cVP&5Hmk_I>8!R/!?fE1E7CNf&:`iq2#tmJ(>q8t;N4N$:]="E##nBR7H"6uin1&WW.:KFb$4TR'ed4j[]>h%?bV %2rR]3P6rT:/8e45@VI3OB7jAW1lI3PXSY"dT0'1a=JpiG(2ZFr*I'AL%X34J86Ip9a=1#OhI;!Nr53;-XMpssr&5\4Rm!%<7#aBg %'EZVhKET1_F/^FT:diL>Atm%V8FpRpT:?#gXhqrt,%m;o)k`%>SfCgR1T?n>9G";,JBV'>1H8OJKkD"`00-/gC5>1lDbtSV`fSV9 %g.J\dX.d:.Z)3c)=@(+5=H^Ca`%Q!(TenBD$0l`.<9Gf:;eeE5*G%-`O/.@-qgsMN;3Ha_\\37BES_P_.?>>`;bh,8=9>P@e6lC` %V=oclDX1if@JdX:>+7n`o\if0=5fO.c)nf-dM_lfZZ1!:[H`Sa^GNs-!/F%]Bpjh,blEBT;)^A[C-@TPl;*oKaY5%KSP\=j<"NtF %O$4p"g<D[[&7(WU8B.BcZX=%RWeST!(=:><.q"Nea%0[(37OJ,$-D*1THL`6Ek$dgmr>*#*8Qs*95N2Zc;g9hnZ3FDe:t^Pl'-ua %AVRQp3`?a!*PkH$Mop/?8?PFKMU0qmjGF30ZX@Lp[.*a3Zgnga.0F[s<5bHY!^@m09g#CCA>+6]CB%,`bYMCX,Qe_\eVP(c>&[`_ %Eg3r\ClG:f9PXEH67Uq-.'lJ0"r4&>Q%BL]&3m^G*#)OU0"G^P#?@F9U9R[146@a;CY=>%&RKJA$'F97Y"5)K)R%?<anLI``C_+> %=p,FF/)r89CIeZnJA>+F[&a=h(<\8UIMV3)&o':%M%`<K_-RR[(Cu:pFpB!3e_j)ZMAEL@qW=P(Mq5%iEHeFj]g.W/a!RPGbV#p. %2QK$_b,!'R5X(7QDDn"'D*&39&8+IsQ;\=gil6unqh"#h-.<g.$nUA%MA\hBi=kIS0(EUm;Of*0.]^2FQO50N3L*K&l3V<%`k0UM %LMd*)l;8rmmQt.4^Npa,6kua!Q$=H@h_KJSS8Qh]fujK-ajLc\YF,;E)U9l:Vt?o#B6s@PZULT(E#5AC5R/d@Qn6(bS<49j\gThc %iA-9i$!6,'%lC)QMO2hcCcKs4`?(?:6aD.j*_aL@a<#''X(1@]19AR)XWeRY%Bp\!@Vo*r?_4=:r_>GnVT0Vr1L8omFJ\3fX=[IU %$Z*R9K:P"ub%RCnMoYuW6Tk,Nen3bUg@HX7ikn:rA_kXNk\.S4<?q$4='1J//,*kccfHL;FhfIRL+S<0KE,<l-8-#GJbc9j_%M/7 %]'aZ^]r&-/7K!?0[P,%+etSY-?I^p1'Y+E(HpS3ImLd#M"r\_[k/k/;+.S)TNil,a:bj!A!XSYX!l3k,g=]H9S-?9_[H<gCl7;S5 %FVjNNosld_=8'bYVG.A7;#3X\<=ngOHmGS`AfE6qF@WR<;)G5kL*+kS>;aN'S[2mW5-gH_D>?\d"'N@>8#YI]VVn0`a3fuDI-2>D %ld"(7`NbWZ]511A8J8URA?o#B,0?)@-AZLFN_indJhGL"g40@t=UA*'R5XmW?I%?1o&C)&2(Jd&]KVg-]S/0E6T!%&#KnC5#^+t@ %8raLNXUku1L'^0J<t8C4P[NPm&@A.<)YjQlgfdjF-c$(NE!n<0'BIdZ7*r.!Af`\ob:Y9r)?c3\UQ+_tDJ[ntS1Ga2dOa7tI>If. %Ep?&eU5_"OC(V[T8>toB[8;u:D".QddsK1a/D9OT?H`2$H:pj9m[6unTTNV%D(OAXjP+?uNM-]lKW,mC&rL#c8h<G'"DMmbMPJU4 %FCb_cYc^`eUC:P<alG6$,N#:`KmfDm1d\>fbsREmUo5rr-H91hNO=X)]grT.R76hp99=ZgN*58tY"#ER=WD5X(N?L>NBTI!2f''\ %7^cE9k^U+]_V8f5DRCE*Yq`^kUQ8T]>HQ\9p@'<8o6*3BX%!#DotJu)hs(k;i]h8P27@fWO*E?_S=Qcgd3B.N<aY/)YAC6E=$]#? %k6q,,)Q+Vs,T8?+<`^!CWN*U]*W'q..)iG%-j(T#Lp3ecSXNanfW@[6,KKMd'7Qu2n;,c%e\p*TN,5n+[[K21NM/iNVl`G>2KS3s %dqu^b\()UK`-C'PB`=(;f<%O4,6mcu>C3DJreLTi`R`r3'KkMCCiqYEGpQZom\B&mX!3$]krUnD,o5YGHM_H^1,CbtqR:k9XoA#p %c[:We5>R93+nCEOlOAg.LM--%VtS[TI]G?1eS]WM`n4m`4CYd9ZZ3G-6ea2j8$&eo(>2aCm1DEuX%g+SHJECPDDOno>Hcf*go^;> %2Ttn..sn<c^=@CVbg,,2'5[=_[Q>BF^%AfFMY:HAbO8:V:=s_]>qk9hLhJ@V9m;k/ic;/k3Fl/=J$O4+LiKDn@gk95<!bBXJ/;:Z %MV,h[R!8`j#eYnU2Q5RL5k"gM4YnG2p'Q-42bW^1D,hj&BVZ6qSV#ZaZ@#hAa,).-%65@8<fBS=1Z;hG&C>GRVK#;plR6FuF>Nc$ %ctaq4=Q^S>jt&El<a8L['A\Aa!o1/=KSl*1AqI`)&_8=@EoGSp7-pj!%F*'W._Vm7\o@!d>)`N%J1;r)Ppg4=o`^BoqHKMBXmX(B %=(>*pU+_piMc2a6G:5`XTUVs#1+Di8-W27A!;^TOZ@nj6p3.bb2[AG@,kXR=[ZD\5UGY^Xi=\EucB1DJA;hh6,$Du.%'\Fk*7pcQ %mS]uDBZ\dN(#iLsaGV6AE^>[L[Be0G5:mbHgu1F0ppio_P*ks,&IWfL'Wuu3$Oj`t)%*aN[SHr&OU8CJSe;JD)8Zuabt*SX+?g+C %8`1TAC)+*A"E&?_(,.WecY,6@^drl>&,Lu=RsO]TMkaX+(F^#Z1[\3LW\c?P,8(,0</Xf3844$3`CAQb[U8,C$S#*7;^rNQ>Fh7s %lf!`@D:,:*aYX$h\-(V5*F]K6jJX5SbUet:(:9;C)cH:B)9#-gL,?l(E'R\5@"neI0jN,G"4k5R4HHH5r#JU=ng8sRb#s-e<8%OZ %"\M]g>27<"bh:4t+I&:[c<Nk;6u&d$;R''9V+RoGOcKl#1Irr;U'qFS?:('KY=:#AE#W`^oblZ%Vpk_-gnFcj;3b@ml?3?D9iF9N %e/p[N[N6/fO-Qh;d+6*Lqn]`>&DVG4DEh74+2X'[f3=;Z-gR5?Jk.8_!%M-=bVj.I-<LOlN#k[d!;/*7qiZWL[oJe-dt(=Z5pN8c %FRRqDSj-c6.9)%FJ3]Sk?#"%DB1eLol?&plJ2DJuQ7P_X_+/[ler@(S$U1k%[r:Z99&L;8nVD5=WeRs]XKCc)]-;VjBl;D'gD'0& %8t0#[8W?rFM)(MGg%Dc+;hY:6R&W(hbS0F;#\3s\7>F+#2&g$*k3PFD9=9Ig1C_1&3Es>K-A3\Rfg8p1VX5/M(2I`d2a7nu>jBS2 %#Zj(h_5pVdIV'K)C+%"`4e+Ib-qts`Mc=1gVp?]TLOm=+!fa0-4(j7ON!1E3H34!_^Xn8l),j#";`,.;O/r,.L6*]L_Pf@nPCBYs %DXVkV-KuKSmB:K'X@_ckKj_\o&f0=-'Xa>42J%]tcR(jf<+?fQ(P0rSdBMG0#06k:B;NEaJl+ZWDT"+BTiQY>$`dm`g=j!%'U\QI %)eY)_R;!;9&ATW3jW3_UV10A+<0]Ku![s3$`(rXRMpt_gajEM]-OGEF!IBCF9@"kEV7\Ysa>fuR2a.csZkpK_UoCf.PS*1M#$DBa %c7YJDDinD,V%Cj/:"$*[<lYnVI!B49L2.h%,"fFE2a;SgQ+,9fghJo7@V9Sb8[hm,O'&ttXlAaAo6+&ZX&ZmYI"0YoJ*7V`ocG7H %27E?-&,hj^NfHqZl6]!-&GRgm#43o2:ciOX0_NI-/i(7f5-c<?/DWg^q:7.&D=]lqdC*u9XkS's<o9nm[O[G0Pg*7JZrMfCU@'KR %L=A5.Ep>)0@OQsMUJ38$5rq,LSHhHF8g-6W[)@Kg]huTtkZh2kAH6ip27=/"pD3a7[)lN?h9.K!Zo/&SDL/K5O;S,O)\W]MoYc3$ %'.6s\mR\1QMl>-))i)#g-*,%b39$+-IOQQ/\/$Zqkkl2HNJ'JkY/$b%3')gjKo,nLL\RtJ8/h9CDdg@qVF?.V_b@mKE,%\*_\>t5 %-fQBp%2Kb-.P5I2d5hBWq5usN(4[Z68:@=F6kK"^KYSd@-X>RYc@`Fl][eB2Zl1459h"7q07["s-^1QN3tS7.63F9\Y#uEm)XVlp %WHo2N7Nf$AfQIP6XH&U97Rs\1K<qk!i]U>/at72a2(TIY$HZm>Xp84UE4\_5R/NgoU!S&kRNtl[4A$B)Nc_^J/)5cH0C6Pmq-#YX %-5_Z,iLd>=XEC+G2Q*;+05;ANH"Bi^e1Hp@/>fIcpCpq6.MPa>;3/L8$sGVA[(d`_BFS`g`o_&6#E")rari,2g$&dWX[\V=,E>RR %#MRut;c^l:EP=:++a+%RKArsBNP;2BK?sXj[FGgU!2Bgp&bD,e-r[&s8oo`OqF^=Uh8m)tF"8sZ3DeR]T3KbL0TMdI/F0Ah"MLk& %13R5+_](9P;6C'm&(-@"SMZ<sM0/tRGJSUKcNE)2AC.&LOeum4;F7]=%jFJ^Y/3WoJk*#hlIlR8T@a.C?1d(4GQQu+OY78.jq-S] %["3#nFS#.!+7KVPD,C%mddkf7(,-qPio>\T=#=QK$PdcT4].u:3cIe-W5u!16*(Pa`5MrtqK"=c2PT;HgAT)1,@)!j:5!:5PErR3 %h]JAL?8EqhAK,t:aN,g2gH^`XBpQ8MT%@UDYqdI4>ZXr5Zmhg501)-^oLcN/Ga.k)\H/^Z'-k]I8Z$TKl"i/B\!tt'N::Zgq[ZNU %>Q8>i^$:loL]\^#qkf$u:t24S(@OGOn?:D8?>i93>SFrf2JiI/V.Sto:<-WtRKu>/e1qmr'1KV,pDd+ZXTK!t<NkM[k8D9VW8#2B %91>f-etPoWH`:O+9>ILNXN/=:c/0_Yn_fs'*C,,c3MiK]7rM@s>u$=Qm"(NkD\,uaJO:`X$<pr@d=@6BMh22C_fIYr/1+r\\l&"m %>6cn>_["eNYdYC77t\L3'qnY>!XIFF'LP.0KjOA=5B=.F,<J?[?WFWL'Xh,iAdmk2Y"O[f#TkSmGZ!k"7\#7F@KAis'L`]9b"A*i %l8k?*0W1n$(m;mU<_2Qt#8cn=@QE_)MOVH)*(i1Cj/Pq7m.I]g64Ws^T?mt)5EJC:P6o]PI=pYU&#T,JH?s(f$KBp,`o\Y/;KdEY %@-TZ4hmqA]/E@%gSCqaBhpu`$P^nA.-1)uPIA>duKJ(OfV`Zj,n\PUs-!;?W"gr;42-`io<uDmhF\='ab66ZGNM05@)0oVQ[6,DQ %9Q?F6RRItl&^Dk4M_^sJZKiekJH;dP@OaGL!R4hH"J6B[G]"\(RLcWB.48N=p5.?/HFFP:a33#j]9bHKq=V:aC\8^pk@HWKH8Q@1 %h7oME32sP/8<BC8;moH^Ki+6$Qd".a%l7Gm^E8q/&iAUV;cUXO+C?<BcqkEbjie2cgmq=`!J]Bd:oQ]/n"l&g>W3AFYu87F#@F=k %,bu^V3A4+Ol'4E3+D34-NZu9?lj!5u\g"FXW'.fICMJA\.`qM(N0;H#gA8otIq8"gNF>\K-tf(>Ob*;UJOHF?D4A#aDXr'aMjq&q %kYhq,D4S92<g,k]1isZ<$`6+i:q5UY'"kkDRdBLd]omYQo[1T_,p+;VN`/!2C#R".!@g]9QYX'Xo`sCDonMbCs,9YLCS09]/J<e6 %_gTJ_\i;U_dcO1t.6flIPC[W0;=RnL9Z%ek8hkf79C]iFLmGcQS!Df:I1d&kK.Q\URlZ*e&OL6u-"j5ED(_Rjqm?oq9BqGX5*7[C %9_T6*dFM"cFXn2]64AZb.E5iZ/Tk,S>SeJE_7WfUi=+`nY?+rS7?.H6dg"(r(#gq3q?4.Jp@;TI%)PsE6.I:FH67T?W65=dF<\)b %;"Ta);\_9^'+4QAc+0KBfL,^nk*s%3bq0"9>fbE;3eVWtjM3Rm;67=Y`jctse!VH,DYDJQLfDRl7^c)gO(R/`:>.niEH/JQ>C>oU %X-fOHiC!+jc8J`SV.LYb*"WuQC@-T)SrUbQ.(Ba!$2(fN6Iare'K0hI+Q;ONTKE[_bR?;M)+gVR6),c(H0beUeXa\b-3`mZD)3.3 %JZF/j%gKf_k`ltbf/=$"ClCE5_3cZt?7<Q9NgN7[VLp@2!*Oa[m#kPk:abgt5j_GN^gZ(T+_*gn#`(p:,?QdM[b=#P=dF4KhP8O8 %O^ffKO/FULE"ib;k$U;LZlV2D#B`_1,L0!rae"re[Nj*e70I)X:olNse?LE4JXPhT(iY`"2CtEF-u[N3[uO(aa8m&].0ECD9@fRe %fM7*'$A+b<0`JYoTYf@_b%WV#hCPGgUtRaqB?N_GQ_'/]HD$BZV/:"&YZlV[CWMY:eMYQ0BlRAZ8qrieZ80^)XH!TG[^#Z9F^MCf %oZH$5!:KE1ERcKbXsIonjg#$Q,hAmk!`Yg98-CP77]^hHcU5h%8(&&>.>V7a`dU'H0Jh*$r.`4WDA#gm@qJ*\%5."Gh-[_UKZs8S %%PeZuFp5IFXSll:UJrtuP`f$d$r5:G,#\Phn#WKu'^#AG]"/J&N'b[.VL&@AQU.ho&?B51&O9NV&1\M9KBNab@ZZ*[%j?80KV]@P %14ZqkZ?(HbqAQ$lTF(jB.eS4poB2r4Tk@_K?9HI<+,n0fq)YiZiqdeqVBY%CC[HnV,b43K.*(QGf9]:aMbD#cQ$%.*hB)eoe&*Cu %XT2i%=6F1<R]+3<ns`?hH:,bsl_\WDRKt?AHJ12J.FI*H=KK=P:36&f)Ap1$foMG,Wq*Z43pq5Q^HCt;ERi:2H5'q.=WNLWJC3Ap %"gTo;,RTlq&4LUY^Xk*CB)]rL=rBU]eK;tu/f+6%G>X5F+omkK,h^IK=sHnQ>+33BITKu("/QMe>nWhhQ%;T8F_90o+CdlR/5&"W %NJ>$F3`+MnD^bUeDaoru^lPM_R?br'U%4k@2H@>jM,8PH;Dp&cpM/kHh2;<f3bVi?22kG-R17<%LcWdKSsGUQFK*,BY[<$ke0RJW %ES5Z<0(hdr=tNc\MG>qUHtO%4;q<`>(CB;F3sr?V+Cr(4!Yan-i6@,&K&PG[^#qdsoTsTP%;9iU<d%pL;=U'325j4q7E?i*8L+[: %!/f,pMS:K[4$J^lPuj]R9F,LUR]St>pbm$.^jt&2SlU=?n>S7:3`jbLSa]Ha!@]Q1'nk/tCi_1m@&636dDtYaeIQBZP7l.m.k5(Q %4&*&aa[m/1'@,"(rB`qA?5$,&=uP]F$c\HnGFW=lE2.UL,(up2.o#.XAi)mV>.*(@78-N!\/NJ8:mTdPCjCcW-C$!s>W#O:F.)'g %UJ9"sM`%H[cmedK>";*iIY$`!@?)#^CR!-u,Z!,R3$lL^.>jhXn`?`2o9eIRW3&HRc724-WPC^L91@F-%4oJnXJZJ(>7-o5'lQq0 %m7\mD*26<5Ag#EVk.0,)//)nhN%SR,EDLTTDO)TD@MsABRP$*eKNc\p6?NkU@1uJr4gbJK<iD>p1@&RhnF\\nWi[Zd@WD;,H-+;; %%j&2_n"sZL.\NHZc_-iqJ^5ieC6]+cSqC(=@:#O*<X4(;XCD/(oRrPCM?&GjcA$Jhc.=F\]:,^4Zrnil@eV:LA=Oa+$I=To+)5N] %1.:9Yl:pZ@9tp%r.das-@=eF$*#'2<O_7bOO^.Se1&'OfrN#'>B;qZW%_tnjW5_iPc\%6>"1i:RXhHXd_"2]OW+LIq\n-38SiIXU %/R];#g)mOjI.>1q-=#9`Ub'ZDD/*J0L/?\VmK$n'r+*ah8bc7DZiG4KFfL=eq-I4F-QkKbp\6'UhZJt)WhG9)>eRk^c<=A9K.Z@H %pTGJ8TJj7oimD:`JrJm7djA(4l>W8]+'Vdp_n#SFjEoR6]%h3FLcN2%kCtm?<6TubD'/Xn-aTcANh,8Ol+;3`7Mh1TPmTM2Xle', %q*^(&p3Q[V!43%>YV$_:JKSgPQ*D5F.7aec4o.)AopS*jp]e<DLrifG(H$8O<36$GLgQ>G_e1H"lkRGd>ROI=H%jQUaWci+n$pm# %C)nuMhM?>DlM`>u1uY?p>EsrXR2Di/]J58![rFB_q@as4u0Zkp5;P.g,MCqH!@Pi<?BMor0/U6\-*7cd0hFp-4$Z(soAJRaQf %CHE47:fgZ7=_UX1N^Jb+N/LIf<lfSKN2s\iqRd]&](L>?#8FpX.H;2J_enW8=HL^0$mVJWGL6.>N0^<5QITbV$CXPa3dcu@[j2_2 %R4@""b:O/H>-Z;#UCUG_jPAF\$[#g\phP\!,"JV-mJ%81!T*8O,JlX/k,dbn5pZo0h,]>S!$tooQC/-^e@Lkd1jEf/2;?#X@L:"< %`@Jm[GAqO(XZi+!baiglr"WBc6?t'@^Esj6h*2&?Ptsm%DOo$iC7GVqeC*g&3%>"IP@^:-@1n<pjIfP]b=*G!AWV(R1'!_G+9sd< %OsZ8`5rjNQVLpV"7R;`8Cq`6dVMo.;<[C!j:gFM%'kB&Kfi0:X.ll#Y?L+LX">Ula;"//T`&u^=ARIZ\_Y/oF.tG6$PWWg(cp2V= %Qn,+OL_i@_kBPgBAPd#&hQd]fYfGCbP>4I:ALR\;Xq4^/K_Y]U+E1tqW++R1)aZ7ND[:W/?L%S?,S`gJgU)*fDOK);X3Cn@edD94 %cMQ6C*G?g#j_X';[PuhO\bTg-@Ac(.H,.sCgB[O?H=XD_Bo`\"KO@j6`mcqr&YEotX/_9gTmJ2U5:'jrn''Y`^W0]2;-tnHLI37" %V_IG](LMU\GCTD@cemRWo'56&lLsW@]C0,*dh)KVM584ms+aZ?qs*V*e_<=&qYOXtio_*o+)ZOOHZr6:rkkf:26Qjtr!tuFTMq7I %SS.5C)13)DkiH(uE@%T3MUrU\j0^II>j,RM>'36NdE@BJMQ4q;=BVr,TaZdJSeN013+oXHgX<Np2N+Le2U>5t7&V(.N7Bh_>e2e. %Zoi4@\2Od5Hd+c.N9gar8.it^2XZ+:JLcjq>88f:.:?uJHn<6hF)?H<*SKDu7'EeO3gl@s^nM#kH6F$[CDZ+W9c6a:"B0)pRWTRs %*NnV&+qCLj'j6cXne"`^(nH(eHeNH^7"O68,HPX;;k[:G+;.X?'@8VLb]nV+:7@9[eIiAeU9eDhA[DjP4aXs@@b53[^I!_Hi(eS- %27O;pT.ORk.^0VOGg]b2b,&4DBMEMG"#iqK:^3/s5Pfc__Tb0]Lhd50@Z8m(OBg>a\dC<U6HN!ggH_1%L@4_J!tqsC\0TQ\BH!A9 %!dT;ips'7i)OINLd+$oU!DHjd!r^OsVC!`@5XZQQr\sq#*iX?1l'Ef"RH4\'e[(oLX!1/(7qL25&-m9I>7;d!]MU0GWd,uFJe^-d %oX*oA:hE>N;,+C+N92S"BtD*+,F/mT'!96LNdqk4Bb7PuY05`RTD2.7pCUs<LiBgG-$q2E$HV=XP8ON-`^i^Jb9:5Qn&P5WV[6># %rC8j[=`gpmZn+N="?TE2l?;8Y/oj;)!r6GFKW=_ee,_shU0MS`mhK`57*jZ45%=UlcWC,<PddskMk8c=]$*nAZu2t7V:_+5oXo+R %+qr<tP;tmkk'j!hObT.6=@=6Vb/a`cH(`J46PHSF7!h>K)cS*AB"N54>6.#@#Z<\kXSN)L6iPG(Zc"XX7fSU4#ddB%@hmpNP\H#< %f%l#?^<-6=e71iZ]uVJIpT.])oa7*0d'S@TAnuPoA:)9p@BC1k]Gh,W9@FjS-I]W,\(j]!pu$6$Ti.u0je-CsG+r12Lq\U4lm-S3 %['\7_OO0GjJrG4m1hoXNdnCSY.<LSD@*(gDkd1]<->>7J>0C?WogeK<AGGZaM0)EA<MU!7I%1'S8EsS;oQ_rM*.t*L=BP3hPaq2L %IOL\#S!!<[%8K*a=0r@E3_'&K:*u\VE*-cRr"*11N@O;[N$>YOk1R2sY-BTOK_Z=Y&B1=CMj/>B3S@k"s7qGVF30Wi#2=#\]/tnm %A:P[GnjLO/K(#_FRf6+oo!n:S8be'JhnK'V(uoKBF)iI6p1`*-pu9o_dD'oRs7Fikr9M+&?&rF.pmM(@*pmV?q5^i/hnHXs5<#20 %d=:r^e_gE"k5+K?Vj$XQn#jD(E-M,LSpe9F]CUAN>^Um@rT;o^^KYsUZ[[=K2uem:ce\?Q?.-Ld^&,G3@K-5me\r*ZqlCV5q>C)A %>l"?U^6%,0\o'XKp\\!_pH?1DrCt#>]_^ZtG<<PL0&Pu=qTIEY]5MnB-,'/]^X;K<o@KPjjfd#"*k,MVT?E/)?eg*TqdqtE05a#F %[.C]>iVbtn]mINc$Z>n)ZbPeOs6U=]^]*ZUo0<"Uhsp!VU2(ir-bAGimI8'kU*f=m]_hQCp#Xqdb?_l7r,ft.`dL&FFrZhAY4(uT %q>8?bH$B'k+3$h'r@#2MX3^d"Df<D%]=PWLLh</qq4=ehrRLT&me_(c2kU$X_lg3:p;>-n0(.$br.I"5J+D9"N4.NEn+Q2?rJ0^p %:NTjUM["LgdJ_sIo^1@N3<Usa^T*L4rNLe3]78rLq<I[k]8Oj^I<Y\H[oXA-*sQY-Ss?@cc`kPUp3cI+DSNf2GCFc5DWgb^5M5;8 %F7o5O.V*%H_DCVKf=*]rh7gY8gL\k3(_=E*fLPE/ZX7$foBOMo\$n#^dF$]1H@&/#n#>/MqC-c<hn2#mB(,DrDm/$40Rn"R-iW>t %mAIS*o=d>uHUi;KkjBJI]q`46drkC[_M`F/dL10lT(#L1iUB!A^$W;P2uK=U>lOQiqQ"P\hq\4mVk*\t6\+"0QXU/HIJr+L#Q#$> %D!n?:nG_k#0/*?QV:_-*]q4mecXmjglhQ>1n#t$or^%t$:i,BoXLEW841F*poD\=K(I."%oOdj8lcjL@?G!tnmT/57n"4USs+].\ %!H%UIZ7-)+G]A(YqsL*Unu]DV46l"tYBLL'lIC60K^QHEHiMp``G[qf6phud52-t0oDZY>DpC!g^UcCSb/2p.dHC7qG(-tV\KA!# %hn?aPqu6$]mI'T>n;#>O'7B(LrpsL3]7#&%$#_hRGY#Qjn2SJg\*HQ\n"%59Im8__m%<i$q]2k#a\R/H-\_\oaThS.mFBt'1CYp! %7m-A5/)@4<C0Va?4nQZ+G2Ea`Q^L><Ud37iZO-NBnd[7Zplm&G^*nUMR9;Y%GBNZIc/mdLDfeOMiQ:qChpoU:e_P/iY<HPG+.gff %ZWm("h.PqIcS7_t^I[/Y7H-,9aNeDeT0Dhgl\kPOIZ]]0+4h<#LOOCfNj&BQ_#9JCgh3(s?X:DCj!B,q"#>J"H2tXs\bP\9i!:4s %eA0<B5UlRNJpNQ@+ogOE6[@i2g2FpV:TI%Ip$M/>0A]u@rqF]@c'O6Fnu"QN?b\[PF7iu9$-))!5E,-.q:s@=H1MFtncD[(Dm$7h %GD?bM;Kup=.6=j*m&t<aIJ<-rp$Ej959SS="feudb9Q^cXW<\[hCGoK>K1iJb3\Gl@JBM@lT_)]CVR@XmSe-S=dP<siqBqWq+IjC %s*A<^D"%&Km[ACH'q!b35X+`e4SFf]bG29t2YtdF'R&(ELLtuV,`BP.G)gITrq?9WgWSod0!?o]T&Susr8HfL#k+9<qUCjZpqtGW %Oro7C/B[HrAJEHi5OnElmrPidp.oo$5JV12olXs2cnDTZIs6<iEHuX$p?l#Fh]:'PFE9X#g,Um5&Dkg`Gj>!*Ms[[.pK`^E4=>ms %hE`Y\pZg:]5Q/To]=p<*[C\q[bF]@rH%#SX=&9uoU@5hQfur,smBF3ogNW%ho:-eXG1aJ@q=>0$m*"hok"5?@Dm$7HT7VR(IYO9) %^3Y-O^,((]3-H+Q\p^os%5iY)q86V_3K'1+`lI#tCBih:F#`GH/"!s'h9F^/B6]QJ[r6KI53LGCm)-kBlH;8k5Pb4:L?lUEJ%tTL %)nQ"9r8!R^!kJ<:^Xp(jp'l5;[Pr--m]QQeKLrKlI/Y&"SWBu9rG_X@o.02(P+05?h\5sXGIKNC+'O'^kBC6UhIU%m^V\fJ<-%Xf %\Kp?VYAVXXN>hLeH0?l@@$lB6LN];Q6h,q,g(=bbm&ns`"N+KW(bj/I2"@.fY[\?gLN/nQ6c8991O!MOR,'X>TqronE1!d!EeM>X %SsS6ca?'eibf,Kk_n6u4iX+2mhSWcF?XJS3%NXL^>A!!-r1b&1LO"J8hKLRFo&2;%#_tDCI<Y3ji%RsRF8N*\Nc:@-)%O")q4GPj %o/o<a4E\h1di9DQCZ#j;NQ52sd:V@X,N1V48bhfsi0eJ3pnWm6s0k5jP3GsFn?aUp:8Zk+*)X>'=:U"lkX?-GIn&FikL-5'iQ4)p %[(i`jb"l08mJQNFNHWfb7uat?)XX0S%DgF[4"@Uc=(mr-:lkJ>W6]Y7B1E'kW6^M#m&85??_=GlSNf4G8b'[Ig<MAO'?]8S\'6P[ %VZ)ghc-@tlgbqCeD3NeV]JDT@hY24i!(\]Vq!?#O:TG)UDm0.dH2ZL`oC)_K[*mYEVYT(ShV<R=`Sdu1?J^0%CbNE7d33MCptZeg %p7L^5-$,ke]mXttc.1RLh/`tm0#,"\^\d++Ao7@_B7IZ@#E4%b"6+jad1eT_!gk(#1Z`\Yr)`m@i*Q4Ari^Z+rqGOLHi1WcNdl<H %1-tcK'?'6q%JBBm3cjaM5lV"2?[U#g*"#aH(pJ6.l<qs4cGuOF#Kjb#7]pRr99jF6^:SeX]T1lspkT8=gnNo^GfKna#bNk*qlUd] %hd,&dHZOJAqu/T<"n=u2k`F<3MrUtpq1\gTq_\993G*""(\n=^DgdcC*3T(^0Ck6,?=1Y>oo"2CqnBd83qP6#E)I[JV"]lQJ5:H@ %@ljFQ:;6aC5LjlHe!Nmkl/Y!'-bnHf+ie]q0qE\c-QggZa)plJ-CrBC-7+n/qsm=Uk:q\'7ld>S$@/8Ak>3A"`t\+DWe363hgG$( %pC8>CXq=u<7f8*AF"#c#qoe<kgV<+O<nCE&r:Y%+qoK$3WUB\-pOBWdaVC5!YF`[_^[[flI5P<GYA`;.^Zb(Q9Cp!g5/6d%o83/! %h)E7AHJ8".rob2@3sOMiP\p8[)YP5)DTAF)1$J<K[GpUTf.lj)?]d:PYJ:"q]?AC,?OhSLo#m_7Y5W\Cje&_oY:o@YI!>DKbM.7( %Du[?=autL?IcQ^(m2R-0s6m"X%sK+01Uq<T>lWKD@G1II0!E<F4=T?tr8QDh4hnX=kN%RYj`;SSIOU<*R;2$i>4O<q:@nIsbDTdj %^AAmPps3j;HmISC!Wk6Of@U&haGZVH:06tLUGWR3\Bf5p&,X\&rGHkETCA0<LW?pL0lD&kgDo63a10AKDKCck*9/qAJ3'APNPoZj %Lr82@A)-3i5FpGBp&/5#EoIph3X29Ako%35cfbA(:nJ<0g%Sn(9;^*]@9)lj1N)t]qWSPO1gX^>K9o<,nPg(chQ)CsX1R8\?[XIf %H$K.<h$FSbS3(6T(YNltN87&jNnbMmZh&t'>K:7F3KME\EdnS\kWJE2mH`GNjIJ?'SVM0-*_q%]aZAn33VAUAGc$rP53LEkMjWb0 %DpR=rroL'6jQBX-Ih9'LcHK_;MYn\UqL<McI.PV[b<)/CGF*6>U_OAN-gf[np!#u:^D3dCf=cWqmrs8Dn"4Uss+].^:W!5.oR6EG %4b8$LQ-YXc4Fd_u\n6<PR[s6OGIoKLh%fq`cZ!k!k]VE=D_F<bfiqbfQ[f!Y9"Vje?`r6J!K3jWJ+bgIb'Mgu;L/g?kpI@updnCY %++kI:iJNn1:h+E<iF>^EOEONK.7&sL?fW'RfXkYf(t@2.9n!Lc*.o1,)V"P=\Rp'K:B2`U7*"Y`GNTcdkL[J_^"OM)00e<5NcCuC %r*C18F1:nRWq>;kK-Yk_N83[C,Vrf"^VB]5GF/@&iUZBTmWR^*?[_VaI!bb@h::?#7m`'5(JS!2rp'=d-0?/]q>=+?ST0[.5MZ0K %BU1kIiRQMOm'4G&&M".]j]"4&*?>XCd7`I[Ei1uX3k;lYh#t9:QF#L?gN96.HK7=NdPh'NYP&*On_dQ>FuQ22H$=VAqoR%umlbg@ %NtO;GrJ,T(J%-P8kE+\Z:[iAugbV&jY'bP8kVL2'T2HbS%(1!'j+$eicsuJIU;rkp:5=BAg\lP\fWkBH:e\L^%j.e3IbAFm]@B)l %0hD^rlAcJHgV]&-mu3;f["(,Q\NL4T+5OV+R?42]GBEV/i&u.'pl5jAdG[/JHq/t\1HBhE]*9q9iHqQ61j?Me9>Js8gJ<lKk6X7s %Hq07dkj]ZV^AARdo_<kb*oDg(0g8rnJNhs)hWZ_A^8J'AUXut>?Jkd(Hi)rdn'6,A,@@1gpS7lb4YPN7OWACI,3-YfcJ4QPigHgu %?]%H8noq`;]s-u'*Cj#Uk>l*M>S$-qg.D=nf@T1%J,8`$Li0sh^UUlPrh#bn'7PH*rUoS5DS>o<f2=f/FnWQ8m3fTkTnPr8KbiYK %mA9R$V>'g6]>"!p0R0!_hZ!nAd_7[;H3R=9!5dFdU@4]-Q?CMrh+R<iSiAT_iqWH5gF&5.?YdRUP8t.<jlPq1m.3aHT/LIl?(=-q %lJD<\rk=i(hq,>UhqsuSXP`7,r8%D/B7ImkJPkl#]_gjhippg4\+udd$D@"!H83'6541PZkPosQoAL#?3P59s^JrmS5O%`br5Y"Q %c-%c3c,TVA'e=to9`RB_C1'.+/#Y6eA.H]7HV*AI-ZhgARRhd9,(8<8G$g4SXPtU38Ip=G$mc?YIER->lZ]gV00eDIk78*K?94NJ %7s!oBD(^75Hh[U.V,+<Mp>'P2R/us+"-_UAeTVFi+/*nNoMXl@Y3s$;\U4H]r?8.qVe.s_?8Ytph>R'Fl=5S@iH`.!Rq$s%I>7an %*##^VMgU2$Bml,Rc^sKq5'#c],(?_.j<J'3ogR=!m/0`Rf(%C?c=?I0gn3WSq)h11mYZ>:O3ZQgAC$=^h+sR$d<U74kMa@QO'NZR %P.&^<bf,Y;!!fkB?7H];$gbuajO:g:QA<M`oQ!%;rVjnYeq]PD3(T4/S+AAacL_a)T\,mNd.UbKs6KIEqi:i<%PTC%b3Ar@m4X[i %qV(l!mck@M5GOutIJ`G6fRSaO0j^O3F=cPR?Up!7B@ohK-0Xlehs!'QSfHeO`NWjBm-HAHkqVnN[bLQTs"YaFT<?`<5NbT5#(!W5 %^L.-(6\H\3b.R)QG$*X9k??+t0b"!JXbi+Yp@4sW+nj?6IWP>Q?`r8Q6VMW0k5"HCleUb!&-A<Ze]p_eIeWke=r;)92pY"5p#5;W %mg_mX]XUsb>$ngA5E0gZYK(eZN9e^f<7KSSSdT#Ec41R7s8LjMg\9Ulcp_Dnf))?^2>_9i^!)SZ-WZZV68V):D,9N`@m!.lL66OA %^V8QW3SB`pnnF$TLt-mq"$G&WT@El)msb7ShYlE*hnH?R:aF1/q89CShu7d-_/q^c,6#RC+0XP(s7""2^XFq4T>(1$k3Ldf0E1t6 %n'8\^I/dOq/mk0^)R>jUnLPL>fDk>oHhI"#^]45T(E^Bd`t.2nIl[Mo2da)D'RT?2PrfH&`u;u?D>_`1Pl7XII5/PYs7uWgO8j"n %nUH;W0<`g)?bQ;cs$-8C%1W0G02?9Ln[)@>?FASeBeCRD\m]S>os(H_U`t^?[,k0t-Jt!mds.Yrrcp_NY0s/+rnW9JBliCcGo)7? %QI@`5HH:Iuc)L5eit\)"r;.8HC!4ecfUpaM)dOER\::J'UjoP(L$c7WP4VLth!$[,:elA$EU.=SY3Q'FZET*_5Q4VjnhlUbTB=pd %5/DtU?C%3+-5P1]*.35.^V<mi`C9VAEjL'q3dlV>g1`$rD\i:cmr#d)n`.=2GZqgaV!l,%pi5%4:Rf@PI:ltKodTDEj>ajs9iplT %FKC$;YKPq4MRNrgC%HT';Y_3IBr5#O_W&U.lB.[HTD"LpElrWo:h]or`tRBC24R.&B`M41rO@`fXo1)&q$,liA*+XN;c7r$Dr>/t %q/qJ&]'(=2Y9;l7-/&3Ep%J8:T'nOc+8@)9]/I%o@*k8_gqUI"mn:X+H@FO%UH[bOnQ+JBZ&V2_pBCD\;;]DFX^A.+EG^h0[-u_h %e;[1bQT:]dk[EhhZ+i3Z[`@pE>f+K1kcrQBcWDp^^%_p%M0X_j&^l@,2#\_S^9J;t)Gf+!DJdWnTri7I)2WbMb?d/<E?)=Nqo3gE %.@d7Le&KDnC$b5K_nAc:j*F4fI+ck0Q.'_QhUqZfoeDcIY9nRh8#JA>)Pu&Z*!8FU<'@p,h);=",,od_D^[FTNeNd#bt#((HX8>C %mgCcd(@-Z3'JGUdEUW0j&Xgs6(,:kQ6q*-<PK&&41U66i%]t'45ImT,Z2#Ma4c%Gq*MO'%T%\<.@'$lhl7;[,Tk&J(RSLoSiE=9E %@.:8IHJ3)ln,Qr"`]oTSXmL3YB`>#AY/aKUR/gT_XN`IMWI($t8,Gj.B$d*99=#KQ]>K\022%AuBk.Z1Nepde]iQ7V[^"4jJ&]r@ %=\fQJn%+iWd0I89crI6,nhpZ699K<D6-sqYAb0)oXW6bg>/pB%X2"Z;6UumroB+L3/R;X1)t2=o(gsH4Hf'@6KGJhJc0n*!>,o5o %k*MnX0P4XElR^CkktBg%Yq`fL]j0<Z><7=@O=+/]!?^ZUe1>BI3UQ"p@UTRW=c'>)!1cT\gG=Y&3Qi$_=`YHM`2g"P`PiYN%&;jL %?\hUEkoib=gA#8=/0<tSaeYiI_esWS<AB;1m]*.=/oKOPW_RZ%WB(oh/A%9;m%#eWmJ*+@?1_ACa,]B%TcdQrHnpX*ft!p$>0`eG %e5*+rr%Vj3pEmIi9Nb6s?;H@0V&s=iEM@s'$T+:D7S8>FA#.*_U!^CiFcQrja:HR_(-MX1Io%/m<S:o>Zqt<[Q,YaWH3CL_V+#d? %?$uTIg`135SLCNn+`TLo=?:W[=IJ^pa%js`7%"6\$@f3L#"nSE?f#r(1sr9(V^&Cm9?MgP!h\PF%XQY3&(Ub5&i+mTH'7rnLGnTR %aoWFriV9EIGIqX,s-9:rprW+%.on=8HCW<q"VHd&h.9BASL!NUe3XX*WSs"&/+K;Y`tmc23VKa"6D]dtaei-Sa^-g>fEE=^:J.]A %4`,>-[BVmJI'-s(A?U.t.sIUR=esPMK8aYS.pK5fdm-olrB2KgkCtfmW;6LVbb-<B>'V/\(k#%djZ"&2J88Fb+4_P)"QR%6coj.3 %#PeMpV\f\]:<(H6E*,D'Cp,P,@FlkD0A`08MXIjM%6\;PAm(l<[b(9k@rAnpS.r$h[39G*16o>./N(5Ma,5R8f%3(D37:A??iUqN %EDUqo)(h&RMQuEEj&'#4C.Y4e<4@o+%A"*Zg13^;E'-gMH5?'K8]%_@"8auDR.?Vh)1^!H2F`G2ps)Zs4*1^U@^4iIl.CSTF(fJT %>T1fj=p83WO`@L=iphsnMqpU]V9W*L=TrjG+`:o9N(;K8a2n<c`/2N&_T84!KP!H0h,>46A7H*9E+4-TG^Q<[;kr4rP>U(7k'U+$ %DdA&a"5q(/FTHN<q[d&3@NX09_Ju`(&XML8IFGI&oX'3A5;quWpd&NB4I%YOZ<tYRQ<:0si"J5mEB\O<C;uUJ$&J@)aa5[-=+dZV %Yl_p/itX8LP&ZlQdtZ*DNCHp-1GiKL>tQ%hf`R<W@JaT:93r\a*1Kd,\J0AG'R$d$mH5#b;0a@eO_mMWa*e8tE$KV)bPfJ]&d)q9 %_3">"<>_-7CABkC^?a()oVP_*@LA7MH[UK#_<Sjr'a3&@Q;s[*9#BO@5W-o''ZIk24"mUB5E1jcb7jZd^X#9ZlCo1E\U(<UP!7;) %^g7A_(5YEOMjT18fQ/#=(oj8TGd_^mWmN\!rGcq[eWu)kL7sBKn`kmjVslHs53T_:A8+K_$q1S\2Opf+#k;fY@c2)dT]G/X]3lUh %p"meZ-?8Of&a(9YIL\joCtt%u\?Q&&4W444hg^JH9Mb-F]l"?;5+@B+BlnC;N!V,>TCE>U=Q-m^9^nchgF1>rb:o\H401QV=]CN> %3M(dn(ZDk?Q:I,]$!CoY!6A86^8cZGcG.)ujuQ^b&DI!IA>g67*EpX,:j9Kf%=Ma:P>D<&Rlb0YXRpmY2pq.6IGN\&MfA+2.@b`f %DT/3eh"@3Z3u2K8nn[>s-.,#:11=*^4J8ZrkQ?i2mqX<aQPBCQ2Br;aZsGZ_*XTe@'-3Lj?$9M6r)KB;W5H+2)k**72&(MA<D2p& %"Ff((d95\Ppr@l>.#M[u*BK\T\Sdo_,TImYX[`lCC6FcS:T)h@p3]ugZg:B)@k%24F,u"]rjn\_/?H(Ym544%CmTG:MU>-.Lh$=! %*ml8*bP0WKSA&_I+fm%U9gFYcdmTi6LsEDTjofO[Z/!f_kqNt5U)VTQTuE>(dfmZc,n%&90rr;i?kk\,`M"XdbbX/UKc;Ah,+dp5 %7=\:Ue>PqrDWPqUpPh3@pXWSNqi;e!!^Va<838'gh!Z2IlrluNDAo1D^ZZn\R&]1X@e(&Rg*%NkUYR_WZatT)`c<-/&,XlrL,Hqr %1'\F-,Ffe7?8p.%:>:^<Y78s04RGsfBu:<$f<1@Nkq7ob*?WbfG:i%QT''L$6\_0^+`9=lU^*ZmDn+c]cn\:G[G,eVL;Q-4por^3 %D)n??lPbhRX#M]k,LOhTo[<q_77`oI@77]$(KHsb:jTM]N9M$h`8m(jM`GWZ8rL9#&7HT#Cq@i/Mu1]Qd]42_i2,S5%U*uf*Z:T^ %qS)b*oY&AAIBAE;*"i#'[1jG8Q+W.Ri!\bHM,B7-F*7<-N"^G\[V`o6VSIZj&J"Hc=;sU%g(G^3A%P<?F`HCiVh$P'[gbLg2>g\g %/sK?24%;9k`>DpU$Y8ioV]cU;-B$'gk\.ndX=GsWPKl)"mcS#O<SqmFX#`4-+-`9R+spjkjV[7q?$WOn8kW0nma,f:9hEoh1MZM' %?\gk;@`o]&ShYfV$BEJ;.#8pZlu%kt6.Cm\`jtEhAn7USiVKAj2I[5%-BVp7+9*@L22S.=oqpoDUSWKWR'&?)FHb#o_QdnTEifWE %0ZE]8#<a:[+-nDYi4NSq35daTIM'O`4ooH4i5@H\*RF/<Un]Kh4][$1ig`l-YtM#X>3pmC_A]1#$!)a^C6Dhp,n[b"PJ[+=Em2oc %YF1n8C2^B#;P!g74gA*b,]lf+01X"a&n3&^A^NA_3`^C]i!H5'3e^aO:+5;Q0W>rd4MiM?<![CNSS9tt-ttH<@I]h$h6eF_h47$e %=j1;W'5nU0+Z=.V04IFS%p@S5'(TL'\Z=c?HRa&0'h%UA+4`Ce81PN-Y]@a8j!<ZiPP?_>7R@DI/S!iR=BrP.`\,I)a$Md9rPei^ %#"ZgjOgLC/QZh`IA^KZ#K*S'E[O$ui9jJ3YdNqk'YJg]Ml0[=T+F@b"d("NVMYNMdF(h22*0)cHI@1-CVc*0DDb_m<;ggo3<#5SS %;k5EJ$YJ%qiZN)q-,K+J-kT4s?b3bP&1JDQNp=9^A>de?2tC"e">%_s3)af>)gL15PW3Yh_XP#&37-D?!42)j^0UD[@m>08d95gW %g\I)F@=)N`92M(TWtAeZKb@i-Z!2;\-')TkD!3=nB[meUF;bJM;f-3_?H8OjP*RV0J749(U1(</E[7/([?e*)boCB.qm?pL+.D!t %3YsY*7^m/1`FME<cln+_\P[Y+nIJ'A_[+X)<[gI?23p)c:j*/de.PQd;YHIe?i%2N;IIs8;3X>o@RG]m[bE4g)mO(h(jO:s852GJ %)P<]O12S@@Tu3VnCc>5t<MtD./;\8'j)s,Y54,SE/Q#M)lq$W(`6(,bMhY*OVf7Ht:u4u%&Z-kqlJhnOX!&4)cC<G61^&#@e?NO0 %(V]\JR?C_nq3k+&nWCEQ<b.I(1T]L2!dr^Da\:F?U4[<-X_Ia8PS+pN.,LEo3\RPDYB.-eVau0hS6%no>>P"E!/pZW=k:c:jNj+1 %6A`$Y'u&6"7&Sb-4bMCQZEA+8b@lXOG/>$l@SMb\SKCa2Pk2>jfJ)ZdAG*4,LUB?Y0l'Nke^aF[Yr3'ZF7('?Z`C6c\9R]9fgH?c %U5^6d>&<so;32M,-']M4X$uS@faE0\6KkeV0p_+)V8^"kW]A;!C3[BVP'Ltb0.EYQS-$*'Rt_JgmgNQ)-c>710XTs20Qg1q[u_7& %s4MbJ-+T$\:%Z."hBC.`F:F`PL_G-RaR0Q?&mOXP6s`bh9."GL'adO<R^Jfh$D>aA5N0fK<@B-rtnWf]j5D^baF1S6.r05QAB' %)2$d6a[COQ^r1@.5<CD[h%r^TR"W,s1'iKLTf=nt9O6++GHYe1.7'X]M>[,?C0AH)F;SV7Dh?GdSF"au^^.f.1p;uOmm>bKS-L8i %f$/jj(E'df,:Z`8f%$?q&Jsi_p\.MF2E1k.pfQMb+OVTnW0BuFDBJSs[iqcj7jDg:HR+28H59A"Ls/iQ=C`AqXhTSB+/D1"iIjb# %i_8b*=knh?K_r(,/"Z+q<Aod_dtV@GZ46MS34=`oKE5\laGgR`+J;l'^A#a'K=rF"SWeoCF<\p8/U8!iek7K?i_^n<O!J&1L-e*W %^$Ks2N$7X(3($Q>Vs;%cp9iU^#)_]pfukXXAqNq`/AaJ/`<JJBFW-LD9k"QcO@0[Z?iB__ck/C^^9>t6[>hoY\,&#MjQmDWPQD,Q %IAW:fB[st/V=7p9DQKR62YK_J4^eqmDVVV#DQIH1H9+ufH)uTfYf7LGmbY#AT=37*;\L<s'"\A6#<nY1jL[&5*UIj2-g9<eqY\u" %6sQglf?^3pJ`EGr$rM`Wb,p[3Z_0>(,@03YGgpsT5l_op,jN6Ua+2/_X%S83Q+l$qWa\_GWIgGIe7'f4gW?QPi+c"oQ\18\VD6a# %-oQdL6Yb1b$:0Sq'BdP2Pf6i)*0?plIaq7th[#Bg5Y/_-Q4.18A4g.[7rtaD+m5;KcQZgrM1YHd>INprh\D<n?aIWh1fI&]Y(T4U %F&l5B72_C7m).h(:m_,+jpSCO%15#@)i">iNU"Se4TM3HeQdW-D0at>7\!D;1NlGE@E]+0!^4@RFAWac`6kqA=;:_BVcUBW:_-(; %&rU)5q"TrD(sV/26Q,5sQeSLgR?]56-!m(TmMbL-c1":U`kHu8FCZJV/dhmM+=^D2No.4b:>W+]-*ZQhiYEFb%N\_Yg*K*=()H5U %=-Z5@`-rg4lsXC*=jeh\h>oL.@L<g=%PGbX<F1PM"U2l&`6?8_d7)@F/hfF*)&?r\,q(7/V/OE?;H0aD!:(P/p12)UJU*q.T;`tL %'mYlqn(BO$Cs;Me7"H,7S%I!scuJu;]c%`20uJn)o"1'$ENsuaD4"')@A-5rdV7RceN4SgCl4BK4b]_A2Ttu\O#SoEHH^^G*sbh_ %?6^``$Z<YL33Lf#Rhsp4S(?dK*pZsX94AOBns_a#FpYb;+u7ZGX^CHDe1EDp]%VKL)d/nXCf;;T'0sUjd7@@C<]B_9ZC1g@U&](" %BWBqo"BRGR<)V'r"(AV7EkF0'h4:!iVBL9D/IXO&(:sD7pQsmj#6d]r>^!/(Kr+i:/U$uP0KAtoT2`&a94"J_%AC$jD/f[J2@I,K %eo41NhZNBFG*Z%-X/Wk=$E3G+#DPTs^JRd?C0=$p)aM\#LeEblT@&$Z=ka5["M"Sg$@@@O5VB=EC_$l2@<[6a6??GK?A-+iVm;[h %o+e-`S9*c2aYCV&8p)_UmAWZ<9J;9Q3KHI'H]",VGC'N7DsbBCN'DVjE<f3M@cIh"hsaYn-!dTmn8%WZUG9`i%93c*/T&h4V576& %-P$;=gVn(dQ#jEagn%YClWccGP6oNYf](K%3o,Q3+'pJ8SfE[1L\2sDnYg8R:=fXf%juRbq.e:m"6,;U82L1k\?JfUG2kdQ>]+4l %$\3?1#Z4]_*LcSbC&a8]=KDfqT0_Tlk%%o*lED*63'^m/W%3-:_">bie&^D`#"Ua,YU%WIn9M?@MY9)[?T`lJDh%T&(Q%#3*5%F2 %N?X_"a&?/+!VL]\lB(7YhZ"44g=G,-DHH.1+!<8WNnZJ[]%f6<^KP]-FY.5*Irbo4BR)HKg1C/\7_h>&&*n=sk@>\-a*Lt=FPmCS %j86aq^o&hW((U'?`Poj"L-TsY',Cs]I26@$AVm.cHR$<.('r<cCV'PEgh1^^S"1l7dZ\@0qH(TV$jno;N-m$_]2Ck[1q@K&XO_a- %2itJA6'RVU6/kqj+LW8222=J8()`<Lk2]e2HTf3po#_EH5Dg?rqpU1)I.@!,bNi/[jY+@C<WD5JgH>CAo9Xrr1?'RGm6GjLD_J'S %ige2h8Sm3RXd$cTX_:=3l[.7CaP44PV]7VOJ2?YN"EV_gkR+GX%T=4",eHHQE!duWW.UQN(t!+1b+bPNKQX=P8mfL!/A2gq;mT_" %fo=0f@.k;P:/I&K@D'qhphZl^B29'S_b0R3+8D99aCA%S=a:.IJpR64Y&P</PF3noZ2G`:&Ni$t%lm@gYF6p%n]?uUNfRP<I<KUI %PZKogC:!]2fhr6Z5>uQ2T1oO<6XD%HWg7_ADTd!g-pkXnTm*6O'%>[7Y>/JK$%#]`B6FPpdeQuI^h6pmbMmYqW:u;bY$+1.<g5ZH %r@qgdRWIiLbk)O+"J`Ul/A39><cVqV!MF84$f5+^dajlane^,(UH2>QA;0N$;F/H9Tf%S2P&V[:MM<ZJg-F?I@Fbrb4VI@3/G$t8 %[Ac;Sd<ZB/NF$W4SkZm<WqL:0&4<5!'R5%GF'#prQ)nc!&:3SC/VfY)L1Q]LSXq&("@eP_OmDYrqnK&3V9;]/]/uE'rN)e7fktAb %-_2kP[,^da7L*#?)?PHbU=6_MeH@6#4#0U^S-T]LL.$:$;k6Lf<]/E@!u5OuFFhZ'SN\#)2bC(:]*3go+P(WAYK;["[eurMSZMQa %*?YZc0Z&AF6cAr/;nShJ.+&Jbr8NTU4J+;Om\`o5$M0p+_l7OCh,[GO$864OA)^0OH7_0g6qm=]Y@7tkTs_g*8P('fe>Z3$kS$uP %9e2$Hk=6+;kZ-'eD)X><q7_*R(XBa#kTS.se1%9mdaZrbrQ!p_F@TJ'\+[]d@P-[UK67L)on6fAJ$RWD![2q\F(9#e;s3fOb[%^R %kiDolGbocW6:"\@aX,EEcR3=tGkO(`P;L%"#W.*:Yb"RO3K)`cl#]^(4&kh2G]VpO*7&^gHlRdnFTM!"-3p)PD"@6f]e^YH"=Sii %qUj[cnVa;q=!*+%UUEBfa;&tchFCjNm-YSl=jnaCC:Sr)93N$2O`72Ge<>lo9Pt\.ItQZ'Wnfu*'n"BL=k*VOG>W+*VIW*4S^ZLH %/K4i,.IuVRr`1Qk_UT41[lmD_r+R?OMSBQ\WMjpFr'kW#[:*@HkOAtIs6@aKAu_UN,KVuZSBbF[;DPZ#ktICRd&%^ATYA<Q-YMNB %S4D$c*@FA_GCI^j:l()mYJ;tYZBKJn/#uc:F<HcEN14%u6^KFX$Tn^#aJnorh7DJIn#cV.[fkqj*4+7b6:Te!8eI<iSeObOrI3eg %:_]6l_d*T-(qsrJHREgE'"TV$Va(gWQ^kj3ruiP4"Q7$#9@]:35<T*W/^m?GAd##M7A!s281[Gj(8HI#3=Mko>)ohtWlibQo]8(R %`(Ua(03CWD%[8)[&qX6/"f`<VcEa\5I`p;O<"NG9'O[\h,S&<9dR]3%p:C9Z>CR%oG"lCC$qNF+J71=.<7/1aZ^`/"RSD=>dhRYF %e`pO.&`+cU5d/g<3ihnQR+,SVgL%E]b,;=Nr%"Zfnjk?aQD;o4&H[A'-3';Q5cnNOb6/BX?C'aH;M[kB;[9;gSfo%JHJJ`hnG6Y0 %+CFm?oq05Sl6[@,;1UAk)&Brf(W)X*YsJsB7+=^b:HMBOQ3K"V2Ehh<g`S,E21%f(&X2TOK7sCQE^V5fbQYNl:#du,E9uVUOC+cV %Ag.n^F7E@L_VFq,."VIA@Sj+X['FW0?k<0sB+TX(K:8qO6UphI/E"e\PdfEeq.<"MYPAru*4,uG7[AkQ1!V\6auP'^^k^h9`2p<O %?<i/gnGUrNg3dluJAN0hSPkSk_RP1?h3[%8Ve6=iV[UEucb.%.I5!8VRT6Yu;0$p.P`rd5G^o[QlUt218YeX[JQK]1EWS\#.Z>#L %<F'U/8=X4/XchO^W\[QU)/+F*X22>Lr(NB#NmuIYJfUAZ)TG/\h;!>V8Y-O8l,,!;0$9aTrFSfG#V8I+[dTO&2l]kFT(I/GAtQ3E %Yo@bK9S"<Vn"4X,(eX9A+n51o0,!n$FPnPBM8]h"`8XBn:l(WK1iY-.EE@RprudPo@Vug%,)J99]/cgWJ$C>K5"]X58hAG.-K&"U %P[eZLn*iR-]=9D)_8u$)P[gW[bnlY[l3h?Yp0Mt,,r1A6$up9=jpcq6HV9tPG]=U=gG4)Q;,h0,")f59gpnTR&uu."A@N;YWa_5a %RuERXAjnHXWa7V5VmgmcZW1tE/l]OB&e(*Nbdc`5e!XlDCe_/0aoE+Wpl^!b'RhN'2C1hiVKZ(d)j:tcHGF2iZM-D%-T(6Dq1!WJ %]m)IX$*8d,>!^I!1OUeH\l52SL@llB-'Aqo6cArmB7'(onOc=%rRQGeR6H"j-$cu)8QV@;2*c'+2i))e">&,*R=DGCVW4\]8QV?0 %Qa):SLh@aPJ)L$LO;:sPHb(A+CMmkfh'AS7:o(,%Yks(6Zcafa2E'elZ^LACM,u_f5]c65Cq>>%)k1s#bktMP]L=sI?r02P4_t$_ %"u$<4Gh(HBZjm?Y]VG9,EUr+4fmW/'i`XCQ9fIm[9#_D^(9`s]0u$#e;DQLp_rA':S%pt==%]@/EEKkO103EEig#[@V&pJVP`2a+ %#4Ym=fX;9J=%`<LV?+IO`2a>^BCgL/0\+XjU6LOCLGG[d_nkS!9t)([U18Di6MffhF;qtS938.6,eQE*IW8`dZOrk]8N?\.,b7q2 %;tC4`oS\'bnV^mlcG)?7Zg)8AhB8D>EEBLGi\Y)A?_!pul=h0o+J+%%:UC&[1l\D?S>7[c@rgHLSpkZTo.u63]%bu/X5N1d`a<Jd %5m`/;3n'MOA5j_$[MDrMZB05jPh[B&9"qt2[=kKG'KMgk+7`qF4'IK5Xi6P<bmKCH;f[M8-t-></bcZh-*J>R%k(*?rbO1S;h57Y %0M2\W]KlrPcOT7^S'_*.Mtm6)H\GGB`6WVFhl.-@&m:tNN&jD$l"<*;\`4"-(S#u5=Hu!1XF"bPg4&^lPB_QMU#m]lgb8Q9a.%Ch %Y,pNFL`@^QZ[2=:]R&&#j9G/"S(\,52]^oRQ,\mA,[S1KSo1&MN0'Dgltf0SX-jaP%H@1dp3#Cca&8J?GI1_"mj(*0Y\t/X]6>fX %e[@2hk9$6QJfDZ"O7)?5mMiCs"?CP+&gPhUC?ESEA!A)OF.j]?.I/V/R7m+,P^DH^Sp4'*jH-lg9S/eFHnR.+DXcMS:B2#dmm9hY %WOC;&S6IY-X8p8'$/^>V131AB+]>292Za@[Cs)--Te.]Z:HKItF<k`q=Bhh:.m.9ZZSE41$<"F/6AZ,5<fW/q!m4/Tq?0>^+j]e4 %-YW!n'8)'Z]n'gKno5t8ZX<G?Qq!<.L_GmXTR7A&@mhOB!!G)ZPu="+$-<"tD4*i`DTU_s'h;>_n:^QcbG@+VBbTXSd$"H1n15]o %p>G]d5PY"s+c-Q3$-IR2/rkS0i?2cR5b46-Y_C$$&qSo"WT\HF)=PkeT8&%5)MhuNW("Rr=Y^](0PFoSG*HHp+Y#dg:>OnA;UBMe %!^Aa5OU/6nc4+`I8+"K"+.rn;.1,l*@)l,JE98N??tgdmMl1;l=(0`4K,0!I9I*i,VF8NqE)JEdK3=r^NIk*!CC:NUlBR[CGU!3] %Q>HZp20rYN$$[jHe&CMY.9<2gj!DKiE"m$aA^@<kl0*fe@%%9G%,`a28g29ZWKRT=5/[WRK_Uo'Z\TH1nc?mA^IWg(.&_i`TI@cK %H]5=(VFf?p/[As+ZVFsS;2cDJUjg\)aW0>;$5s-3+7$'G4aWfXpeIHHR!ji=(aEK]68-s+11^iu=Rm$0J90e\1d*!0`2os",5E@G %c]s(W-Hk2$hh-.bn6=m-V?[)W&916!hO'+0ZGl>8?M4fMYu?/d-VS)WnVkg-UUoo;.L^`JWrhkVa9!6t`KY?ZK&WVh0ZAu;8]SdM %Y5C+:6*3PB.61%7[Ykf,N!P]$O1$F&n,Pme\U6FpLZGNZ\\:1_U^IJSm6)3j+]2ACD(Q(<VdQ5PdE%Foa>'YM"JJIm"P?s7K$M$C %1nU:a-2Vu)UTYO="JKXm[lb\!"gmJ[Apa[r;9hoM<,Dt>g:,\q)>sWdY$bjeW!85,+]u$F!FuIt!m(tK/:!0s>q;p%dq1g"cBPDd %mThX-VUnOp(Tb&=;--DrYWL_p$TMn_-mt]b,7D(H%A?V]Amm$=Jg:S8jtdn)-W/N'#d'W%1l';\m!3=R5r:/VL&TK-8PE=e\>Tgr %gG1`:=Nhm6hH[kmR=XOu]h(a$H"'FH(DG0(BT"8k9m7CXn^Y(,$3k$aeuR-*b%CQN-fJIS$99=!=8B5H!ZJ+EN%1C(?^GFhcqbRX %-b$;DI4ZZ1DDk%=.#Erg\*/.CbYe3gfn`98r]f3XWl*epGRc&VL#Jr?jr`n6e@Ok-2$/l26+hHU-\>!L[L-FP.9TItO!Lbg8LK`O %9:>Q@MIuO+0Bcts2s@>UukF_o^W19qo=Et;%&cp/tUI.-t\c"U>Ii2L8Yi;f_`=ZLg;),"ip%>V7";8Ft6UiO+:$kpE,(mqir %d?`4c7"i&/MA?TR2:t/p'4YLV+CRo?[iJ/&8d&(!VbnDop;s1U1nrZ<)>#3ndr!>:X%]f"%hhEV;\6J1YR'2XnR?:VYgsT^pD);$ %3s2k!Nri9-DBq";0R5LqVaR<U,E%u3Mn&)<?^3PLCf`I!%Zg:s/GM"Ze8keGM:Pq).4cSP(,#A2"pA?--mLP<T'5<-,U8H_?](T; %3'##2g9>0s@]1Q+h%Z(\K@=m`(PkP_74j3VTD!f3f\D<uD$ORbAK"tob<Yn0d=E1>S2BlC`=`"#mKak/J5-![6AHO$G>#E3EZ-P` %.G;VN8"=Gu"fE>u7B"nS,ZN&@&n[Z^bZTdl5_up=+g\6X4XVDoY2ei>OM-DLLCGu2i/N"^Z+5Mf"mYc8&.4:s@-b8=MoA=qKu/C+ %;^$e3M4%R&D6tl$Q/H+b-"1c'm6![uS3".22OEQ-n$Np7+0<FP-!?U`#X+)VfEF+2,Ri-PUkWaCW*:(7aV/*(-Hp<>iX%H1^2D\G %Kk463T$.dN,/+S-0EtualDn6'H0sV!CuTg2)KQ]o4m8b*jfE)_&44EC@32MUZT(kNV=mQ4gUeCYGc_NrTjo5[BJSSYXc(hW6WbI9 %MI!&^NI17F8.gJE';SO]3Xo'+aq=^uAob2pIVKgTg5iG0VKE0b[:pok0-76lJB_</N`apXL1X]6M%IT_N'aim';BsLBc,>5qhY[M %"HkUJC.iH9L:altc'+6.fZO7F%WMLGl-R#qV07$hj4S^uS"lgDopZApjAP!8KI1M:7#r#ApX3kZ*9+pt6d.SbnMq1N[n7BE/uagj %g@>AFQ35UI(@i-kA2J9?db\+W_,@#bGle`7Y3<)bVmbX!,,g%dqVZTWG&l>)VDdEcd*79jB/ojV'$DO9U%;St7M0o4@[;-.-f.lr %Rte+8Bsl$3dQ$KL2cp5a:I6qHi+j4i+:3Gn@m[N<eMtM'7-R_Qe?dO0L6*'^=jgX2DGmM:34qda@'D=l1L?b7S7ki*jhI4j'$5[] %rV\?JEjg*`aYfICC*ai_YSQP1Wj-1U?&0d$OfokGi-C2-BK1:!ZqCaZ[[)WaY"D$i\4MK(d+dWmD(`ih-4&210TA3o=_rBY$b4jb %4EB"-$#G'NDIZJE%ks!)B2/<U6<m."(j9FUY)%=Q+h$3hNfAqVaOt?#^530@jW!.S7pDDb3XB6EVWjfbo,r70h,tGj\6$V->B%[e %3rh"aBAD3CLaQ#2b&pp")(raCD(?bkpRtuN>;a0peqg+c/Dc&++EIk2@^"]6QFI#m@7)=M^7Q)jYHaQJa9H(fWQ/mcD(-PH]89=1 %,3Htbf8#`3lFT*T*GT4GqsF^5eDG"BSaD7K36XbP0u#U+Pm>pL8JYbPqX9Z^[RrQmeiJIrn?'Z52K5cu.2:B0^d9Fd:HPs)mknh8 %l%?Si0^N2J=KK%NhIP7D./?c'Zc,7RPuV;ri%qlN>rd.\Gtor)X1/l;J>TOu$l7$SV,iA736'4CD[##/l:m[PAOK6+9AF;5X<"CM %67H@E;97S_![VKggU,YZAi`(\/DK%Mqt\5ig>Wl+^""YR*AC.F2Q0<tL^qXe#m8J8;)3mEk,:V,:dpP7lkN,2iiPm\6jgAYLD_nU %*B%,c/'M1!#aGl'6_$E*m(n]T[gIeFOE#'0'YDe?>[`jkN6;C_<mjJgljFiZ\!7e*&K7$O%[=?Y[GXJT+XW?4.'2,`o,[YcBQ+`D %n7"KHc6A;W)p^jQE8rMk9Cm:g)iP-o"A0oQDN!Gb2c'DuPj11%rfDI!%[4-V!].AjI)H2C)3XLo8f^H3jbY3j^]apdMJ4S<Tfg/C %.+d6tZ'&G0mN3r&V_pfW&;+nBd^n/*FuHZgS1gYTaWq2?2T-bnohXEn];*:?VpWc!^p"@PU%uoR>Da#IZD2OXne5Cd%l&=`-`q+r %XIhb3G_.mp%AW<8Y=\%T+5H[>+bhJ)S2*CVR>QV#Q<C:U"`+TZqGBVAK]XSU[Yn)!pnD(MVSa%94r[;[9'FMm[LsgV=IRq8fpqqm %HP'jG#bdoe-1/)T)?rZ2W0`J,=uE[Y-0Bb[BY!q]>:P-/`#Yt&&K^/dmun]ui!$!D8te8YeOhfI?mQ$W-]u/Xr&Tm;K<>>O4grA\ %c=5n%c:Gc]@1#i(N43q,h?+GFb"fa;9Pp8f5t!Ajp1,%)ZF)Z,;)2$QJW^AmEYjs4,9_GFdKKo0Ga,HVr$<>Ji:^:[#7]lBNl"Sh %,?#1..+MYIX"Re5:uH(`HYid-:_1/FKf>KR#G=5KAe?Ig+$X%`SJ`LYAJ:;&%RSD"EJp@@$:BAL/PRaKPTVfbU`icJBj""UpYqs5 %o>GoJf5(0&W,9EbpNd3Xb4;QBldbI3g.f6UaNAIW9Pl6FLtr2rjcqNhO)-+3KqO^^Boh!$cbB8g1\Gu*nCQ?b=KAro&6JL7'lRc1 %D5.O/Omri/Trd"s]F29Q[B>/d5-hR5Krl](fa?"u:S:#_"J0eeG.\Wume=QRO-jBDP34'efFa=fn.e#oni1*9*AMh'@Yu0\AK3GD %Nf>fSQruBh0sfMmQsrQZ)954O,Gr[T9X,gSeJ:YK)+RB*,Gr[T9X2iNC0U(]RC$!X@TL6Nm>+oQ`3D&1eL[5:?l%dYks?@E`JtcJ %l4Hsl,DO-_`"Y:B8=34Mek">l*AM+d@[QekKtXoS2_pD\Q#%Ep.l!&$;Q<5\[NgM79u9R@7gsTmRh&j@lEQK=Lfk&)&Mo9-*AKB+ %HGh'j2J<LNgcLN5/dRcl?<\C(ac72NH39Fm,A,/o1ldr47naiA7^40bbstHq(AlU)*#j(>$t5`gQs"5q9X,fhO!COS&X2B&VUuKE %`t;8:Lrn]0R!4bYLadKa9Pq*V)gNDXZZ%s7B!E@2ZdriOg=ag?E5[\Vcgq`)MsZ<Le#$tP9URg6EQ$34Z,=B2<]`2dXg;sd0e9LL %#"*/Da2W@U1*872Bif/lH^WHu5.L1r6^UG`Tf&SE5(gA46T/Ki(']L>$D44''pZm`4q.ps0XEP05][#j-Fnbn`apH,iiqGJ]4*@7 %cbC3F#dfKH$uX7P&83E*KY5npK]+s25fI20Z%0\M`$4[KITpC8?Y^[2[ac$JO&q_6P7LJ7hJ4DWIBX?*16Dngm^e>reXpRtO[7np %=Gj@`#78:^1VW8c:pr?:B)J%DZNG;aX)uXNHX[U;m5,LcER(>tHN6O3T*=ph(=$Mm`i%Ai:_:J>n*H8L`b)dt)DlU`G.KR(DUH8- %[pU><@<AiB$Y,Pko6Y=QKQ@9]gGkBkheKEbL=7DWDF;pEn$?Ad<is/-W5BVG,fD`W)%+_K2s#JH+&b#I9$!8nTjWZkPopHKG]L+4 %RRO;%"gY@q[IWOs9(;Be/d)dk;h1tq$pGY+T_&Gs(i?[`022L5Q=hA3AGH.c[MJB7:qGAQG4r61I_8AQX^uLup;Gmrk(6ZhXAH&E %)I.3!##ZA21KKQYC7?`D_irXpj<q1"=IVahCcCp(DgU!+)%WB,Hlik\g.nh_9)!\jmY;0)C^$=1<WJEKZ^piS=G7XlHN[R[,.o$X %bH[A2ctdM)(HpKlV;T$ab'k*1,7.S2XW.YI'XGJ>%3\>3:hK&R@99Bq>,Z/5/KpHdh)VgiKEpTf-a,cFKj=?*.`KJ4/(/05:I(0Z %nHr3!i=B/+f.<Hg?mWg,9P1LL,i3PR[,)d31O')J0UP0b,`I723o0@0=Rm`U'=<S*U:&6<2k))J48h;JT<`ig(*bq:$8Y$*>d%I` %]Ie;]PQ@2U%^C9>Sn4s&a.)2S<"j:W`qn$"-uDSOU50:tM)mJF"ecPE630u[=)GV\J<q4e$6:g.>a&T?%f)5uP714E%FpuD+j3i@ %=cB(KX0sHFB[s'[,Rd"("pI@&A1S#ph"f+DaZj?V($6g_9%N8O*&@ur@m8-lZh7Y!69Kf58)7nF'[7KYQJM7fKCNn,7X;jBlY;4/ %g!/r(]Smn5K$CVbERk*o%9gU_#IHCqJ'q%XbU$e.XkH7HLcB+>Kgpt`MrU<Y!j0j8L=6gS$'7,0mF6<lf;*Pm&+4n^Ucs4,VMVRi %iXC0DO@uu;01J\Z!+lAGQ/GQQ[;r*R@:e9$aausr8^V9*oUtW8Q&r')TJM??X!/F5h[M@g9po'6`9*ps]B?Ve"Hc\M^K=Z3R3INY %YV/+="is,8[0;Y@V%jAWk6Z);XP+lCC:r+KRsJHX.n5n[HKmOFJQ(Q*6GYkjUuDP3S"-248Z7rJ)g1DN?)CUM%oDUDT%Xfa,80)p %D07EeUA7s)=FcpKC52"_&2\\bLYQ`!=7XkP5UOl6.ZSYFmNILB7Fslh7S;,@1D..2Y.AKe+V5;1:gM8C:rEGg]_^s&0R]7,1FJNE %=05LFH(IL$5l2\Y7>81\$K9umRtPrSH<5=EP3%9h.g59A6I&LJ<Y!&=);q?E7*r"A_6fHuU9?iX(hTNo"_0?S1Am/j<0ps1,q?8h %=qe,@D7u/H/;q%J=2Ft@SA\0Y>1ZqZ)q</FG),[#FL[NMkh4fPfIbNdZh%_Ir,gKGCg,*Q8'W]Mk3c"pLJWIAh]H<PMC57G.[<]B %Y<oQ0/(UZ,S_qu)mWH=Y%MpiekY[Q"?BWlh0X4A%!P[[S4le0QUm]3<dYUMG+I#I!-l]T,V79>Cq2;R5a2r?Dir'LRZq2j5ko.tq %[.?]tb&^bg(.<SP3jr9pOR:.44kgeV>In^Q`Hg'=fb_F#qaJ@ll]tPf8+Ts0_PmcP1%89B[A4=EH.6qt2'&(JVAIT95DZSR"t4G6 %kZ'ns6YPY@k.=B*MioiZd'?B$BM!Aq)<,0,B@87(AD4J^jfhe%-hFcZf9_H/9G55ZS)M6C]u9bi&fS?*,n<Nc9&1]R"PkZLND.Mk %6YNBU!0l)P'dZWPhFNCq!`14PZ0TT#6tuF8k[*F/`u[up^=OrV&n2kp"DlmP$0[b*/6Jn%+lmY\AuD&a=mWDTZ3mKM?SdGhN:_B4 %M?6W:1F;$'d!_Ea7GHU?1J(LbP5@G/]s^[Da'"=4lj?7*oh!A!Z?QFa?#<G#gY&-X(\Dt7gsEC@ET#iu3bBEh]P)I=F"Q%6GoHtq %.u(@]2@A_oeiJKT!&bQdlBS#i;ORd<]mbJo!PPCdS_D@BCKbq/5YA:WKOJ\[S)IJ9Adg^^@PI_=]C$eG,QC[6qr0cpHe`2A:@cVp %&iF/,8?D$m&\"NU4dn;dYQZ:O5N.PQ+9h$`*nZ(1%5L&M"Y8PfXKTRp`p(N+_YmRaKA(8ZgMbc.4BHB^j>l]2,h+*c)-]@k"Z/5X %C0N72F4+5Ca`I+X`KE>bD3;=g^"4g*qHt'@>sLa$0-'0WqPh&X&`=Ccj>kQjUgR=+#p@/:%!2L^oI*OVeJ=RBL+ZTM#.e1g`c[]6 %C6IaF([u46:>nGSE#7"Ago/)E(c]kG/)``09]CUUTRP96c[cq+;7&IbJM*U!5+:QCC5X@`JM*T%UIh%5\mUss"'s9Z\`*g&J>R,a %'u3'N:lU/3W7fZ9M44TQ0F;B6_+G,X!Ni0uL+],,8>o+O1V/+T)Clcj!j9t;!;o+Ak.I;pF90pknCUO<D6h+)JM(%2#J+:h#.e3= %FkW[8G-j=VH&`r<d02$TDue/88LD@UD(2nn%Wh_G)o(I)[`&k<-`s^oTF4e0huG++"#2Jm_2L"6Sp&Y-]U*?gl[q9+Tr8l##!cfH %GrG5+V_Es-Qr+eB8Y.LO?9:kQSm5jFJW:=2jcU4-,`C2J_E=_Uc=0G%,jQ.,%@/uAZl4]+TqImfDQbYEg[\`09;nE*1aZY\l)!BK %HYo7S6ISO:QR2)`!?nW9$<,^?#M$ajpOlHeXMd[$,ZDjQlB(."3sIH4V_l_YMWYO\`rNH8V/Bli]1@"3B==pleJ<6IBr$%"_C<`N %(0d5?2R8[c2T,D2&>W6n-hi0AYV]-r=+Db0Bq@[-k;:Lf>c.JI!%!rnRHFu32g#.]Ni?kNZG\_Co4^;eEZSqddl`MRk"-4@,1G)" %5UZ.9`p"[<9<:Fqe@+,WGQRONY(S%EF!X;kW6L!p8FrXL1?A$to;&f0LGI:?8Z9K'A>u'!rFD^L;MD01rP[DZgu]J8]dF`Ls%85, %c]udiO4r:5mVp+'r_?C\k=U][@nXhQP:Uk*.X[`4%S@nuTA.d[$,RA)3X\HHk=U\db`u5)DQ]R=Uj9,7G%s+qCXTfC#BrCAWj/'K %*Ka@lAI+5d<E:U96ki.dRVL-n#F(CK[d#fC$n#Kdb6G?_EDJQWU/p8kUnJ>^@'&$PrMW,]dN[kb(2F)Ift&bEfi]-t70n33EZM#h %YL$#9h6p9hD$`:-)k;<A-Q!QLX1%:%Rbqlr:44gSD0I=O]L+&E7\pB#"?S.j`B7-(0`e;r@L-BRg>.Q_f^T;"`"RZ%GL[JA?^+r` %nrAf4p='=74L#R]>!^+]-q4CRR#g:*ed#$UU<rrI:e3&&#sHX2.k,_Tg.3`N_L\V[BG=m-(lp13qln[q=mRug%9<,;30<4D[l]Z1 %bfGAD9,sb1IEFU@ALtbn7M<S<X\V7WQ,P*@OE%N1I")d<C>WrQnlI>V(C!A6mI,9%UcTj^^`s#O'Zuo-/`qrF*=M6i>:ihYD2SEc %FPkgfNa12$f_BfKep3<[mq-c'?g<kVaFVO@4`L[U1=`\=g"C0Y9#8EN&Aul[:.sSZ#]</q/0"u:P;l4KaB@\JRifD:VhF6t8QTb! %HHW+*kPak@Ikr$q>XRfc@O:85W(0HHWI6@>07[UD=ntVrP!"GM%-&b9`DgHm4)7aj9$!pnnUk+eMp?cFPHV=_,h&SM2E(q2_/N+B %D998<;]2Df8N<kV@3eSJ`4Kb&16O(6V=;"]49-5'=)E_2`*R3p:0fQ3\brW<o3uJjRt:eM+aeLL/*pLi+LFS>G9RY<G9[LW#q2\S %I:-o+!TQp3-.!&D-`o`:`.O>2Zl6OYlqW!_JF#oJBjA=ZE;<>ZMGdW:0$uAL/)eS)R)MN)=siGsE0N2:$#G5tXAd&c0.M<cEA<H] %?dj[BL1R9`hX3K-(CTh\iY58<=EZcYZ@ZUh"h8Hr/[Ig=4Q+L8@C!4^--htI76IkNFb3\br?+@SQ%BjCfMtIiNV<5W@($4iY,bd$ %8(`DHr_(mZldYApTY2Z?#a:@S6bs?2L3J@"e`O6FOkh2NB(U6Z>O$$C&3u@NitX7(qgu[GFMZhX!N!ZD8hKJ=9acKnVKE0nAE9l2 %`fW?iV@PO<2a'EpBQ(qtNgB:KR``;R\3%&?)]FkD%brnbD&h@WI\\]$CqrtgCHRO$H!lXd,LZYiB2gQ7abh1DKP<a]%;Df]p^Ce% %)@4H$!@egf>^L1%Veof%&\](>`l`Ddk=Wcjp%uQMd;LiFmW,-[q\B_?Ie@r:WGQEq!ILkMQmUJ<O;c9F(sd(<?ieu//#Gk-?@XMV %9O\`?&iLAJ=GSnDTfbV*'O34OD<^&9F,a*>f>8qK0GFpMMIgj+'2+fbXM%<kIh#E1.l9N$;[%/'mZ#+UZk>,C1*0hZR:fm=bICnF %\O2"J(<]Ct6ZhnHki>7gBOo/<q56VPUConuOa._]R1S6p8H=Pb$$'IAs(-rANUt`TcKr>S93qqB"KiTiW:qfK7gYE=.(*I$lSt:A %T43S[1!4-eBG&2:@j,;3;;jcQ7(:e!(QWVCpr?Oi#39NT#?C2fFgXO&Ch@kk(5r`!JoEs/)[?JD;a:s/SEl-tkQ[R3/AtLSXD??E %2:+Q^=s;BCYdnFVOE=9%P@^C]:QQo(p??:h[e&h]!I38]"7!ok*A.TA<M%t-i<Pjer7cj2I.TM0I.<]t(SAH&H[]t7It+d&lJu1r %%tAg&ji%IH;Y>P=o'HNB[$Jra$=;Ac&%?BS[K#2M]'.mCh#)Wm[sqaC0BgTOl'\U&+c&[H]EW"1@]&RQC=2agJNJV=#;b!ZE9aH" %Y3HB%iBiLOL7j5B.[l,/AGWQ&W"15$:#*CGKm:$N%R_BcXs!VH7ene?e;sH6&;gd-Y6"1"#HLpt</f+jIV]Y^K0;BQ^BX=tTI/2# %!R8fape8Ya,O8h2<m=/dU!bmX:ec`V6ca>W;XR>(4)I>Dd!8^\64TGH&fre/AkM_f-ud7nn)ChkE(VQ/M24,aF))q]"P/DT%q;Y] %,JkjaF!^!DJHENTp"-(UWe0)sSh48XY$[-W5KKD#(98TY3AH``)J2:kM1P^l-23p0=ej2/WNnuG#Gmc``5IV_LfMR",-^(F]jJ"I %<_?(s"//VK,_ELrU"EU>%K8="MF3G>X!MR1<%:_er]pDJ_.nA^k>5ZE,*#QK3tGXb63sg_8?*"LK9bFhI$RYp.!2X>d!*j4WffnL %'>WJS[m!</1HhE^)&<AjBd:dT<2/QSp;1;#cql&0*\,/U<>)9YCE=^oGTNlF[9tcP`_f37h?:aG/.?.>Xi*X`WbOdbV+.gk`h'B5 %;oIPXNQ0ISJ?!rb<*@9WZK<,fbKJ[k&04t$fJ0imF;cS3'bd"m8VMQr7iQGAET5aDB\VV59mjk(QTZK&QRHNqHL\6LnL;CSq5A:: %]6#6ZI2#u78L'u,)pPW'1s@@<;hHXYZNo\c=hZA7[Nfr;&h*b4NXh2C*nIFcp>48LphY<Ljj&GP$.kfI;P[9n,'1_\ms$J5JPs1I %-#7o[eG2^nK*&ccng>lY\$W#?8E9*7.iR1'H,34G`'r#`[4cb3(U4#o-I3W!$KSs8XFLZpBJnq,8PEUUI[<CD_+DU(.ZVJ+?Kq_t %N5@>V"OZ%ZNoHdE4Maoq6-5%lNH3/#9&Q.]`pXWGYtQ^8&[_SVXB5Kq[=W210A8'P;n)m?$qYQ'W:8MKV(Rl^A`?r^S9hBRhZt:0 %hnA4hhTRLQPr&8Rg^?Cu#,VPbB=hm10-(XeitU`SbH>#[[MB%(bJJ/p%<rLIT"C@J]`84qMTg0N,Ff&Ag5Q"BXldZ?)Q=:](Am5] %PEktY%9u6pW@fH7:)OTK7q&n[T$$@FWP0SaK&NK72A[kl,Np(P9d7O#Oq8>7;0O2>[2`!TN:A%3):^M\:rU/4HP+:e]F0C?j%(jQ %W7aPZ!+crB&S<TRWF,lL<tf!h+@$`h9>KV_JY!Ud\Hf0'F'0Ii,-;9`j6pd;%u$pe]W.a]eJ).WZ&%$9B9=HbfnG7:'sCU@j3>H[ %_cEP7]j"W;0G&AT3IJg*S-jioI?N!)/p'5c&6<6]jd'M/EHqhu2G)\bFVLc^f3]?BQ-K_\Y`#msBnj)oiBi<B#r$jR"Z!fKK`&2$ %A6bb6oJ,'79oc.@ijE_?([bDHWlnAD,C5U,BKUbXPnAhI-38n4=;oY?TAiKk$TZ36TiYZC3SX"<AgU<C'_&33WFaq\\$D2*?U&6Z %0.=D!Z[rF?c7trs71G/W(e"l-2uI/lo$G<_/m:>i8EJoc-;RB$#[_XW2>^LW>:pWjOorFkC'O(-SC>i=jO"M%Qn$"i@PrO(6%;6L %$C4r$3NLK7$TUb2NLXEDWdsgJ3XKPeNp.KX@\@DD1h97F0d)C9'f[57bk]'H<BVuR=$XZ)H&#rS:LO!u'6Ga_X%_KT:C<JnYdL>` %/kmS:e$R%rErc:PINgd)S6gC9XE*fKP#/`HKIPpT($ruhihZ:-UH8n[4>YTC.1ifV?D_I<?Z1!bTJ8?%Y_^9IBT&[.E1,ugHaJTG %bsF0(jnhK:B.U/[#0IP"Sh+]U@/t1IP:iKHBqdt9jI>23MH?&W;scokp@8QD*T0bXOdBWsG_&%rZl"#un8^@J:sYf;2<_Vl6rR5g %8BjSS-_%!u-K6>cdHKqle0Gg8dD=##Mn'n,W/rP`;BYRlhi)mI2=u3/l]=_+$3VJb]qAP]oHB2Q`n!4C,*JX^lQp9,Ue`%$V\W#D %EWJ%g73u*g0ZarcV33Jh/M:g;$n].Y$2?^2.O8VMX"4A[i0$uEd'AOe$g:cN*7E!Rp@D%e;KYj-gI>:6],9[B'-p-c&rJm,pR,<B %V4,oVZS426KPV:FQQguL(Ad*/C+`uROf@@KAl0+Q:lFA)MHEKV@H(b=ds.!:H_=1u(+5F\j.4TJ"cFns1@?*5Mof"t(H1UAX@>&" %.Y[i8j9`m:6<T%jq%8[]/m?)5d/?V>8MUW`+6UcYY,Y=L4M(iG)#I5I"<1WT`Uh<>YAd%[`Af73\7IsCq1aPV10o%:a9Bt+nMI5S %:<`IG%rc3dmuZ:=ePn^Q.]6BfdC2:\3&G_--8K[+Gl'%U9j^N/6!0&XJWp!lD#+PYBA6Jq#d]-,^)(B#`i6j8=tu20fb7'c>$)c& %Piq<n^VY2Oo\;I^.J,SHb4,Z4hBF8+jnEn;dIe`Ps%SPf[g;G]#T&udMk&Di!*-KVg-G:-V'7+?JfJ=NcGl]=oh%J<l#gSu@41&M %K'gN`[l5oF:Ad!E4r7-us.M%t@Ybh\K4[%\Vt=KIZ;kfj=*9Gt-.O)56JnLu2FGP[L$[P,@7?G/Vfen*!DX[;/S>g(NUTElAnAES %EZ<LU:m><%2LsEU?t/?ibqeRHXS-c_XFD`1Dl-HcS;[!.WBnD;I#J-=%9^]b0C@Hsa\pFGaX1,k$n&J#0A+&iR120WO:=2c)Kgmq %,>]U>B"Qb8p+R2o)`K2^=!a3OgY>9?Fh5EaXP`4%D[H5bO.Ds?$FnM4ak%e'U&eY-7\Kj]XL/AeU9en73LN0&G_lD;LpOO1=_"Z8 %Os&6X6Qq_DBf?2Q)8IkkWZ)7pl-Y6)U%A?SZ1Q9X]2ll8Aniue"(]kAYcKZGlJVmK6B"Tg@L<C$Sq,4RRft1r-p\L'QdOL.EcfBi %!=:gYmE$YVY%9poiapkTEGEWB:_uj^M!tKXZ!4S>[+qAgfB+XeXY#8/fCk5NiJg_=<%8'\"9l&Vc0B+"#?)2q9V][/;@"dQ.&og[ %f4l!Oi:Q%<;nK:=fl&]Q<<8lr<eW4]3>JP79q4\=s5&?\93LW3?eg7oLU43G.oY>G<ai:=So0\qaiY,L%oas$S*XQ%P#1oJX;3T+ %Ge%+&ESj!L[Uk=+D-PqWd5.1oRSU:N.p20a:+/F^.j:B.:;VIZW$4oaWfL0A"OE"q22Y5C0r3@qW3W_5lS1'Pr5A@,S5)mr`Mki% %RGC_TXblY506aBf8J(EK<[!Xiiau[cjbMoq-`oD&i"NG<ah,QlZrE-/C+@\2:hNPLWN=]$r?ZHHAT][l5mRW$!pWUeH^;^64%l*I %9kZeu(K^.37X6uPKI6d3FHpZ<Tb-]/q5.OiABP`lTn)`U=fh#kp@KumKfKX`HBI0NRbb@]"[u/hd,D*VN3H33mj;I3T):?.JU5nh %"0*cd>&YlfL,Bt*"U5MO5$0@hTOsjE:lb[ibCf:\A-Pr4N,OaIIH-U=P!LPS&*fT:Jq`6uKT@Gpl9_N/Q4u&lq7L_3egoTt:s&L* %:Jdmh\a4[g\q!nm_23ghmhBn1V_fpmZkOOH.5^%c"!cq>>=2`QYGk[(&@e#([$O\Ll\([WfM!H\V6D.?jbF6gj1$ddMRK$1TN?H2 %o^B+\5sk-U$<mU<oa5FiA%aslR%b]I!(dPFCCtL0(m9YK8fJ`2![l`,5p`D&G.L@lV/Rh(#;%s`Wrm2iZS8Z2S,]d5kq<dhf3,ag %,-j%IIj?AAYs2iqq/pXkA7liQ/qObth8S:g"U7e<19q+qauis#]K!,n2=5=faPGdc_R%t\bChTQGM),p*N.\EIFCQ..0i/,ZB0T$ %o(=,u0U<oE7&Na/\iguOB7TrGg'fqJ0Psapog2r[!=RUp4bUD[dT5-1kSk<1l`rK#Mh\PQ]@apI)'mMIbdABThr'0E=N8^EK%+0U %,e=]3ge<$"jCdjmV!b'N,EmEj-r8YC[lp9Nas=:F@la&dg(W,oaB=ZAl,U`"U_icg6q9Ha(T^;361%%.,rr$5"U0R(CMJkY&rI&h %VIm+g:nm"j`["f.A]R0?,!#pC-;[,e_mqaRJ7)JiRROfQ:k<lsE^dD'Bp(=&?m6d-Nuc@WORF[!Jqbm'WsWYq,>?9F#25;U`aaYC %[M=m\kHc36G0+5n:4]p0JY!Q3Qp):=1TePG[R9j%E>69a8ST=ln.p!%o)?nN'Gg1.A%%MXf"ed*d5Vb?-,cfA=q*ZXb(#YA9me.Z %J:c'AaZZj:R"J<iT&_A`m>]=[n<XTF2^\l^[1ID0G.k72WL-\2n<7QmD$7FPk<P`aK-\_t1>M/V.dE!,H%=9%1KkJHp/l5r?4Gor %="'gk91>6SG!<3N&<`?V&I,sCqM87'>G;<.eL<kZA;sJbi%H6TLgoa/l^`L@iTC@$cSnp)A*.(Kl]&WE6*6u98<*n)*s3\f>_,I? %qlEfd`-i;92ta[<&TC5l^oSO-lp3rF'eS*L1%HUo;c)#p'*a6@!gBKV1o]OKAXjAV,SiZ%qGpM2U2@G]]sLf*K0UZ-4/%u"-=Ae8 %i0Ueeq5iSU3TP9?8?fZpft(03(*m<Q$LGW/UmN0LggHNs/t8[3'H\@(@s6<-E5mo;3\nV[;j4I^VJP[tCqs/1L5XZJ9XtM:,$A0> %/PeBT;O4jG5SU%e9$)gb85)Yj,Rp"nW^qDs;q+Vo.8Zp19`[-L#W^iE\`dMYbpp?to_[#R$mU[QT7RMhPCq;tDrQ3jk:)VY<[=%< %3e6=DPSSM%\El!=-YX1lAc[*H9SjJI'@?\NT8MFk=g;/U?6D/:Q3lV>6ccOlr1uY]2co*9*ujYJF9tqt3-fLkYV6Wui:R0a1Cd@U %2JXe^+h=1%<L$qrM:&IO,kiQF7Ssh@@Fcs_(bUE6l2%'HFc<dU2g#<[2J(Ru=Y-Q34C'4c8?]G>SZe7O&:&(@Mpmi:*dYRn7Bjh4 %;4J/r9MTWBQt'msR7q'C+Q-4=d*mD+/S;!cFK/JZA3S)Sa\Dh!;4WHG)7*6t$jA<]!+"/-nVZar92^OmG.'PuPdR]im^miuNPI&& %A1_AJX$iGY$BMNO7kiR2BeuE:@4piR79u;Iqog%qhoG_\PuF-*0\+gOW;?,a7DP8p(hS82ji!kY@otPhb^#m9Qgn#b'9J.\%?-J5 %dTP:U7[s?eD&6VfPHf_IhV_)#.#6DRU]mfaIgA&95t\%GlpG3)PcWdf+DNKg'G`tb;M5T;J4c6;"Sc<2&udqE<RW2Mkl"3.IB31W %q9C:4Z.`OMK1VjgRequC^e..68hfjUb;CR`K__BEad*ORA"-$aN@CePnN/Ag+X$oEFpAlS9VpH"#`_4bFHc;)^S[s`@S\+3#SO"t %8$.h%:.0uiJQ9!*Im6@5',[[K&Go%@GVJ,Y%BOOX;ctF"(6a"+@^o#c!SKP-/_MZi"\fGT&o2l";Gn86=O^G)o0KT7'Sa$,_Lsi1 %NKh@>&$'#A"l^,VquM17S4VtGcrdWaWNelq'hq#R.N(]t>Qi96Vo/b=,0.3_-'(,`dI!(D.-f,$e!Z27&f+t0bDK:2PY:T*V3DNr %?A9?BNYodl/7^$(E?"$DbTNC2HUQ6jP1i[Q*sh#\kpDVqI9M@qL1t45Eb:2I.8>^s9kFG*%$q+a-1(USZ,W&Re)8]:'hjr-?HN[= %MJfYf18T]_N##oD<M`"N;JL$j?r7WYS2tbU$3K)LQ>a(?$?C?'o[P'YQ:j+ZWg5Um+g^o<UqnJPffio1=O8<T\oG!eP_@_Ge$<#' %?qAqE%Q&L1$3ac7j5eGEZWIpo%^3u#MEX].1!Tr39H<4]][;KL^CnB?Ge91]/3[Ti!]!\\A)e=1T?Aa2<*=5U(*BLmJnsEP0TTp# %2@/rW?ti_Z6..i:Rh"[\_']s%i,H`FiJ(W2$]tlhmK;rm=5cAP+bOO656uZG/'.RmNL6NIN%><M;\9f.!K%h!dgNB41l]XkX$7@i %`[A!a4>d1JnR\u98[k^/G=6j1Df0XM9q?C-3[Si:'W[84.7DpPMfb:(D'J%%n,gE^o7>1$L1r?IYNgQT1tooA&Nd2IA)K52Z;o>0 %)M]TC!\Hqk/jis&](9r;(h6hk<O+*lk:!Tb;GadrAHLqVTmc449Tfq*)pI4C@FdQW$WRK`M_O?I:Z0!(H,h44h4ZUd@52jLKaAQr %kpGA*hVrWp:klLH0FV(!'osh2/qO3W7]Xg7)RJjo;.8Tll*W#)YVi(;\b'uD^#le@_X5Ic6rV9`Y/*l?-Lkid#SFNIM5Tp]@Tq4= %K5"/I<*ujuG/($%c<;\:LZ7(kon^au'm9cZOoYp"eihn#8;n4U#0"C)8ZA@K&dlp9O^(r]K9@)DpfZrYcD^Z>!'*#k#tlI;TN:,e %Yil=%\]?a.$:9V-/P\)-f^8Q*S(<bQ>YpWJ@T@.n7(G/D-:\la<4!/OA]IpR>bq_3JpD@"UIiZnUo,,t'3>@0;a:gSI4JJ+E2'V2 %lL^God<ee70iMEPRVP1_-ea<OD(?0,GrdZ;Sg(PO<8C6,29;a)LNXnr>#7ksO(gO`Nrp*+)Y?iTRb#f)bbdHL_Za&]robo[,PurL %cp.!4FYlh*AmMiK4.O>:Da<M;e-p$#Top6mlR3;pMh;^WTVB9gb(l#mY9:/Thgji[L&r>oeM>i+X\E8g:pB.61uK?6QH])#'#K2d %6?_%EO@+@kY_.+sj9Yl&'/I:<aOCDL4uKkTMAM)cP@l@_!\>MPNlL3@R)(+-q3Eko7P2S"8XVKSN*$3T/,1MpJpP0ImoHf2U0J>@ %@@lHkEi5p9jZAMK!ckL'U=tm`T]djPe;&VubiuJh"g_\AVoT@^`N!!-oe:ECbAj4PTH/#]["af*Z$R4l_m5)C4?4W&2\M/c4@j%+ %Fk.5W-p#=Ne:J*#!H9gL`-_`b^_'X;8lpQm.kCf@r`D0o)!iuW(Fgkhphn&VKI#G9f0H%`8IFIN@OLbMm86f7pB^!umD6ml:,a9b %mL`L;Wcp:miCI-(Z8LXRk"VZs&ON'I0VtOpPBhrs//,_KF*o\c\ecpKdP$!uhEV(M'J2T^LcQcTD*rP%_EUVP'5u:3W.pZB:'6:t %'[B3I&)8tk&.&]Z`*"Z23eosi.O9AJ'EF;Yab\kUA<7bU.DAtV3#Fr)RSQ?W&XI7`dn*"Z0-`s3Z,S6s?S"gQCP-HOVPdMC;udDZ %/=+mH0EpM]eHEMn!%!]#9T>M"oAZ-J7?fhP1hI:/P?.3@1#OD='qB(NX<<Ou<jD:E%FSdt@XU4Y9S"uU.r5PgckHd#c0Ij(q^?EK %361jFV9Kau$n+qgC]Z:o*9ZM^5[n)L!)fL_YrnHoGp",pHVLA7EBoE^<oJQNjIoQbN>%AnZ.]B&Sm'>rC<-\>#\?k"m_rLjbZc=P %>N"kG==#Y-$Xs8Z'9>E6kRPF4h15DW59c$Eb@,Ic@P-m4WJsH\)\]cm.2nZH^`6nk;(IZ##b?b)negPq_cfP'/t_i;`rJ#1_]=BW %&nE1O!AFe!`d"JPR[0]9-7$fc5bL_8ZS2pq1E1:C3MD6tf'TsT2>E.T),QtI?&hMePaf)*"$<E(B\*#0U4Dq@.?770F#R[T#)0+b %#,R7=NmLMONmqZ+6#p(ZP[/hi,q3R]@)J^c@I^,e&Y7-(g%e'6!hLFaCrB5O>6(JJkaADZ$L.fe)m(FT'NAdY&2=&"JJT,R*tZ.R %i6"^"mrMsFA-=3#C!eGdHp;ECf#1_4BfZ\s)%,Y::hKlUKj1pg+c5fB;c^5[8:ed<R,ZN#MSD_rgN#+S5(YOma-r*ed=GV#8b>!9 %-\G,+Yuo#W>#QIGD<fL(>"4'?X[`?TECV8W/F]9RWDRcH_g3sRA^qWP*KjSOdHf1O@_O@K=CJ1^Y`Bo5f7QS4get:MO)\)@5r`KP %d[\iqn`[uC7Km6+,CPB6ck1p]:%6gKNb5,nP;A5&+TBZJMkg>OQJ^7(J9SuM.Pc_e5ibL]Ub7`?@75hs$f6WbkRFLl3otoh?UO(E %!A>\&:+g.W0\F(58*_@U3=;5la:eU@dl`GL2p?JUQZU#c+j^nt@Xqs8"&##Uqk?@2q/1'`:(LKRJC:Y3OSRf[ER(Gd5ht&"DR*q3 %/@[`]I29=e3V1)!@OjGH$A\C$`:HU%*`fq?d$\ED"FuNRE^kp@S^Lj5+^>66[B>SS&S%,b3[_QH=LQr_arl+lN7<uu.QIHE.IdlJ %o9^ffYel77I97<1m^(0.@GfKh;W]-4448@D_Nfb,C25Q"\kROA-L=QV%iM5ObTJ]nY2"Vs*Z7%M'*-0,?7=+n+d64.`BqN(Q-]\, %i=(^6&NV]o#YS'&#I!UV#J4HQbNR!HbTj!VD:lIYAp@M$$5W3HQhb-eD5s4rZJL1V/"+0cK:*(7P*kbb)XOEt,u0_i[Ws`a,c]8s %bGa&rS0R>U(eL3N3]-S:8:1O!(Wh[t%6C_+b^dr42`T+G"[RDK@ouWQWDDU?%I=/nr!F9LGX@6'MLss?*&A";?uO;!NYtUX'[P'D %CFkb`=_GBfdHk3IFq,()BGt*D**u'83'3f6<NX?c+oUJRKu6LrW@77k+3PG]-\#1sdqc@nPnT^fL)m3T"J3LC2MFb&jNGn4i1h-l %4JW\sbYI;=i?0<>pAj7t'Q!A[7Tu'Kc:PnJ7U-Io6B8#]@.3Z@QW;+W2CRK5_9uiY$=#D5bT9OP_/uC"r(em]L5S*?P_Bu+*\"36 %A/ltGXj1G='4Z%1lihEZf;+T?Q-f<s*AiVCYe@Qnb#-2TT_Etg>S!G!RQb/Y-glM8>)YmN/Z4m!fBMk/amMpl\8SaNHLdB@8.b#t %W6<3&%8DLX1^]9`nIc/i/`oCZ@)J]N>pDLT\/nL8f1H\f:/.Y;i9NZd<S<EL'*8/A[9qEb+c[Eie=\\1km<^^JbESJXl4_gfVHt% %Fs&_,b'.C#6E(ke2sT-GN0$,/'lk!j>X'Z>TfV6]n^>7:UCAe(<=bbXRPZK"!-3,'*$VJKpok\-bloL$nehq8b/h#s!:(3PLdNTq %[#Oq%I1@bW^s=!S3)(*S@PM$iZ$<%X[V2W;Q5.m/SO.c3A0N#'PT([#;;*p!W(`9n$QpR\F%$Y%nH'c">_H2+0d$lr"uHOK:[Far %qP`bYJ-,CXn9@AM:l%-Bd1ohQY]@"mRXtTk_ZBOmnFd=Z;8jlEX[,8,f@h"u]-<s%7u,m&bZqGH5i\C)Qft!-5`fF$QUi5ikYH/k %_lPG%`GgeERC16W%*3'Kni`=#;m]sh8/`e".;!%b1@`o2NCtu=0!fP<21p<2nZ6J2">)16"D<!>9mK_urt&`;%XBbp51<a`:f8Ra %:r"!EfRc?g99Za'6et2%qheL)qTPcG->M*Mk70EF0(%G))P3oFMX26-4C[;@BSQ5X_^T,lJcOS5(M'LC9NW=d`IfigF%)=jqat3e %ReOW(,rd%?e7D+hL_L;LBs;))A;&j1@\oQ5</`2<Gh?Jmg9AAD#`FGmpPRICP8BStUO)J(#5G4O>h6_6CCIXni8$534`+NAfW,V3 %=YTkK)9H>/ct\Gc2CmlYQbEX6Y6puV+0[[tQO")"=)V58ruC?sf3&'0GnL)Ii^!bLfGCaf5=Fbds*\i)r8NVR-3?B@qc$r4pR;Sm %idT?b4N3j=KW)E4PRnT(RM7M"\"+;Lpu9Krc_$HImEfHp><4]Xf;Fk>rIfA/!k7k&Cq(%&h=-,kl*fT:abnR8SKHUDk2m4C6fZ;< %6Msr.(b8;J^8S@`#+Vs;,D28cpKB2(>hBZR+_QSm=V<\pI/hCkC.3`6-&nWOc,cBn7Ebj=J<nDgDNReZ-JXd>"=,4b)<=9BL'5oN %gdt8s'AM(G9dLo<D@re9+8FD:eHNpO,T[YghO784\%2c_.)Slo]!jr'9Sin((aU]+>,J4/_auiY4?7UgKYjZ1.@oIFY/&.6YWjJ% %8]recAhs`J3'm#<OTResMRu;S^am,`*4N?0>i1r%[m.\-3Rdsfe)&tU]CYQ<?lJ&"]Z3F)_s^o1O]C1P15^g59h0JiHVI$NicguW %U>S5!;Dd0A>!g-o-Kb.)^[\tMo-pgjW(:[H[&6fR^0GXS9Os$D1L3hu)KR_*9_7]:\\eJ54b0opV4,6B6k^3$EC.aHVNO1LaR8VJ %YZ?fq0]q#MW<K6\@On,p(Roj<7f,t&/*GFH#OjbTAe]0PNH0`Y9l!\#^6.@[n2MrLd,=Xml3[k0Q?qSNm^3Dd?H0W/)C=n<*p,db %)<aXoMT,fm(Nlj-6b@roJ(d)Fi0:<CM<3:mROQPRe7???52h,=W%>p39jZ@E_UVQ0$rA(?]W(=t7k.>8m`sEDEA`0,P"R9D#(kAJ %B;j6f%G(\P-:$"sU%2;C$,^6@6"pB;/3,H,LmOU(gS7MZ0M9h?"LO48cnB)UY"Br[,Wgq"5WMLA#7_a%8LdHI"t2bt'nbUmdlUB( %MKnD`r\XuD5Z2=?JO<lUR5%N07#Q"VdCta%T10KIR,K9Lqjp:=M=gq[PS*#ZUY=JZU4WLMIuAl_p.,%?:'D.LjJ#G$W;on)1"Td= %"L@=4SHI5fL-Scu_IbY@Fl.3X\jipSI@;F(<62V%qC_Bt?t.,KNOr1UO,:V).HRV"L`%Xt/q2cVCa^FcP/PG[Lhak"Q*?+CQ1:e& %&;F!)MP??(f143O@d^W4.Sncg'ZS7dn"`g*UpDmNf:t^jG]*519ua(:Lp0G<cG;6Amq\r5iiN\#itu-G!lOg?8#`R=('b#8"N,\M %QP$=&TP:AM7R\J=`OHNm$DROFW89#&QPjn<OI/'AMFlT>7Ooa=?jE,K9a60SPW;AJ/4qX-!G`h]iA97;peh4mF_h4YCn2So<F.@H %/#!5QG><e+@rNp73>>[,d1f9-\dT(2mgI/eo54k>NeCn_'`8N?a^Lfl]qI\[&NZc2;1tJm`W\.FK0Ap_M6o4u@j:7fZ%]>m;_d>Y %+l6aO1Rh*R_1n]2eR\)"NkYt\:'$cYi:@`gVF?[T!A3oke3%EFF:\FN'qo5R&d/ZbmKMjq"E3qU:]MVI2L9gEjqbTK`PG`c(Qd22 %-/<8h+J^@F\,hBp8:2J`@"<BmT<#'`j.-Xdc89#mSc.^<-a1uI+qLMNR4%pu!ih,HafbusPIqNA%,)u@918H)JRLW!j!l:<Vkmj: %%#k7=`]@uDI8$D6'&oi].G,'9-%Kc^6PbLhaV-M)533"WJtaEp,Uu/iYgW,R7sOP#/^8mm"o7P-GL.7,gl\Q8at+u[>n=n_pL"[+ %XTtJ^b^A[G`<bt(nET<,WYT6d#!hr'/b?oVNJm@-i#,-T:kp/Ti110tAE48`Ch[lK3rMPkd"+lF!&%O=KeiZcZY"_S'BOoaN?g,! %7&JI^k)>UJC;js"V4>nY<MT-HT+^$sjkAMPYY]c`H@R;G4M>@2AQ1IqKq"+jUH&h4'sPm$!F?&ikf-=lVL^BqDfNuZ"G_9OD7(>- %5%+-<)6DX%qnX0fJ,0-*Y-h'iT_J"]OuiNk>2P@k6%8Gi`"&O#?ITIZiZ@.j:iL&n#>oF^Jd9\r$%tq@@'`q>D2bW@#]=_*#,QPm %"@7Y&6ZY)Q!]F&WrU*.PWjf91<"rb=d/1)j1E]>SnDjlZXACPC&5.\T\.;@<*hp6I!I[V=k<G]GcR''$a,6V]j#scd/K"mIj7f!* %"DW^)Sr5W[3KO[bA>0dNTXQLJ9uj-_;\AHe<C"A`(b8".d7X!8$aQ(g"7&IufeVBkm!oefG\S-6YG>)C!j\NDD7#Uk@R[\J$OA@O %*HQgQ9u2TnTSm8j(?kU4lit)G):3>HmL8W_h2=E`<&Dke:8"V7,VD!O/BU;Fn7Y.H0dMNjp8@&7>:SoonXnli"GOr?X?2(C_M]C! %&KSe/m3.Z]_*Jda6+kYICm:l#C]c/QHV^c-$qHEcSEP+4T1q-^@BhgiN7!^/\D[.(6A-UN`Pt_R;5cNI8E]/4d;Pssh&:_R"<T?: %E,6%0Aj*DS-p*5J4+pOrM+MfB.,eS,5,i[%=PT(!G9a_5_E>9^.N*7.Y69nO"1nR[)&Iq['opDYO2Yob.#G*AGmckQ1F`frO:BT- %LCefrMMB\)>9ajpccdd5T<37alu51(I$,X"N%"cI;2=@-YbLSP=CQ].B?CiL`'$XaT].$"-.lYp:0[i0pRj,N(&&n*)(3C/ktCLW %G:,(qL:^BOLk^8=QpAW-BMAD?O*iH%'D1fXW(_$IhO2Rj$h#-Y-J1TO6"kj;kT5s8:iR"D'1<f.6#-N:pE2?pi9)02-;\]+EYAR, %mm1k9.df`E+tE"LE<8Mr*[E*eoQ!24Jk)-u+t&PlfT[JAX/,rqoAF^+fS[%%B?`uH;C4jUi)u6O[#u@)^VZ^3cGghRE-*FXAr1I\ %YZ-=>*?n,g(&+Fq&Jb$a9G&#(>V5]>,c$]d,X1L7`HBclpW8=P?'!>KQi_(_&(5b4WY:`pUVge"Ld^\ZboBE\fh]Qf)NDD.?>3Hu %?t,RiUe>X'=`K?@hd]]kfGf6sdB#_P9UMje=%"_%)=C2k10!%slt,,GmS*@1<8<c.ASAS0ji^J?B@7Tp\-MEE:iR$*(T>u]I_c9` %.!7!hmT&Tf.dgX2<&EC*i$fAqUZADQ\6%'VW45@N;c.Oq_P^4LO4'r#U<,U!`D9L2+C<'WBP<(E#<f]*'V\K6nIV"k4Z7p2A@(JJ %p!a`SSe?K//[?ZhZ@.K8gs_.FJeqkC.YU;d?kMhW?mQQ^XMP;ZpSbtZ.dg/j(!gi[>-)t'HW4Lo>`1cgO%Lp3E'76FoMc3KM_HQ% %2@n4QdNp$;e$PG!67`4X5dI<KL6QJ!O^rA%,[!ebbcrQi,Cu9"&4U32&9@cLWlU@Fa6keW*cj5a6jF#ms1o&HU4ED!76^2h:.D]^ %V_5E6pS]4ak?Q'mm3/KS.HCSZ%GFY;cAM`\4.*^!&#&#\?u3'OGkJ<B`Bqi\+/#?1OFTQWn_ab^hTFE(kTO4#*]pcGU#KD/Cg"__ %le0FImo.V71u,"+X_>4G<Ei=?T=VJ*iBEND7DlfRgPUl8<OZNS\#aNF=)EB?$Fco0mPSnPKD2<bMb^j1SQibISL`OU&aiuk()lUI %m1pB/*qaEEiZ8hQZ$,S5o+ihD;=t^:fKJNVb!o&b=Fs))5if.'3lOBA#<nG)O^XD)eP@+[F%(K7U:0LAGZDr]P"19U?%r^D!^;-3 %;NMM\1lJ;MR6aA1Ljbs&',>%i$-FH>Lf8.VL!]+%4;^_^2&h+UBH0SO:.tl,(aL^d=V3AsER5X>'&k3qIBp@$IZVBUnml(5p&hPT %#O2I[`I03?j(Q,Qc![(1Xe9F5Z53dn:][KAP!DU7`&T*E.8:?#Iniul<IrY.N@IoON>-TuYVQU70VPH[XRRV$V3?T2-DCe\4?X`+ %XBc5DpS_D7.dgKT=KRg7<%s&]Hdja(X`BIP`hMI9Fc??8X`%:_(lrm%>/jBYpM.][&`13m0h0=9!9UXt,\\l2YcQeH4Q>YMZ.=FZ %i"'?gkG$$,G3RF)oEJshCV/qMG`e.?Kt/)s=>CLQEKfn7/#_^UN3L2Zn!gDY[_lqo,-i]:G/ZH)Ft5(17?M%*-%YoEKb98f>(VKQ %$=P5jTj(e7.[]iB\KXAej!gPI+XT?ccjUnW@iMMJff\[d9-''sRlu:eZQdu7.Kuh$Yb;fY&g3>B$U!0dc(T59HBK8m$H5_Op5r0Y %Mg[\IWeK]+XB,4%\5_7up';,pK\r[l4@k]]J5fBF*2Ht)`79*_ee)4APdRAnG@cn1L_l;,=s3u#,b=;D?l%fH.fu%o#SA)Z\Q#Ek %<0&)-osNlF,"DUr#aD3n!ip\ga<7A\G#MN];BsgelIM>"$A)"oN++PnptZQCAKo>EX](RV]^YP-P$1D$8<DY1h(gI2VRGCq!!$L# %>TCZ?-LOa=<7m>4BObs86nV5o7!['A6$Fe`Y0Ia1qj"cN`dPVUh593"e[qO7*qd.i8UgC@hGAd'WtG)Tc>eXH_O0h+>V&X'V9Z7? %:r#T%kCc[X2RFM[LD:ouUqhVp(1cQLQgn3Un?G]MN1`DSVVIO=I&P0m@Rs'g71BKTlVcfjE0"Jh:sk=E0-;V!RK?+gbeecIJHh,S %&)hbmrqab^S4:!obd\n@Q=<c&&&A:R&X$'[3fcn$,d\cO`isi`-9>,]UFJ<(@'MBEMc6<O2,bf)8m82H6H+J$E]/gaa<FP`KfV#V %&L'<PoF)J27"+3j0I"eJ@Itn3Mou:'-[cM'<bMgZNe_Q_^LudC9i.rqT3Ysc#O8W?e=.ZI$?NeWZtAJ(lZJ(\+lSUVEVl.^7uR8i %Y4[BtZK038e!\1a0+mX!D@[I.TjBAo[jm>'?LB@/YlXqS_HQ,i[E#AV*!,3Df=?L'RmX%3Tn7>A7CSS8XIA)klcDXrRs3O92a*ut %N/(LNeB^VS9$2G+IDpSWLD\5I^";"+p*10YJA-pK$UuNm<RPQn"@A`LL1DZ7f!:g1Rie/;(!`agG"^CR"iG$KK;rU$8h&/90Gn&N %_$3K?4H:@S:E_=l::Kdjd17JgRY/t!NspJ`O^78I)bB,c#jJ&B+FX2sUAJ4oHrJF3]VRG5oS\>uj"/uV?kSq&:%$:qO%hkZksaYk %cc;mu#KS=<bJLO?ONXUMe7_YlJh$j]'i(PjHfY9%`I9OmK4P8tPUO>*TW1Df/79+QWn^8T/?#)JVre>?<QAm.^g-(+U'&')c^\7) %Y6edeX6*U,<1.]djF@h,'-5*oq.iu'BR@kO'Hp.K^TrkJj"k,tX$pAU`>45Y98^E_8-dCkdY3Eb"ge.-4cq2+?k3W7=U@"a227>G %5'oF-)UeI27h,97)II-+We-L?"r=d<KZKNnYl_tCVEYG'+34<WW4G:l)H6iM5Z*LNYm:Z3(Ikrf!B/P=",i\[GR\]$2uN^gIC_8R %;*DT2;lURNf.+_9U;Bs8Wp3#op(LNFnWjA&Q`Db"4,']m1=N0QD^c2cge`$S%R@1[NUsFBAdrKg;D;5rSIm.0<'a[5*u&U*iKR-& %K:&Aa:X2=[Ec"`hBV!foU_<=(HsBDr.ZWLL.`p]l<Md!f#W3cU:@hKj\9Upc"+R!!(tiWeMk<=W-M"*f6<1&k%n_"GG^V<p:9k>i %6:(EH8/>2)3'ZlU7$ai(/,fO&=(pU77=6konm[ZWaoBggfPCQr*;uNF\+#i48j<nq3hueFVg4J7X>[aQE4K<A$%V3c)GXeRVJ//W %?\`]_,)Z/q?S,%[<t835Pl;R*iftQV+!QZFM26CPN^a4=B:h/uZ=\GM7=p_\2C>@.MVOOJ)$q&-Rr1J_b,RftV!OZu+!@22f^@8' %f"@JBRXHIATsm5A.CaJ]9DG0+CL-W2ai2'j4%4mY$K^KF&"5(J=/u7m=uKMD_-,@8WVI_6V-?_+og^h7].KI&Nb]?.'dj`5,Vtrp %WFP.";\W49KQ/WP7($ZM'iZ>X`GW(cJX/?qV&/4eP&SpXFnT<]3'9&55$DeN]lXkS=u,MJ=96FmP$)n`:8s!O`f<c=%lG-AaY=qh %59\/Yd2tACJ?+f+a@7embDC*6dg!gH_i5iV)`]-448,J2_]tG>++Wg9:D@fX%>1-U<^h)Tfjcs?^iSm>.>,nJ/QY_<7Wfh[*o<&@ %c0aN8(JWL^K76JkKc])^S>1[!@h0L:mD_/TIDZ9n-YACuh[-`:*30#b)@fdU4'5SN5RfJG6+^,qh[qt$`7Z3J7Y-PN&u,Q]LaO;[ %I3>L.6@PV?'YX161_E`o0Imfa))'(pMTRfgPbJ.`Z'aR_(`)mC/N<#s#:dJ/X:]ZLSt)`==FKUl3d#d,m@[q'!8aDAH&&Ebg$*L\ %#2c+hI6/.l:JF9D/8:-9C-"+=Pn8=Sd)M][[=IfBK-L"3R1eLuTc\BBdB*'gN&[E^>j-=+R\XP[9$)%SWFC]]TtSP`9;nmV+#J+U %V//H1Co$1ReP0FjWc]/eah4[u<%8)F<rmcR.ZmG&Tp:)jdOQRqU;F4`l&r)t[1j@<R[?<6q7VCqAC9^-<!:<LOskd1"p'!*@8[l* %E!d6rQrZs>%JE(bB0`c>+&kR+^fWHGfYuPg*b)'M1d-`^5%J[&,XBUGLaUrP&g.Y%cusqh@+d[Ah>-a+iCCY(bNATZm,c3eo,!ms %YE*"-2eNp[[NB=7fj"ETs3q#BQiGV9`GOG/8(ZAIbO\M9?([^YDa1tGr;>[<d@9Obe/lg=^ED?>r9!prkASY;?_$E=T5;8'3EO>? %:G0EYE:`_fUW_uJUWq8GoCMA>ou6"t&!kI16j`VTK3&T_k:<6mA,a",_?h_se?V'Y=(LTHZ^"XkGcI#,W"en4\f4dDg]a/pdZ.n. %<F1BZ'JE7U+;AB]:XuCi*LkK!/0mLf'Bhd]8PO6bSgkgn&80;D[b1"R/<QPeGqFca#GBj*7.@n@#btB3S;)fW(6Kk;2Te@Q*_9JD %`2(sicOT[n<@C!iWuaGK?gglrra>?moBXS`o<1%_T02r5q"WCmB,B/ie9790s79#Fd:7RUM=c(c2J8MWV\cOC>cjlabam'$:`bQ? %1-r'<ZOl7P&[gQZs/[T4lP%Fs32%7'&M`XO8Oabg=c/l*)&6M?LtQ\QR`Yg-kJB6i8mT6skYIK'VN6=\ThpH&4E<%>m\<Wf-H[%[ %#N8ZLPbD_(>KqF+T<ajM$g8Y1cQJ$&5N>E`2B@]l-qSS9f'Bsui-\gI/(e?[Z_hZLh_e1O4F'\4Ndj)S5<@Q5fR.geo\sE92k:^K %i9kL4o1g)[rVO]<%j(D;U&T0Q?f^3;(CSBRe.4MAkd.sh^@#@Rm&PRK.Aakol`5";#Kr=k5/(L5Vg&)COs%W*ZWhp5C\0L[#.Y.H %2_!Y\%0@o_>N3bKIO._k+HEW(9$\USc''MUFWi5TJWH9Vn6=!<JtRhe<O!;#-D?[C+QPlDBhL!4C>MuG48qihqig^kmU^2On'Hc> %C^D6mO/?:j3B('.NOtlX8[<4H5?"hj<LL0-60oI8Y?Pl[2ZlDgF&SQr@okFNalIROZ;\17MMTji)@mD8mW[=RNDhjmAh*OFGD(_7 %2ck")lR0?66Jd.HeQ`UG<o4@EUk8,I:41_En,0jC5,;neop;=Fg?"m_/SZf>^YAK>=s!/-0!D!Iee@tImtpj!B)!BBO@4TsiXZjg %TCu4K\fXn4*f691Q2-%;Is=PW<;GV(doZM*T03.7DQ5gDpsG"XkM+7Fb?%bPDgm1XIe;1aEq@E7Mf''=rNhK2q"3eBoV>9[QX?@) %CWeqK>b""7K[%^+c"CRN4[.6bK?^0o@W%g;rPtg+f:,.p=&$<?fA!Tg)h28oKg];CjRppb\ga[>d,$F#R!5QB'k,eGhad:%o588k %]kZ?i`7&W_T-%F34F_gk79`f4itj>/09/f>D>E_1J%30Squa%[^mG&qou[$a+6hfe0B>E$`Jr,kGM\th-!SYRlXL[ZqY*LHht3o= %LrTIqYM]<Zs)un7*abFD;#<K"Mjtc:Z[)Jbk!PQDI?q(6m!G?#2[jPqi\Ji)MUC<phXUX,T<V<IDgU!GrN]."q;FaA9+1\OoD`p= %Id]K`Aj666s/VJFmJC)eT>'iBs4OX*d@4\&>l0$70tsQW*_R;&*;Q/KU:p!/VcOr:*WL(Cludb?U=Xg8bBJE-$fTJ/m*E,sZtPKl %*?&OC[-V/R\AoQd5L#A3)t#_1mmV9g;siq12a3Z0d@Q<*h]!XfrihGP)uWLW17j/:PQY>ASdfef^_?U_@l_!4hZo^4RN).,r31UY %50n+oWqsUseb\@f6hA;f9CnoU5c,0h`-6RFn%@7/q4p7SkLXWI[oX(]s.An@DpS54h88P0jlC0'\pa+bk4'Pio59$Qi:0=n!e.gO %MoSWDXnVA-Bn'4[cI'c07N.(^XtPjDaY+0Ql1=59hDoNQdZ^H,PN1n?0$[h:3k;tuorfEQ*e-d7^\ohZ5FoOeQY%b_^\Ge@BA;I) %DH+C7+81FbqV_'_g=>mUYIE\e]Qc`f-MmG8G08t@[4&Q-b2ZiI^YJa%o3h1:P`X$pD>6CTo;gZG[s-\9B'^mPIX/?7VO@2O#Q2*l %$P2>TqWPhlPF$^aAY/Q!>Fbp.='pITa-5i<mCR\iX#Kf<cECU'q`X5Nqm1.sKcaWKH$)iE#f53Yak9BoYk'cF?XI,eZ[HToGlI=! %-^WQ\*RFO`RZ5-/a'QNl2r8c]D75-\QumN\]<4;U[bi0D[l`<mn(dJFA`u=,oj@alVH`Okhs?=BJ+T3`^[1j6NC/K=pm/h[5"lfZ %c]2>%cqWZ\Zi5?Ml%e4>BVN)6a%-0U%<Jl%k+Budr9ld-j$1o7X:c3RFc"UP+4cqEVggoEoUj&#'--_U(Ci5/krnE,ruCa)^p#UX %(+"n.TEi&thD"<TkAqJg(iEt:m69m#e*Zsh]AH1$oCkcT'=@I6(Qd%\6c2,)ePCBd<<3eY$5Y<-=!NC\9e5PmA*3SK>XEmmC]>bl %j'/6qI@P?QSa052hC%g<Oo"b4`QQNh?QZtkpi^SSkVN%u`fXGQrH=sD@'#rl^1,HTdma$/o_cZ5ZdjNpo'#iNq$&c;^:HG@TjMTo %P21[=0J$*\Jo_OqI6.,fplljSfd"6k])5#>;$Qs[d0Vbr,O<b@l\isdg6KA.?=*Y6gO4AI]D[B&^\Rd#p_>ppJ&'stFUq5gA+TN8 %Qe+Gf2rP:O1Z-U5pYC&MT<ue*egTWO'&d#g6FmQPp\hSVs5LZa^V63)D1V,G>G1]I&$t)Gh7YH=p`&&VhYR1hF2'_^IW9L!d@/OJ %o:JE%jF(.g5EO,^kUN^>]tD<5q0b<Js*/g2IeDgAjk8Me[ngmHrmQ(0D>_II]#HZDc@2UV$XVpJ:X22<3'"bQ@/e1-p<1p&2#h,u %,+W#PhZ!>/:Tps&9s9S<::JPEcF5?RZtfQo^"04YYHt3Nrp&k7`QOGs>0?Rm#sc3&in)qg0":D6WTKiNo+rJj0moQV=dITNrHG`; %a'3hgh%0NJJ%5AsACDWk+8ED(:-U\ok32`^`S&@_rD6SG+)IW=3^(TdF^G(?,HR.Prj80s9K/T1-%5OZOt$Wh%<IubJ(,(PXMXGb %$k;Yh6f%/Jl>CTrrhJ1shc%VnkAOZ(p?;)6ir%'`l,DoOd9#(pJpHn444JU<3e!HSQ_b+hV6P%21X<Rsrr6n8lG1/Q?@IA_ZL?W* %iR@[2W]uD]%mTN&&-!XCK>X:1k/72EjaMI0bKkOjlh<C*5C^";i5Ql;kGtB&+1@CGrSQ#(UjKMIij&rIjDs&B3M;Im9uN=SbJ!`W %HHeu\)#,uSgKrA-K>2"Bl4\J<k>Jqf2?!9&EVtCE1/j$&I`q5HQON<j./.4[KSZaeh_OfY^#:j/qg$53+BRJQ46HDXr;V4Xq[^)W %;7aDX?1-iPc2SWUqU<34s%iqR;.&q2gM46D=N`qMY^W4>qG2V7ItN["hn&IDe`lbA:KNS&:X3:<g6H.ac1%/#m7)p$J`h3&?2_/! %$J3bEE)P_7c<lNp`cpQ6IX6+Im2'MdLejX-E11eBn8Frl:TpoSR8N8,Be97(ojCkti7$`N>os""f-f2)8P!B$]k@5mBPpE#XD^QL %o'.I:ZT\4&c:;5UU7rt+d778FYG?`&T:be)6c9s0oG$ehW#'mWN8+U30JeHDEe(0;qXj"5X5i6(o*]CI./"K.B=[P]d+eKtiqVi7 %\PXXNaic"/_bdItIdT'DTDn<hBBNT<523g(q34)>m+(\dqE@9$QI8\]rUeXnbASe5><fA'54<^Nd4(eq5'V4!p%?H&kXEsB\_[1+ %H[:#.m<GAql1X]/`Po6614AZYjI3rRT>/%OG]g^qQcndiI,.?Np0WkeTY&DDPMahorRY,KgR%iKZ_u@"Iri'34?@mFJ&oe*j3P2) %e'D2"IWuo*+op7:SSt*i^=o:jAgY:bdl0e_0?\"C4o4m9jCIG3+54bbr:Ye''#)(dIpT3B^\_C3/a3eXD&aJlHFnU9TuXVQjm/+j %O"[tD?Z2MVoaR>RCXC'q0C\OSCHZS+O3Y2c?ba._SgTkRo\%XBo5/t4Rp^;Er;Po\mJ406fI+W/,E);_)d0<_/E"XB7Z9tJnH#b] %WWm8A:VP[c[UF^(l$(L2DiBJKr-Gt<m/olj,b,9%WnM/L[.#F"O,M?\[eZG&oP[a9gR@bBYWr0Mc#)6sF*%?W^\$'al/r<MpJqW% %?^Q%pL];C@nbhU82\nD.B]gA@ogXL.FLTp$_KlkuI:M+dG/(K#Q.2@CbC\RKhJ*r"s0"9M3^*7BdgC9!n#_r/mW\CAi29B;AAeND %?)RgroeUPNlhBGlq_#rQ,i&J(n\dGlGF%i=hM(*"c/_E1rZC-@3dSNRqTi6tc(e#5T^O(k-c\n9o@o1)='Ogtpp(ud&"d^"^AQo$ %*ml!7a;l0Qq6?D2>.aIZ(WW`)qKDMsU['/a)T1I#Ao)&PdGOupqe(DgGd0F,iNG-Ms*f-;hEQJ=ci&;:]Xek$(GhFa*rRcBhLkg, %ea_6=V_9[39'_<J*dgT[\pj6Kl!tn8^ZS[*>^cG8Y9nG>\`N-%?6@sejB":IUJQlsLi1T/QTo$\hY@*<Xmc;X\%Xmd3SrWT[=A#$ %*T]P_fQ.4flD@X2F.:!oo>/&roQu!([h'eH'&N:>?Z4'%]$2b!jcB=G\7jdl6I.<fY:n1mD83a_jRT,8K"$$5rU9Zo0Bl]9\u5!8 %]5LJOE0B3BhbP3ja<MKWQ%NuCHE4g<C@h?U)s?t-l[=6PlLK2sKKP1%h#P4)#Q"#GJ*]=c:YOG!CB"r2C4F1YH/:..ri5B%S^T[j %oBl2m\/X;\6Z_Q8GFNi%IW9hc,L>h&H?&ilPDHpDh9b`U@;5Cs3]VM8qN#N1nNoHhFk+gomq\p&,OJt?qt7'uNgfqMcG%p1qs&tW %n8u;/>K;eRoO2%tBDDisb)bC2BA;aI(O_,-q],!pcga5+W;#7/o6b:H&gXu8oXi,u\_#SWqYpNplKIm$qT\0Up@\,Y-iVC@\$0+U %H*q^E\9`FoqEp!3qXWj(*Ye=m1T$oi;8JuVnaba.&LA\2?(>6Tdsq#%bt"t?0/fFC?!VA%25b9e@4FdRq=J]S[Cpt$h>D9ipZp(B %?CY7B4[5XlZ(FOS)n.QB9qP7c?>c>TSU^=tkc=+5du0Qr?EX#Il68t9I!O4smeG&h/+Rdgbn"7MN\7N-?Q<@cfJ&en^6#6b6oVO, %ps!k!dW[VJ9"^CtC3td>3[^qmF^n''4hs.KRaQt@qu-6-afDbmBA9JFdoRH7Z[$eoPBEI604gr^2o@OW<We2X](tL$gDL^Eq<IMP %_fA,nPPu7dfA$9W>IN^:Cdnah^!?'qG(DZlOhp;PFlG$SDg_-@qIT^*[sr%:UpbPooWl6je]HLFe#C@34$.U(fm-UORkLnq?=J@j %]\Zu/,kpBMI[A8c\<+j,S*Rd0hQ@bKY8GrcC<Lk[<T?a?N(:))Z+>40FF&%XHsf7c?TC;5H-)nZ::G`AF6K[]03<q<Qh<B9q=aHi %8(W/14hE[;3i2Xm`Le55PHA\Ok3_:!IQb015Q2mu,P8&3kj]@Xhg(mNi;G`%[`S,c(_Da(cG)BQ])Jr6a+&>UH@:0e)*[gJXW@=8 %R4;XZrB&uU0/'g7q2.)1osT(n:RkZ1T=t'_2Jnd\>:T3-CO#a*/-hd/D=-0UN?<UqH#^L1]$`j%m4L?rf_N1R]Y0Y4j7%QOHdD*? %Q"<hb$$Z\b)]MIK%ZY'>E5jo$*'OT]i4[G4F.W>0<D+__$%^e(f,\qVDr=Zs6fk>N;WGHPMTelM$RgkX:,kd)U2,>L-Ur8rf0&Yp %Zt"R]*=GeCT$a%RW09[UF(6n%[D@4Pm!B5QCd&gn\%:I/c0hB-n?,aoG'/`o9]uo)6Ea%K]=880^DG75HMRMW9uS<.dua1bh!4m! %;3lJk3aka7PHY+Nl%D(R.4sct[h+jh"G3M;<U<4/;ZW)OL:fq;<^Yk<155HjQ?.o*al:UReVl7\Jka4\/iok'UBt.JN'C0/3\VMc %)K?[5FUfCS"K#,>;E,9K=@HWDn7l'qD1@.1&fBjh'DX)Y+;!@5#f@Wk3)UPtU`LZN7KB_mDE%nn;]%F*Rp3j'9+$S1_(H^[7hseu %Q/meUe/CDNN="QF/3;`[fo$NPk`?GsL+e>VQ!bZQJn:HJp+h>Ur*GItC%k/sD\69;U>_!"fj0`FY/\_p$g2]:M"Bq4+*h"4a,.A] %pG%$:4Jm_JA$UH[XEW4-;6]TH2I+fU-^DAu*uVrm:$<l1J@JtG?&LaeH')MtqXVaR=CAJ\rm78'8<$JZ^YKuB3oB/9[J`NlDifNM %U$qddEmDGWs64++]g4#bo,$<QX_tc2-(Wue@*qO*[snKA(^>]35nE2"h"0HqTC9H"CMIu^,E-[m5gKbJ&M^o;EVTK#OC#WsI5_n` %5!<9/4laBJ-Xpb:J"%$?D]M0XfU7OMl:'htZZ+H/!`_.55]$2bo;go8qo$AO#f.1_^;'s;^:\q"+9;7?2eIDRPQkQ)S1a]EDBQ2g %.aJc2XH12Y-GmFV3_Tp?hAKHm5&3*DB'F;*R6V=&\tAc^1-hEu)N7BG(k.)+V\)MoQk5X8CjaLkD_YObGC",Ea6.[17J5B.#A7R) %HG`Ysp%f0`o9p]s(pb0d6=00B9^$-43`1%W?M:`Ms0:Fq)R#^UBBNjU'>IBbfQl+,A.)`1m-P6aSbpt^<6`mFYkkYAThpikQR5*` %=tWYIGHsRc@&P]+^jP-LY&<8>L:ue!_8"=2DA/sWnG`:?E!2Ok3tb1CNAR&[*Gr)4Y[:neHlmep!n7L!AUUEigA#-]ec\'TOpHa_ %VEP-d+COBbEtg-C14R?RDnhk-p<i5q!-df)!_V&A=IaMCjmL[bJrOOfbCa\Gf%3S<Tc/@Y-SUX4^$&[Zk#`;orD2o(#Hciq.j.a* %qR!sA5m.^HL@:b0iu%gp!L>ng]ub4Iq?<t6p\OOp_FVUO"1*l&ZI$GU9TWIP']pDYp`Y)ld<(?N:CiGrJdt%1_C;t,(Cke]\@GYT %)o0;>V$Eah*L#Z=]Cg$+FH\&je#[/V57#'"[0)MW2Z4;`o?aqB8U^IL,eLCl>lf6:2=1=mk^O#2Wt*O&[-A3ND6"/ogV.DU*e!i* %B%ilnifs-#oj>;f6*_3:%=Xe!J/C8U%\HeYJ<+KsHq05NYfh7R[=Osa$1*>#M4f5#_).#I5k07-O7gWTBFQb?_-:lQ>PZi`GPYno %?t5FE!8;!-Dt^P,06mB)n9<JF[p=7YVUJ@@&8$)nYWM4=h2oe!bN'W"Y6">KFrPhApHSn2#H0oSecu?O#9@IHbd/[#r!d`?:0?k, %Rokm7%1+750JU#qm,f<n@=:I4='532_^k)UWT#GJg0F`F#q5Ma*0,/>W]V;F^UpVWIeTmAlMft9AVhG?Ig>0;o?@pkO1g[7p\)>G %^.":Cec]Js%R/UiI(eBds2#.mYO([I^iY*_s*AP&kFIJ*$D%=JS;c8i;umO3'*$GJIhX6N:AZN!QEW)!UdD_L$O$a6^\rU=^DlX6 %!Q*B7kH+94!1[afF]6HhJsSdgKB#+:^[fY;rre,go@3ml9AkF&&Roo@@YAl.g6Aj%=dcY,3Z(u^A(akR0JFA\E`X14%unC:F-<LA %@%OsH!O35G-J44nQ_dtbaq9)Ej*b1BGeHr=%#45p>s.A#^'>s5R'0a'3[C`k2WHo+J*RM($\5@5iEKs2#Y?QIQ!kQk@,X=gSaV7u %j*u%,NUMS7cd,t($:3gK9t\gi?o.[B3Qs3Mc,qTQCcE^<lQ#9+h;<o-88BaqmbhtkA=T(tpPL&UH$;rH>(F^aYC6Rm(PZ38U=ECk %-`u*)ph]jE1WC?H*e8k(CCP_sDn*Hnmh0osehCpKDnt6`XKMG0:&dCZq#13-04nb3Tac`op"t,47e2@"5\45DR[<K6s+D\nZ\_#6 %Q>sc.P^D:>J=;B?]T17V22mMf/=@L%\&]ag[[kq&F-8dOAqVN&i7Be)_cl*8*Ri3!MQ\]om!ED2kpS5"@D3"FXOf9,/Xo2fll.Fd %E&*kLW$PWsq%*ss7_e=GM?7m35h_gUmXoQe]jq%-(5j+M+VA@7alU9-_,3FpRL45bI'mWY/i1u`#,0gG(;bCfc\;j[W+fQI-?GPY %gJ,&W*%Y\8\7I"PMiAcNV1.k9*u5&jdr$)>F*;qE4"gjbW,loA!EJ('SKVprJm=3^]\HQrGj#OLgJc.h5dM>"4jZG"``&QcP9:e^ %#^^D"B^[VCVSa0cj#a@\59FJEq.Zc*pmp4jR.&.Z*BcsEq4KQ/+)BKf"!8n?R[!7@5,*ZZjOLhA^D,CZ0Q"?FHhdk.A*d)5J]en^ %1:UEk$orLQ$lQQ2-,;0@3+e4fL\BE<]BPL@c\m-sRU#.91@_'FF1cO[gq;?Eh.U&kp;N<WF<T8>I_DkuIRj,_d8YM$ptj(#QBdBa %ZEgj/];TTh8iu@HqpiShs0nh*b/0hfj!ADris)?0V:QEjSD/;4XQ;?=]g6OT+Cl_%gdWmL2`pC;$a71?[G7Y/3A8*bD7<-*bj+NH %<42E/bbpaVZ$#`J3\:5V-qLi3<;rq&)s$b=LMt:OAa-[%P*W9Ys#sMf,-fQ(\)6ftCg#:qeB?=Qqg?)E\b)NDhJ`?9\+rmHaK5t. %?cc1qp03ATgFn[+!NYc"gerHD\5E^,\^0U7QbqL]pnlp=%WFP6PZiJ%-b$XmHH!mT,nGloYE)ua[IR8MC[X\"C$jeur]Imdc.6ji %B`CP2qS.9\<GopVn`$&1['?$[M(?]b;<g00/$<2XMOiY4mE>I)[uFFhnU\I3PNA.b)k38YZ445A^APYCrj^i<I)^>1e,AA+Dn^D/ %nq67(j>Q_h`(3ST\9uBZ^K[aGafWI?XSR(Sorb=J_2F]L\+]UXa#ZF'YuTL">QWR-eW+r%Ep`Po@^Z=4jU\i[ku=SMWLeLB*Sf.R %\`2K.dT&<(b6,Q'hOUsZXVSO0aj&$&h7Cs<HD"]U^LOLAD.RPj;0&R>.Au&/VsV>k6:i,lH.f??r56rk.GNK[WC2rZI@NaB#EL\K %Fc"&Hk2Mt#^Q[E;:#jjf<V_/f0;cn<CbXg;fE9R8k*"KRjciTqH/16q\_>cmB`C/?,YX46%-&?EA7HD=<7i9Ei5&Rs+5],s:*#2F %jCk7Z7%aa=hiX.-j^0NF0E"P0?Esf#j[Na&\Y(c4:A'h'ogSki=?%bCSA5*bINI'I,I)iB;h&8l]N*[pjX36;=cffXa-G)fX/FtS %5:*r3neHMR'OTF9!9!RWWh-W1epQ3IcdtJ^\@-QW.4*[Q$oTH*)=7P"LV:oGEp'au_`"m(BT:e:ICPZJmgjog\)r:D%1X^/Y5;(; %W,pmej5Ma*/)RdFYJTnn:5Q%,k<pMFc0*>D$)h>cPq7%M7lRT@OL6=a6j09TS[ZEg5md6oLXU^SRXa&SM./B,]oD2Ir8f&bk;MY8 %6=Tb1P:a]Z%d!FYmo89s]gVBb3Vt3PCRL&KWPAKm?'I&+jYg"M%[cNs"h(k(.)*E\#O4eEi[h:i$<M*bSEt]23lYL-QIDh1mY);P %UN97j`:ET=FqQ(E[U(H5DEb^690I.jW]02N0MP^.KW9,R:-$4U9&eoQUJd7nL#dFM3?<rZqgr+]?7P'"X;7&mnKeL3%)7.WU.J#2 %kMBD$hm!&Zq#%kmk3Hs;b:plNg1Z"C3Rp8*.P#6+/q<Tc[L02YXanu[^B;6T+W<kM8n+0)P6eY>89k$0)QQ'c$s<2Vl^Lp^=ZrkC %a%I:?^ZGcYd8T.^]=rn44tg,$"aGOh][Zqn]?Bl6Y(r=e-Bs$3rGL9W;W%N)bH6ht'a%QNCJ8:84p@AP=m<YF54>-3*p)_)=U"kR %[AKRt'Q/fS+/Ks(3]n6s<LuB1_u0?!np@oM0?7Lb<tD-[^$,:UC"B*@@BEF[:'[Ru7(X/W?g5\'X5p%%p9NBb&pr#r:_jFMU%H;= %K]d#0:VZ[(]Vl47h61\Sl"`.hCO9A$$hQn6B(+DZ@kS2NW)@.Z5)X_aW"cNboT&IM3<:(S%CWfO&M!I51SMIi=e[N<kAhGQZ'L09 %m,QGD+;A'JfG6\tK5]Qp-+4`#,[;=KJnom>fJ[G3>ZBf.Injis0\R82"lFKSaBGlbdcTlO-A)bfLCcNfm+C/a6,L+Z?TWWc\"'pY %P,9ng/a!Nj*lt5p#T,Z[S"E3j-tfT+$aPn^$W3LoSJi(m1lQ%W3j#^<i^-f&dqs$XJ<L'TXIo/5%7]*KR6B-Z]pCE$TcL@Ek(q#m %N^&@O!&&eSiD15W[HEuq<u.c[!/ho6/7-,d]eW-Gi3;Sd4*q$oBYt#_'7_FJ>eA""N;5q13*0U";TADiT/A'Wa!QM<\/,NW:965' %iJ>u(+lUBi#".Bca8e+BV*Q!mg%21/4c*JNj@#H@[1SCX&9#6LoAPT`O<HuJ\Qsk*EAGgFd1aR?0*4@UKC*b2YG2B,90\j=4QsIX %(X2M;>hQiQNq.Mi;mRp3@;YHmf,r$$bH9YJ%1U]"csllP?8_AGrcDF*^#t\SH[EmG\1)'Ub#9M\L8o'loU8PA0LO)=*19[pj]$Mc %I]ojlq+ta/]"P'7Z=PXKF^3AW\FG9N:B'TA;(T0Qg\6u=G.)1'8DUeX<UpdHZ@9`YhT6SGgiCWU/`eTdj4/2@W8$073nrA-4Y;&1 %2Y,#@h8=PQIk/+sEm5!plTV^l[pYbW8V3^7s0;8YAo&0MYGKNJq97eG3X9>hSJ7kM@DaqJPVqr:2a9(>NTU),MRI(BfC-I[8F)%4 %4(QNLnp=a>ZRq*,"Uqi%h"m"38tUK^gR$ONT.9SQ>1CgbT8iG5bX%rFg;q7h5`bVk=gcRjHjPe3mqQdG.BU(o5+WW%/Gj,)Z`jlB %&nZIiD0kX[D9HYl\#I&"Y`ln)PFEUG_JQj*D6B-brI0XiS8<&$E92c%mX=>mTWA3G,aq-pS?Ppt29F\T)pm5*V]ot0"Kd1,cJ8[_ %:(01uLj^*KE8<N,<Bjq50RQYT!AA+`E\H`[?2$\5:"e/<FC0poK6IKheA?S&mB2h,2'+rB%m/oL(gUGahb_0pG7I6uleNS+FIEhD %Nil-:kM6kJrV16$E4(=1%g5s;nE$\[DJ.uI?&g-'U)3P4m/Pq\o#JG\0$a#li:tg@@,u>lA,n9,O*Q06+?b$),'NU@lY@M+dt_IT %qo4$A\shA5\6/sgIu>4O&qYTR_^NS$o4n/0A[B&"(NL<hSN4$Ujm:f(r)`(rG3^Y3m(pb#eNPef>uDmMD0bW!<cH=-\C*P7]P!8C %9Ti?^0[>)Y1kAhUHrsUQPeV^?Kp_k9=^u5^X0u@p4is6#M4:[n)\,W(c7b%8N!EGa7+2qcdd,`K?Kq&"W8f_*Y88iEb)PT9A?pT. %]k\70F]c?%5'JOIKBbNBI\5@JrtKH1U*Z?r9lAc&G0`A^-X9L=/#B,m3@>^aUDQ/-rK;6mYC3X:ghUUhnAH^Emr#_Dhd:`%be:H= %\9rMIQ%dr@S*B%h7][@hQ.J*UdB&/YqS&&O]8!_7Du/m<"A]>7`7Y.O=E7,]YuF]6pJcC]>qQYCN;0gkl9D+]7EdO5+1fr&0U]!e %:j:R>>JJi[JeKU0;Kd%9m>d4LPu:4GY4GihW04YN);6t!<BFt0qV:#k.XtJphNsk"h@P28ZeI0-@Pcp?Q0IV"]@B'/aj2Vg]C%S' %-HiO?`"iR3)XpLCSJ*s-=%\aClk-W?5./poD0l2SfrgQ4#n_tM="iqO:/`)b]?Ss_qGm4rj"R=][ClA*R]r209VEl(nQ\;\s+7NG %H%fO!^gg_Wo2pAUN05*<Edr=?WnufC8d>TD^5u[ioZ4NsH(QXEqTAASj_8Gj&^Zo3a!]^C/S35]l.l-_^CQf[6X2'uQ1(FZh_j,& %l(@R,1(`1(0@3g@G:@-NeD37G8!pG^qN^OT=A?FD?XI00H#XZa!Q]m;(uLdqT;6CS"87@/ajo-YO"Pb;1E4T5`Gpa>+;lCL12OG4 %=HMV:+-U_7&n[YknD#2?H:Ojc/2soE4V-6H@hK&k1W_'nq;_/=6#NIEZWW%f72/[Wgr@7N$#/IBG8pj6*9cJE0t4,Mml%27=<AEs %"qn?<6DOIKIf0BqF-%h82U5+hB.oi5"T!h.:6YPo=*3AplmUK9i_f6/[k)H-AZr?L+:ET0A?rQE"KUCD?=$A1%sWuBc#g<oWZHXp %U3m+Nj!9q;CKTf7ZSu&M/8@fi/LhVACg@/Fr,T@>Ok\[ZPsC">B][uLo6-o[8Ok1%MnhcPf:4n_Y,_<,6`C\mI,'!jdG?daMu:QG %+M"n0CRJgZqFA8)c`?oq.k%1X^\koJiG`TK+I8ic7/UKPlZcVD[o:2gF,of"IYXS9ZFm/eI]8j=J!c&G:$4,>Y2;O"]\WaYMI.2E %/_Z!4rqQUbH]@0:G$5p,UoV7UXkA'/nJ\^6g-:O3O]XJA?5%26h`;<Ygtl=Ze*&fLVpi2u&bl+.]lLj;hb;jBVY%@pV-`Cos5da7 %lWt4ZoHKgFht&4>g\2i2c@>/pL8h&?Eog>;RkK0gCO_9SWo_PkF4pJrri-\D1O#LZi_Ru^_;;&N2,bbnEDXbd+6L>2EA1YBD/OdO %JbjRIAU-!Le,TA'c;:Q*ULVcH(i4K-Z55BRIFe#1(V>t1=a00\0CNa7ksW\Y!&>*R@[k!+Vo!%T3S"8\OBYSJQ^VB[R"'@_'R)GL %)_[XlOCC$6E!R#>28Gj,^$>XoX4Q47@&IpdE3iR?^@:'ce\$4BZ<qq"Qbei0H.j/Af$[&phL4&"T.II39+UJM94"qE`q/BA;q5N: %Q!sZ>WOST#hHg#XCfX_l0V%DRH]j[YKKfgXZ_N-'e^!9fn6F^!*B_ij9"]MngH4`s08sd%)lAF2Y]p3""mVHHGH*jtg:#R_)$]?R %hVRo\\e:X3cK=.rrcB`=M$F/VBI*+g07?^'hQXOHLV!kqnG1aaAjME=fkA_L!(KBVoO=Z(p\!B26Z1Flcl+,Ylp:WWd2>[$!KGWa %V:>$2RlhnaLH^/W5lF3UJo-g=EbeNt!8`P*Sad2E61nmbX@>^*)_YPK/)Z]l;t:/PkMImcO7`9Wks[7<5WWNjT"8rQ.r8IUPK0`G %_Pd6t%dLNO==Ls(/Ao\sN7Z9]o:'f.jYf=R#qp<@Fh'<RS&'@kVo@p4M=f8i`U_lJI29gp/&/b-H"GbppsQV'"UXe(\CN6ZB$-a" %J,`8aV7lTeYd>L5=-03OEgQI4#3(MRCs=+E%''UjE_*g?f3`7pJOh44\YiK)f_XUp6?`BQkUU0gZ1W:P<F7t:D#RJ,+,)?Jn;]IP %pY5UkZhM<<1r<;V@SG_Jf$B4DV84`uLr.0JEp:;;afk'o2Kt&s4'+cCq^'V7"V#!L\jX0=3Cp#XPX)[jo^ZYPfp/]:dX'LH)`p#C %h7Q.V7r%*@g;g8[23@`KhtL8b]m78Rf;aHH9/S]02nh5OTAP1"O*99d"*#oa:ju3dXo[Aq.?%JsoA''=Q]5<FWB)^QZBLPa,drt2 %^M,B%W`m*dlM$qrnlMYhH0%3HI61cA>`Or.1?HtU0JR!J+JMOH+D"c)]A*7_jA0g#QhA84Dq>lc<0SJ25:a.!NK;NAHa]bgMWIV/ %p1:Ei$L(ESF0JQf/!V)5Cui!GAe?&ZWd2I,Ei[c`GI*R_Dk<LEs#UD7Z3iSec6&dgSg\u&Co.XBk8NkJpPFd3D.RHAL-8fnaGENt %gg2Xbs)S%G8PeSMPb-Kn._4))I0@.iPY]WJp.s\c(:Q[[D\Z;3CZX&5+U[ZF(.oFJ2H.Bbn*o&bI]7VK3<KcGh?E6)k,J)K(>t!_ %HltX?%Q!]aP9?YN96dVM;gMU&=TLM['^SIRN=RQ0]uDBam,Fh3-&S\?q"Q?P:o^lEIGr2XpNYfjk9\I(H`X*Iqi1PY=h/tZ0"l?K %Oqbkh@i);0[#KiuKmNDNdsK:\ga4icqkO>:Xl%)fm<D^6lXFUYU[jY\>^+D)N.V%X^"`d:R(dPPg1[!hnEha,T\d8Kf+@c<Sl3gW %Ig0$d]jCsuP'SFhEj3!dhmbeUp?r9AT7VWB=BVcG._B(hQ5X/5Bja]cYEgu@rT',XTD<Q<>])DtD2_Ze(i<W</!1Ymri,P,h/57T %0+Vf8j"^Lj%`B$ZOnK,1k]A',c$(YE4B`^D7uZUicl"=3hg9L[o^M]"0K[Z!l5;^Br(.k&msPj-m*IuYb"B(mZgs/4d1uUX;>/mS %Q$W;h<[^JeL$[Q<]<SHP?M.a/]6MG#JM4`-moIWR[FS-1>>BZH$onraUW#)3S;o8l#]D>a<=D:8Gk(fOO"/VK\SiejGVeGUX/bh% %>ur[0R=/SX=Ne:ldWm,QjoD]fU9I,2HkrF25^SE%[U!oX/q(O,T!u9(b'B$Hgt$\9s&flNJgP4TKt_F`e'F:3V-;PYgO8?$qu,oa %Aj4a,g<Uf'K5GILo.!]'hFa-rrr"DR536YCVI%ruDmagD'#"BkM,S+2/n;8nRH:`r6UBEg?/H3;lGE[j,h3D6Cc-`DDRN&2L#ggQ %neOrU]3E[)G4c:)cGsNRf&7.6WOIB?OVfuU11Et5+'ZFG0u;U@h!QIHHa)T004W+`Z\%`5H%1VCP0"3p+8C!8)s[S&)ebN*\e*J3 %Q9e<T=*WH8Z*gP0rSU\.RC1r5Fu?iT%>;Qk3NQ6rY;V\Qi6U[9]R*R4pKS[0q\t1Brklat0pe0Nj0VjU'P:e&<r%+,qQ6(SSFkdJ %Yj4BM,5fVRr?cCT+1''>R)M(f1$MOYZ#nCjXEdN$=F*pRIZs2;T;pe8Y"<UKRT<$c-T>5LLL-2<J"P?QCU).JZe)!XL"k;QR8d<m %ei$iVU1B=u8iQKLV-Z.Sh!&:E[iRV[5<SP-[(=bh\L'3/Kr//3Y=XLu!5@[S[tK1"1bf3klJe'GPD?4.Ra`@ql2!/ChjF+JFk)1G %WNK8dBi8?7B%]3/6iZ,NH0-pIqNH<SIa)&[7Uif?+4Km-hauAbbPA14Umob"J$>LaGY`X[5/JiTrJp8fYe#8#qb/KS,utDEWqW;e %iZYkCnR^H(AIVjGD9,@7b3u%UUg3$>[,<a>Z4rK[H,jRGRjXli9"/.$h!8ElH#'8-H+WR9[!J`XqLNj7,ot7CYt<.5*u1G'4+J+\ %K@O4a!5(3Jl0d#er3Ou7?rFDqT!YqMoO(@=PE*7u)MtG6-?Ersle(N?JZF3iWnrs-/cKLmS!N1sl1&D!f:!ECigf]bo@$A.9R<&d %c>,YZhNK":O0qSk-gEQ<i2+0^^?<,[o0]ARlo/X8]At#Umn%<ZV0`#QD1a/]SaY4sjl=q-GLFZZkGdW'kok89hC3\D)Mu;;jlBE: %lPD\bI%.-#qG-m*Z!JsU9R<m]%uo`t9o:dig?[/*qo=$L.-3JRj5]frn"edb:AiXXdRXeE4li3X[?<J!.i8-Cp$d(LCXR\3.(s.b %g(Y2QVFg&gAW\=!`;%@3Yj.HFlht1qaPiqoYt:"ci]iLclPrU0eTX`V>jpOFN(H8+2/?*OaZ+/(j_g3[EhRHiml:Qi)-9#5X5]r> %ELhE??N(^!:12N0cjeiPq-Sk'7D-R^.@2GfD'odl,VH8:&"KAuPMFTHmVpV@pnUMuEU.4\(FIt!>*HfSA4[)]j#=EuSb:Hj$c)eR %>NHARl-;`"jod=[p>9)@F=NYS-Umo2@JCQPf"[]/FYWmnG9n`I^O"a4V$&Ks[bUD"g';(HI(,\.V589T_Nd'@bO#%l/TA>@eT.BL %:WEY:m1*2ZgQB.?&gcGt\Q\kqnU%mh*Cd4h^SbZ2\@$PCp[j;(07F<=LlFX696'-]92WI%)6TPmN;Gc'\VoZI`d6pu02\nP)c_m\ %j-"/D]=`r;Z);ItPOA.TbLcBHf2I:R?&cI"f(4?/+)t@S\`ie[KY(Mf+8h`0iuY@Af1_![4hk(/LOUs+^Sa-eGd/Fg4j@tBb*-^+ %Fj\i?T?jSZa?FN$ik57A*;Vd70(FX\a,2OgRcjUbl/KG'gT<)XoHCmE4DcJ@RstYnhG<7Rn+t&dnCA+Z_Vc]NRb0j!Vo%_BI+S0N %+3j07[b4Tgj:d9?d7n?TTCim@<_T]fffcQa]:LQq#=hJS1&jp>SY9"4!8Vc)?EU3b>jh*d>^!V\XOMID)tG:J\)kk."C&E/Z&iZ7 %MhUL`ddFk5a$+K+,+Hn:o9-UUXrp:roQ0FOad50?^/ql3f(C\:`Z5?*QV@kbLJ-=pX_%XEBX'\H:=i8]!k5omXDXT)R2S@Ua!Tp8 %PKIh-kB(!n,$nqdl/nG3opg-/da%\a8q)fHUgVo.T@:%!A+mT.2pVMg<n"Wsde:i+Ou4[ks.`.SRZtH1"2JUKDjZ_h590`1N8#_F %cBkY)_&q_o^6=`QDmRJPf3Zl$^\==!]".F''YsSl\0d3Rli77Uhfhu*rnDmcG5N`<N_Zbup6]p)A5i7sWpQNTn`2XnW=,Vd=S@/W %4_60pIMnBa5)+LSIN'I,0rqJnC.'Lj_YQ!$+k.3=5fgdOQ!a$f=7;$A#YF'X5W0Sq/gbBdNmI6p$U-HEkK`Ls"1/Z=4ZbSc-bjYO %ZdB[dOciL@]"#DI'd'b+7,5KrMpXbFcmu^?CeSe1>"o<O^C#+'`L\9YD7t78!Y$Y7j.F?!c!iTJAL?G(kIV@6IMc%$gDqj`;c$uD %5H2OQK8o,RRGulQ!RP6%!C/a-$e`!a.>Ij&61/]=_+ULT9Y^?R.TK6KIggSm?BN$%"Slsia<NDIo#;0]YP-c/8TaP&kasXIrYut$ %@1_ed6SAl%nb;[fAhK\N1g^(FN_h9qEL=ibo\&+k1'E"p*5Dmu/G0fg2tt21]mA.s%qT`6r8N\>GNA_U+[;E6!p;s<!/p^VY^4U9 %eT7VR&jA!jWooaW7!DRe*jk`O)cbW([U?jEoH[In0"k\;P8XY/`m?C2Nr_<LS9huRI"*%,'AMAKaW)61Y(TjTT_?F.V3bFk)r\a: %C<SnJ@AaDQ:knA/HqiJJ$JUiR(FQaXQFY<!j6EhXl<,$WEM_knl.(D$Q`][@;^iZ;!XUF!0E-KIo%2;pB6]Or-tbribWkWpjD&c* %LV]K1TC7bZ>uUN,rl^r0Y(As84^Un2.F7H4fQr=PO]7588ARbaGk`j1N4/&):Ai.73X\<INqC%qLJB;^(bA[C)b[K?/*XYum\Q;] %1X9@I[s<AdAVC;]7/@cgabSHF?.%o+\#^#hH=0h+"$a33/4Q`"$a:L#r)VWOeZG-hY\X!PTR4;n2jRNhk?pH$kY[7a*@JKX?u7d] %'1o?4'ahGH^A!d[X209:IdpdpP-;$q:`#'T_r_2[IOk^B(/(@kk@)^T&.=%T(U1DEj67a=1"afY]a+Gd\X\eflqqP.0W.7*D(mlt %bNdFHg`Yadli%0pQhC.@g`V>,D<AZn\<\"f)/fIVN[p62,UO5.++;,T1tM3_Y-0>mM2f%Yh?nQF:KVd-3]:kK_;rbUouH&s\8iD3 %5Rmj0Cs5aOpd.JUhDhHfEg-S_7N?#V4lP3\:HJnko9>XgPAN43hd.W9"iisBrI%pCGd#)1+X8FDq(FP>6jUC9)d^ON'$U&ecZ&j' %><r_-#KW1EqTd83Vdi;2P*,Q0R[.K<ZXG`kp-8sAb(1-;f*"9'%H1ab4X$a9EJY2j#5P_eam9::P2/c_71GUG+oq=A!l3.>%jM)R %m=c8TOU7-qiF/*YSOR(8/rB3.:r3?>_+h=l/aoRjSTnkiY8.%:>l1:dX6GK+/Mog5]Pi)WD@CDamsk<F/-6RQAP*^K!1#9jHg&Ul %?o_@P1X=ueqo%L.:0M1U!h\\>\@fPc3)qNGJt8_g^\.d-]P3mn*M.rk-:^TRLLah/r+aldq+CXiI<"GUIQ5Fk%LR-1bPDb4ngaeD %*.HJf50S'#%C)TtbR7W5g2Yfse&Ql[q#+RDLTsME)$(sXMY4Mi+?gC,rP3Z;QRK(,)BpoF0tjoB13=D_im'tD6nm$GPd^@`GMk<T %B7\ma"X!>>%EpT0,!9gK_VPu8=+e6bdQ;Ct_V)B+Q(Y7=cGZWB9%H>ab0Q-o,I%5@?U'N22;`3hMFjLNI=VIX?qf=7K-_-;0J5fW %$()i>f$sR&*N,q/JPIUtFqnUq>.'B")'p)m2'*ss4kYP&55.+/nFH>UA)>b"YN`IN-j&ilfPL(YYG!/F5;OB:%3J1h#LY)2/J8!j %`EUtjXSnE*BU#=E.-C@)']Z!d?]Fq6M8i+_(]3sSHSe\KP][T+U`tp<[l:MVed6tCO1Bs6k]e'U2Hej(6MautZ@G:amk_]*m`4kG %?4fMp7+of1+Gg;_Mk"1>Ht:J'Xm7,=\I]D@_NJS]GR5VB0"YO<g>iN%%e`t\2Y&A,YW57]_1suThT(9D)'mTHNK%R8bTbGR'Uo5F %S;U*':+#=Br6J\`S?/nuT7-#P[nJ:B[KZ"pCID;\kYT?DFI;a.;N+!sK2p:Y=W<9Y@quoL9KmtY_Lk!I+_7q!-X137Qb`p;^-^E: %HliQ^g8amS(ZmpVT"Tjn1H2uY^3!lu4!W=X[&+^pJq<kbS+^Y45A/7Zm?p)^C_!it6A"6N9g&hq6T3GM#t*j9"_trp@Q!E$KoO'? %c)5PLXf'^(=(/FrJil6hZ/u_E,"dU+k%3H-s*3cpNu2[eU%+$S@P6WH=C^l?%U'91EM$@X3mJ^#LhIcG0"^+Krr1-q&.t3<N$hE) %%G0VhQSuc?Il"m3#9,uK_F![FTi.ei1^r$MpIQR3bhjRdJC7mt^XG,\'en*c0!T.2ba5f0P!9A!5P7BH\dj&VLR9h=k7TIoR@YTq %bssHp#DTB!7?"N56S0c57>rsf&[uj2-D>C,PBJCPZ-8%Re<2?FlM;hu0nm_S4*I^k/a=Duok,pr;CQ3?IA9rND/ldVWl=#b``Xa, %$oTa_0&/"\KS_('SdgWeEanUArCl"%fpdVejBF]7pb'[G>LK8D"2ggR<@rX=ALgPlhO]FP"84I8j1"=:A`KbseG_%$o]=k<V7q@U %p8XeoY+Ti?IC%MOg$=1./*O(<2uKe40"?Ln:93PS6Piunk>NrlFU_V3Y_$al/bm@)3hK!'$9Cg`riLo-\:W#+(AqAGSc>Kf60DH( %3+WP)E!;dGqm4o$"]s'1lM1?\6Piuna!)dYYFu?,TX116a!Wp2G9sG'QQVpFVuuV3JNm<5#u5XM]qeME^s<Z!CF<),TJOOIQZ?iI %PPl^$G9s0c3uLfmOku;Pk^;=L$o*%h.><J>9@8g`R5l6>o?/`BAU'5WS^@#i2&,>B@,_U.^OWo+OU^@'U$n^&eeE?^BtX#aI@)f& %ke9]Y*4ZE,P>g%c.[_7!;[Q%!O6*?=6%#\JbP0&k%eir%+CtluLPYSW#TH!oK0@pZR!9?^m=&cT)s/5DVbBW4FpjWF183@F04#V^ %dYl(^TatC5+XUFLCH4d<aM\/c!/j>sLuhcmE^]8H3NF#!I2Z_h3sKcV1GjfgbD:*@MnS=:UeGY5^VMl8?"2MiHs2JRAn$HB13G?Z %-+JI;cc)dNm4eqs9HQ685g1**6sDV3%$OX&0]`l.7#2MWFu;Ok3U4C,<e4u&3S*^`rW[/6C$PI?fj8IfTTs"YNZ@iEXc@<39F+SN %;488b"+P^\;53;^)`9&LI[W;]s6t;9r)n/iQg$^F2B"(*)TkG9LEFb?`8!6"W+mG_YR0t\dm8qb+2lsfrdTNepc"!h"2F19OcED= %fA0$,]#/=ehY/b/G:+3oR`mt#>0a>J.Dud]":jr[+/8>rFna5-hT/S5mS)\ZdrtGaU=r`V*[!4`M!]aLM]`#KILnf)4K3dQ,)0>M %,@:4XACUC?\4pMcM84)no?RDsaec7XOYE1.\05RTBRnipFSM+_nP\7U7g]cZfARE]VCs6Jnsh1G0gg5V]p?_$Y523fKa[@&YfHb1 %c%k<k8h6+mZ#F[Q$LbK\1_L0"Vs2&[^6'q\g,T+'6bnl)+u2';0/Qt?,u#&8$*LM%.O#P1Urdb_!H<'KA@@6\L^]Rp:!/%t(QnOI %%hXqlPbf]ZYK*"0*0F[7nbp!EnpToO+bL'/-H2kn4Li\T^\7[KO[5ML+u6TjOf?LM-6.WL+u5b_qtou@aC'.^WC-hE\gNi5,BQ6d %k6,I/Vm2a42jSdq_0)[l7iN%/5@aNIn)"T/=[.m?b#A]5BS\_dWdj8H,W8@nk?u<uL,gY"2OBe$q:Jg7Jm6!CX/h``]4'a_@T6Df %LDn7$/`C6km(n=9,pZ-4ED'AQSUV2m,57,WD+4pLA`Tlg,Sf#[&48EGGC;ZAn+BDVLPnii;`Ab\SB';5$o[R#\=#-PVlGL[aAAF; %4l"pF;T%#%Kru3h;a$XFNnGoAk$8L1bIOY!=K:>rL@0@I]9b?sWCH)t\;4cdS/X,2XbRimnu)`m/)mG/LRW8JCTeQOZW9Bbk.,,O %]iaKg8/Q/03NW[>oIXbF03[:Ar[0a*<.(6l3jB$p<OrI,#s!:$:nP-$52i>XSF6!M]CIl>VlSmiR.4CVSt8A*p`%!lapD<H85\^? %2)cJ?mu,!^%$u>BBHSY/ATc:#=Z)le_hdo>8kiXj$,noRT9XEJ=A@s3HK*F!Z!hro*(pM!nMO\mkAP0MNaa^$?bY>^j+R!"K>2Or %j+KAYI1:NM@4oSa0f/'0;aK(GYWl1tbGZ3blV[sKe6%?Fk#oDPSK,81B1;+9r$kUJk#7Cgs"g"!<.6PbQ\n`ZB+>ZU36F?5;K84P %<2="%>.DmDHWRC2&SCjj?DjN]1R?g4ps^BYm_cIF'Dd.-4<,;p/VS7\1#H`:5F0/HUSCr+p:jH3(\f$G\Wt$c3_B6j.@f4t*)@iJ %="0YVQDm&H5@#^C,g7&tAh/SA)2@4cqO3/`6%FGC`>@L$7_Wkl;#"sOFW^$)+c`,-L!6R6_1$usIr+(R1H+Y75fUWp+l'J%2U%0X %,Ju;Y0!GtsnH0blYA"/gSJR!*2F-C"-jSY5Bu-NKhtiqIY0KiRp6t^WIG;YL55SpMnZuelD?n4o_/%H*Q@=^o*Gk5m<9`a!R_!l/ %O/AN&p#oRBYMcStlrT.C&"[>(P-.#K6QL#d5O;$$cWZjXDXi6d\!&@ULTt!)B&(?c=C(@K00jXq]>^8_B-0<[B8QMYlf&u7:;-*G %Ft4u]5*IHhNj:'WZ.ibrKj?PcHgT@n$b>!+),9D!`<s,cD);%HXKcf2J=YiJCm2Gfh)7GMNdN1=hpugLCH]E>46blSW7^L&o:;,H %4RDoGfYp%[QVIJe]10T3<GpW:df/0IJ&sRI]tuCJ^SG-0!B:h$e%HJ4:6Ai21d1dmZ*,2H[Y&oFrJm4*@JVPsDag4bO?Pi)^J>sF %.WX>9Qm$3"0"d[2]@:Qa\'ub&gq#&hPEdeFR_1GJb+bXef$X,;_bRA58Vh_pEl"A_%^RF(;dOr;V..0rag#lhk&llX=*2RYVS!3o %ab<.=lJcnG<rr&i9tYJaQ.PcN9B>GYEXZOR.mmPc(OCSV%jH@J#Mt`5+0[tRHFWF,=EHB5;%o-B6S+(ijeVe6_S`?"h0U_fFL.ce %]'BdTFC$K)<M[p>Ra).IF0;D3Z:=f]igdEFc>.3*?e+pm24[f#SaUjcbggf6<Be]59kQiB.,+TcW3ph,SX8qVUZ=F8dnS&<SkCr3 %T15Dj2-lTJp"uh7]P?\E06=7m$cq_'@l<(%q6[2RFlG2Wds:2=d<?>f<__a'>!5YMs&;_U=HZNSB8_eqWLD,5QB"sdbd3b`$\-Gm %ml[W7]P?^/DZ-'<RVq7$hPmO>6I])^Tpj9-QL=2QRrESsF:\gc:$2tjGurI?*MY=15L4(*Y5oiPGurI?n[9/QSQ@\>="R^nQRMcd %Qr$N?21SWBbbLWPX-V%ZkMtI#l+Ccq*5"M&C-&Qh)kX=\pk!!:#LN-t6g'29YGQ@ma`IN\X%7@oJEqimigk>9e&63;gk@;To=LmJ %\&QM<]%EKo=/?<&rjSF9\(,b-(Os$"cKg(fYkKJ<^99/fB$GKO[Q!I%b0Y*RF0"a9?e"W'g>mToD+b5W[g[7V?.^I.m#L!sBZ%^/ %T:%jWEY\YQM7:fW/nnS-^nR&27&KSA,3#p-OgY*1ZhDZ*&WPrqKaED-??8&*2Uot&gj.DaN*gZc<Bd-eCW85UIu.Ha^ZLPV%8=:q %mLR,NG0Sj8o92OIEu,-_@JJGimdO8SM&5!%r0XVd20Wq1%[D`-oegqlHl!:b_U=C]@+-b6F/uY2*OmSWr+\Yf'XY'9cCpQe+B0u5 %UnYmX4oJTf2<$_l7WW*\+l/bhn9YE#\oK^E9WgtqG7b$G8"Gch=U`k];%t*rPjrY&fbL'q;X-*14Kgf8[]iDFa+e6PL*E+:?J/.S %rVtJ3Ff]ug1\5&7I;feqa;PRDcEoI:?I_h*cCaQKAYY4Uh^nLI:4LZ%^cdPG.BGBh$]Hs]`sQV^FXEV)KeN?"fAXTs=&-3nE3M3, %@HMpcKQ$#0q0+5`g>0iGo=e:M%e\rYOY4(:?-(r.rKR3FG87>)COS2Z?Hi!F_i#Bs&E)RHbO1uUWhsR`]F#OR]jh>gRD+bkr!iuN %B--`98b^iCB,rAXC+VrYC1K(=!eUXNh_UelK'bG@L=#YGH6VAr<o6",VC_*)1$<C6,[oAFL)]Q.n#\M9\GN&d1iBi#Hf\b))t$&K %PkX?e,4h\E5I4eV%<kb-PW.V3G946;3:=;GC+rj!kbrfZDR^Y#mr^7>(6kV(Tj`+)#0,JPP'"mkRIo<4*%Y&@CnR2+`qa$sl-HL? %5eH&ZHSK[)j0XNJUKF.8SA,lk?Fa<Vs*GA+Nt_L;<W:G;.e(&hdhOUrQRCV221MZFpIMD8;VoA]YQ>3SL/7c`qT:80R#Hp,BoA>a %@_NRc:&j_=<,Oc`ln(W:@#/>E>h;IoXpf:VfCec)9YPu;;a8cUk^n_[f&IXrZ[R4M\f+XP;IC*#m<dk:CL!?=-a(r7BGa4Uf=2U! %gV82:1>tDXc[4RKQ=oC9Ub13pY;NI:=Q$*V*&c$:)V=+ZqWf4$+Z=+\EZC9=)->A($oP1HJL\uGoc.^D+Xt943LCD'Mgr4t_f*ls %$lmb$rOssj2N%/#oc(""X5cFTBX3oVa0NE'eb3RmR_EV0O]Pf21O_>Ve+s/1f!k7Ko,b>/@9rW<k&,/b'([]mli0.]dWX>`??<S) %]_^MFkIOk.nD^AZ]+(e=qoAS/b#Mc.c@%("`)c[3Vj:]W?T[Hm[_fRl;J0^t@-Oe'X+s'FF9$R_BDH>M='%Oi_S6?e^q8]XiuDIA %U2tdkJ'-41fpD3l=+p;Z<"CpL*-SWgp90p2^@[t<[1cX!r/0u!^6;#q0Pt[WGH^t]`HKaTdV/%l?$G56URT`]0*;ZG=JC&prX.%/ %nbE"S4gCWbo^c2!5'HTT:(nU1jYqh[$oNla484#ed:l'\ia62qZgujpM'MonMl#]dj2=].e`/LMY2kj+3SQ,t-`[uS&<ga[ABi`g %^FN$F>33LE0R')F;4P&JWY54eT("\FPX;0Hq1`rr*oC7;]$r3:3&uuR5?4P^q)VU+<i&O#mpMZW]S<._*tC1tSlXeK4R[LacQ3KE %ELSFN$^TjX`OR]X*BibPMOD*PnB6Q9@dBu0DEL#3.BX<Dip*d2<K,W2cBRl>5"Bs`Eo6gPHSn^sr\E,mN^^fG^u`+so%^$R9rW+H %]6VH)VM^FC(#VbUf$:?9X9/<8A/T._h&ku'b8h#sQmk8QkT>R/qrVUHN0!WO<o<=$5CU&i'RhB_EPk>77V.$4E`63O?;`'@WAhg" %BDpJJa1%]B=90M]%hZ*g`Df%.*_I:4[5..Mj34LZ<Qf:Or6!]7f<S,XgZV,8E2A'u^2ku.NE(%gmi;,['Y!:0dZi=m@nFsbB2BbE %TofFL!M/e1[Sfl+PhOZE\))cjjm7>Zl*rj6.0c8@h.7[c1igB>'5u8)[4]B*%Q9a;_eq4t/Pl/X-CnC:"gNpYktD2aJ:b/5Ea`>@ %d(]e3EFLeh7hhg)E:b06RAp8)ec8IL`[=^d>(?p^!LtL.4St+a,>+Q,$IH&4J/Z5n>Km"Qns:<g7^\sH<<:ef6!t/[=I"k!3<!rn %*_H@!WrP:@jB4D%mj!Ue!q`]j0"c@]p6_oMi.']`53k\Hs3444Jtd5U]9LW#$9-R0q')Md`e7O45kAOa,k6BE;Ej8l8cN"]nqHk) %g)Ma,Rud_:Vb?jLrlW[Y&!uiIQdkQd?7(kWCd!tSK*1Q7$heU.HlFQb]mc.q\`Rn8+04Ikhm];ln+E/*gNLS`rISt\S*A[(*r#L7 %Dob!E48ljASnOS9\"W0_q?<db9["IdH*:RoY*;Xaromb(5_K#C*qtTO]mc/S8mrb<i-YESo9gT/eqMfGolG#qI?E7mED+W)rIX:_ %lZS"cme-1O\sl'AWp=!+@)`YUYFNet+/>:C\Wn94hWd&qrlT3Sq?:qGpo:^9>S#c(CLH:OrOg]mBtHT/F#9IT?-F&C5/,CO^qmMV %c07F+$,rO1n)KmVY@$cI7a9#Hn+C`Sa^(J#/M3m8f5JSfT""R,^Hj^B]mdfZ.4d[VpNujT]#t2?-=6[tY@$e$IV-RG?gmZo8u90o %pDL!Z-LBF/NpsJ/Vn^h:pf>-in35[o(Zr+$n+ZY^O(-qcp\26(s',H!^Q3<!bIQHZ*96eic!L-PI@8dc)r8up4Ts[-kO6/ZGH]o] %X4"l?lPFB_O",n`Gd!`\?#FS##&E#c?GGa,nQG;Qo,6Yqqe,BJI]m,J-mA$=RtV;WUC`DZLk(12-Lnk$Dl,2QGhhVO%(t,/r+%(W %fY[Ah^T"9^k&l*Wm8cHdb5,i@oaA3r-@W?OjLp#9mc+[PLE#@s4hk[][.j+8(;V!&O71EP[.:`W:N1W-Zet*3EN0`4gZd2DlPCPm %1*c:<^":T2k/fuKrUF2Yf-Xd@]>o,uB"HSIfPQ\nl!D-_dnC_!rcG?9"-[6(q??\[5(^uL?GBXL#H,2c0A%sh?IIa"oa<M`Rfgn! %S]AEmgOZj1O_6D(Hi8OlCrdNe_nCMM#A.(D4-t<m[KCI@F.O]&I]oANUsneU/[O:!kJ&99bP/^;GPXs>4(IH4eE4nPE\<boL'\qV %j^'RjZgQ0m[(2UXRA3<jqBb"1aqc#ie8rU5!')Dqb9(icjZ3-R#6L.sN(T`]Mr-r*T&sG#CJUL1^V>3jT$%U&p[c%@FY9b50:&OE %<`<EY:]7*:O2gUO.o?]Y79:RThkHO@J,/0Fp5bg#gc2o;f&&^'>e0bcbE`+(f=B&?Bo/m4heQKi<)7SC]qZsXp@\"!*Ii7h\FW'b %kN[E_Qe]R<m=i15L<,XHO'BBS<VeJrh52e;gd?/QR!X4nIc6mD`$+k+?E\CqL[iiB^L,:[#P[&6r\+;"g&HKKie(6R"V$'i+]`ch %VVg.?a1Fk<9CDB0p,0Fi'"^>1ei#_.lAM4'=8,eQ5%9G.HM/c$o\#,h8c$SLoA=\)F3Q6>N;f]#da9kEKU'74/+n4I>OJklmA0%s %5n(EU5[)#S"p6D)X[U]m)p*7,UiDIRHGKhglOna.pP4+PHqa208*Qi<:2q$uELkl!=*%WCE)>IB0<KZ*H@5?B=F*r8=M#J/k1fka %-b$IX4"a`_MIK<>.9F5_TBM_./plAF\[]aj+1(Cc:2'/N/)G$qR\bF%O?dW`6kc%[;DaqM]u5f_;KTIFAYZ4m/r+<@dH'QO;'^mM %[n$4,-^r>=m:beSH8iG/ZNPVlr+H:/=+9\P>tC^F>isXqr'p4iOl^Ra:UuHgZqncBP_DI6I\$6.eEcEYr4;e\ir!'T@kg>hMp(tK %OQ5>g/H(Dl0lHpcf3*`MFqa5RcBm(R,lX2gr`kM^n^"T4B2(,c!%BTQ[m#7_S42;pnmC5,+Fe?Qo`.ltW#H-#<YO$dq[U'DP-tUT %jl2U%TU<//#_h#k*I<7BD!tr;7pp\Wk08+1q9agb5ZmB:b>u+'X>]t"eRH\p^c$7V013<+[0EYt4pg7#-%q&i^L)5-`m^R>c:&HH %4NU`95EUd.D3YfY=T]VT;]oe+JkuPP>15_V*<TbHNjBR*:6D^W=b_Y=)Kq)`-[Tk]Ae33P7!Q<Ri*Y2C_P]tm+S3Q`De^%qT$:E0 %!V+<L\s.&JY,oBeY?k0dbL/To-(F"`ea$/Gj6Cbp-Id-9D?^O8)Di'70rug4C"UA<G,f?.8oD%80C?0,CFWbBf=X\sFWjm[`I9?- %h7YrpnbKO+M%Q^QVhR#06GlQ3c/UV^.g5oR^Z!Ls/?o3Q]&rd"D(bq)mW`@BAt+ju[_=*hes[&1IZ:'/L(5cgPoe;9>l]iYEs_rP %M8/cST,lj<Ooq\UhQaNiE8R:W?,<Y^%=\FI['>VNc5Q3s.,4>Ng-(9$r-gZ<=&e<q#]]%-go*=]mLG?G1W[j]G0so7n:<%6]5%Up %o8?bFPeKcl7rP4tC`r2!\H$Kc%%8Qqba4'6&gKJ@Y%54u,9Rjti^:"*B`iT\MPCcUiS*hs]#i"Y[#I%PIU(begN"a;YpHb+c@2F[ %P-G=LLI(O,n@A="iD[E6=5)QuEoZ]j>]5?X&.1PP""5CTP(Y^U#qoF1BYdlNh;7F"l(1;gZ9(Ngrjh#D?c\a.DOm-K>W_XblM%bk %.o%%<N02?ek!2dfTic5*Q2sHlGeNR>3Q1OA!5HdB+&IF?0>"lBj]:#XA9UjcFR/)41`-E5NXm6TeOhbJp*&L7`BAa]G@qA(DVcgY %R#:qX,Tqa8.Sm*3iiA^rKuWrRj"#mASM8b95ANaCa'o\O-R[*(f=Qj>[KGqgqlj_[qnLHbEB5]nDL_^\<nK>T:^>F$7""1cdq68@ %A[Ul?&Z*>>kbAE.$a[Q\h/J=r>\)F)NUt=)E>("Jd^"1b3:a_rfXLtq!Q.)Q@9=[\k%pXA/_$ZE7K%gOr-ckI[LL26UKqZkluPt_ %lZQQ:SJi*bgY,q?Cmqff3q'A<l%0OO*XuNr8XgZ+B;U*A\AebH*k+<@R%Q>+>'2+1VDSq$B7(:7maR"s=@B[G@/0Wc7!A4aO3nLL %p*!V[LL*@#cB;u_G77m7-gnSR2?\I<mk8ILHK5ZQB,ZB@4T[nUHO8I3]9m&TL^+a`gHe"uL:/L8g^`)3&Zsm<*U9C1L>9?9=Y#/. %`^ZId0l2XXa`4qhoB'_dDeHff.[F':qcot(3;*9.$%U:^M]*Ya#VQ_+omId<G:mVfCGkae*Fd='j$pCg"K0*G^M!G-`[7G`D"Xm' %b-l150/!A!rj7-koNhUrMWT#0_Xq.9g&+eF$.F5-OkB;T_Xq.9Gns?T$.F5-#dJ+BK^$/QMY'[.-VWtT6t4XB$.F5-`Z5W>p^%*3 %FX0.E]6sY%GR[>`k-6i\pIW4I8*=@&E^2]([%7jjpB,f7*EbZ%n>?U=+S/;+_EV6fperKV(feqnAFS,qr5[m!>adj#KNqZDDS]Mk %m'Bu?:=Mub3IhS-4>RXX*cq'#K77BR9NL4QX)F@uI?:[@bbt(Vm6s30g08>ajS]2#qg@[+m?gf7!/=<'GDjchq)4-':M-Z*QhT@\ %/k:b\+^X*-[D`Q"+@sW)>S:n@6SjBTpqPPq<R^"4:"IgJm+Li?VgmKOIsq?'84>E\g&)o;?[T>pQ%#W0n,/edWS@:Jl?j*YeebXf %oA\Vu-C6cqDS*6:Ea2j`$beZRKjm=]2<@m7]%p%E=1[[^aL0&UM2guhkN0HjiVDt"T20n,%i[V.V,gc7s-=n7;K;I1JZ-g<(ejA8 %#-+[iks_e)ln4iG2+fOWc*km-+QIgV=9$,+g+J,>@aW\(q_"<M.d,4SmJus4%6)M<A+#41jGG/=MU/lZ,K[jU<as&*dVYh%:$XDq %<6q_4ULJS4U85?dTY1qo<V3,KPO_^KI,)66I;d$+YOD(p9!h0#D>D=r]Zqlh<;\f/c(g-Y_f&0dNp-EZr6WcKiOcD]R'u)qK6jlA %3#\&X6\DT'bc:JsO-=^)n?Is9p3Pf3d[qXHn+u+RR]f_s,W]V)?-Z3^X)B4Wl)+6qk^eZU>GDF;qZE&[)5Ca0O*\dsd6##.6+-37 %g@].(hKBKLNd)g\J++qq7h7@7$WmDef&eq=F`u4K<";D\A&mDr1]6jo5'HNTM3'kpYqE.iFkn_u^sQebfLg(UcZP\Q8-+PEf$5>Z %gf%_8f'*>I/)!tLmSc?i+qfa>KHd+][L;;igr>00cO-;4f<tNJl_RWCfSc>B[d,Y<l'Fj%&X6?H83of5<]5ScFU]7GKc9Zl[Uo!, %4?Qd7<$-"cfDPI5npC2@IDXtBG`.`=LYp.BTkA6a7Gnt\91_#aP]kOgfj$7_.?mSc-u#ljL'X*K@-m"XB(TF"VW,+[GZ,E.M<pQR %fuaoF[R/WD!#Y7h'EV\@iOBg[?PO&:'c.LTr=]_Hb&3osAa8:W?mK.h!O-=WXRk-qfgOs\::^W_?@OY]Ptl2<!l`$C`KQRL%6?2n %>DB[OL&iSn$)SWapGr.m4_]XmG#O\JKf:Ur6b=3sYf>\%$lL'NajnE?Q7hQ:I?$<R176"h@\XCjff7PKs6qK*qg$-#CPLCj`^]<@ %5l-1<0?>e1aOm?)lW2RF<7Ns'DBA.ha9)U%n+E%SL$b?^aiFV^[%AQPC1=uAaE]<[e&4EXP#u-/;E)e\7sPg73H]bGPCf<WZoq[D %dLO:V9uHa61rRL\]P4L:O`p>'AlPhCjqS_++5-d+EW&@K"NH\&BWSFCZ=7TZ!u/&L!Vjf[Q+*#r(Q>m#ekM[A;tbY:U.c8iI8?t` %'2=s5QTo*:9gAN(r1+Og2`I?XUake;*Z[4Rh`Rp--.p))3KF`68#QU\iXp"3h"Eu\3tX*P`V8QrR73/Xm2L(oJ+Z1pKaDVlKJ2cL %++d5AJm0qIZgF6Y`YkWN(2kgth1Nk:WXL4aQ+(8(*eb797,.o5^$$r^E/8J,_9cX.>Yg_SbS7ep(OOCHJ2V9eJ3H%R.Ir3*rT%>: %J1efe4S?1#'Jnu]:f<*.E#Y$ri%YA9TkC-KYh%BQaj?V9MW-Z7C;^LO/KT/3SP=E[!>kY+MOYEaG)t8]JLbi"G[mc=DS_bKiUgXG %#Ke2u"HqI4MFTg>dS]8^=dZ,>s8:JGm6IdF>P:9'F$'()XhLc0LiM=@rQeYf_uAho\n1p5F_f_c9#+J?!A.QRQ^<48Am.E-H7si0 %WMfA%VY:]cS`:$*_Xq.9bVHSu0YNeQ&nYlC@<sSX+?$'g0YNeaM,!Fd9^a9X2*SF?0YNf\QD@47-_SVGV`IeS_ht^/j`qpt'3C27 %/'n)hff26?*@oJ5:mi_Wlra)`DFZT/0apc>Q+u)IYZ)k`K9l,Sn@+/njJP?-p&2MRpi!&Pi>:-r*;kTlWqlcMBFBDC_]LYBes_^\ %oj-Jh$T/K6:YC,F=F+lphn.d*rdPa8Z0D+hG-P+P=C5HaT:kYm66'%D4[F"2Pe^DR'<L[P_Caj-s6K^#5A(RGJc0d(iJ_?`U]81Q %qs`Y'!mbLY?BH$&ZQLh>0&/U/$Z1:c/Ag_#7M8[C6/n]!-7J/r=+o2$N38##e]+XnL(bgQ>'+Ei6th]=\fsE^*e*#IXU$S<).",P %9bT=WY3?=dd)K^COk67#cc@*=^rm@l72$I_?-:4r]E0)fJN*RE73kaOE0C%l'E6Q<P,=ZWOp$h'aVYOpPIM#Kb(;>scf5SLRXtLl %g-eNK;;e@NBS*Jk#r`:Qo"&`,&g-W]?'Q/*V<%`Mcc?)OG9#QsWha^Q!gcb`9bMaJ_9&,M5BMq;'n5*Dki+i,5DWqPnOmE[(P#Qg %.)V.(TE7qu`Or,^AUcD&[lkCIJQE6ii%lRt_`Ic!S8];W"TX:/93%79/>sJ;+56omLTROj7Z[W]U*+&I9baNpdq"SE?k_/tFs/9f %68?@21omS[9e[S@!7Wi1&)`GTBbFlC2'=%L6:M)s:^aJE,-XMrFG5^NEJPE9Q6IOV!VHdQ@P9_daZR!;)1gsnC(WEJ2bDCPJdP/k %AI3ki%FuX'V?M[>+Cl1W#:'XkL=^AJHq)[$^]j.*"_<P(ScSD6[fe=YkmFNmd&IF&[.-DA4Q'3BXNCnDiW4E6C_X)RoVSRg7=l:W %!MBqd<OCIf$(R*>#hR]U!',oVY_Ii#K4tGh3(2,E`"ZLQq%QT@Z)A,OTJfpX/E'^8H;;k$/4EIt;4Gkn<"tHRk0u5IdA<MQG&_)t %AaBT-Xi^VM:&uJgKVfMZ-cA>q%Y'MmC'4p4<u#IKi$j;GWjA7;$K-l9W[$oJ>'8aJ_P.;Y!3#H8mNiOlYU351W(#/q(g-iR:^*D/ %#^DLI=Jqm(7"JjT"\cqpg/SX(<(E[9Xn"T_Lp1N"`GtHd7@HVqJhHAJ.TKauU;o16C]aYSeB9"@;Ob23)AL.5B7k.kShgZm<`AW- %^4qhl.cLiF,ltLG3%)LF7EL+&XNEX+?R44<r@3uXU(V\N(d&`Zg-E0I$lHLE)N>4.;Bit*?D@7'b6/k]V&#^@%7QQi1'L*#TED!P %_@mK392HPCDDI1$!J[>)S,gbZ+TG7G84MYCTHlq,fn<lH6a.=4A[_qe_$MO.<KtW=,:!kS[\cokTE/At7Gr9&&QM4:ZtP?@(*L^' %j5Juo7]R0IMlT7:9u7)o:t$[n2pepB[&=W):4qu'DR@MH6%p_>N<IZ0Ta>1kXV9>_V>!6lE(GQ\("`Z'#:uP=#-mEebZ[Eb&2d"- %N7!3^FV6R%,"mS,.3iRU[K(rq-PA-S'5i>3+uPfbj&D`U*Hk(k:dCJDE!(F6Fhe9kBGr6q$]#X.@>q(@5\OpLhW>K\OPTdT14*`/ %ec"cUJ%s_GK===RZgcL^G9"V$.3a@)P=-!s>l`h:TOJZOA8tIf#VlR*]uE-fRf]dLUms#f!CWgkMPE`FSZ&6`e<&fPP#5`<,4k_T %6\`;h,p3<;,]6irlq%E16rFKb<`E6e)@a8/>&DodkW4&(";/'J+Hh[!;-$9=@%/Q!qBjl`/W@H+RK:C[_J(KpG`rMDF?r3(!*#qM %qH1O5nY3h_>=%Wc_nlao:"[<+Z@VU@N^f9>9ET's?n;=m$*5;5p,2+?^c'ngRJ&TE$^+Cq%B55`P2]IVNPlO>&VdP""YrCMFZ8"[ %J3"F1Q.Z@&T%Z0[U^dKtYTXMP)d7@=2Ca%dD)f8*P8X[;YH%d<70J(gN1EPUMV',*Nb6F?"tL4`9IKLo1(P1"UpXq]W[]jk,dmgU %Lko**X>7lT6:pSh1dGY<"57P[&jW"H8jnLElNM/0Oc\OD9d.G($J;_KU_qeh\oT-+Ym&?=64%I1d#BqY,nV9"L-i,LL]D3[l"FiF %6*t;R;/@d-l5?mSD,"DgMAiWu6A%h'2C'a^B>?Erfj8(L1=6SK+TH$,-AP%tY)UXA=_C'&P!Cqq4NTe*2@%A1/1ZgDKHCc`)A%l2 %0EDQGiBfu]QZZnZ,N+,na_XGCUbWlW!>=F<eI\1RH>EWRb[;trUQHgYZin6sJKF>2&Z#S5";%-V,&3o"1gi@@4QCO@U/0d9T#NWY %ABSG?Nj)EC[#cfR0%/BKYU5B67$IFs`t@E@^iKcbPq`N!!Zbf)-]:[5W<*\haBldZ`"mkM^'<`)/BV!4)YjGQBKRud=Gn`RCa?=I %M@nDdQu0FfMq8A_K*D=a8@mKKCW:b;btOTEScdUL,2rt*7R^MlF:3F))cXZ+*Uoe4[%UV+Q6AUV%E(%^1!?,b,E2i'-[An:J`(<p %FOS(/".Pg28SH$Xk0tNh;3M#pT\h"<6,BqdqB9G6BWe!KLi!35M&U^gNmRQ%$!BM6)Q`(ZR_Y"pe=eQh)q\:])iWj5aBHA3P*eT[ %bG^n5Rl5$!$)gQf?OY['9cg\KAfGX,d6c$M(=Q\hM#kt<kBZV#61U\(=>SZm.B#rqgW78tM't**+2o&mIkVen1-2hAZHVN<7d%'G %lN0/'+]:a?:G(Ml&3`A6)Er_lN'I^6!_EcqQ6n'k6),CcCN"ej--7<WL^=oKXYt^DbcDk1(G&<r"("r`LH4JtPBAN.9ZM]mbIf5. %,$W!g^i3uKU4gtB!</_cU4&(H8f*m*d06s/BEGN,RP]j=%/)7Q>Vu#Um;9Y#!\ZU:%`NC!D/Dh<Zn5O>,dHaK='(lPFiC*eACL^_ %WIT-e"`;$dS7+"%bX>0c+V%4&KI+\@`FoAR_K]-.o4WM6>U[+i@#3"GM!/6`/AQEO,n(Y8P32gg%[r_/,E0#bF->3aU2"cPgQQp? %P,>!%%nZjl+i_;U";'33@,5K+]`oAV["KVagOS`=c(Wd?PhE-=e+b6q#JUiO>Z)<S8Z9O88<icKE0eS%9Wq)s)rm=LNghXEkXq:6 %0EX?]g,PMS5Xk:MAqttg*iXbO=^V6E*4@E'/^$7l"(-`%,X,u'GT(L:ICO6d7FKO8QI.d\&b@u?/Fq"CP@RBGB$iW,E<2skk[7?i %FXXX(.bb7Z1R,sos7;aOD7FkN+rRs]&-IuH=\MB.S4[B;!^U=$Ki2%g$m7Nr7uIT;"kZja>RcM*7>nB`oS[Z(,Z/eh"L]KZg;:,q %Qt4q,h?N\)mdL;]&]C69]%YrGcADF[GfX\e!=2#N#@WQQOu:]"!O`f\MA9Y52_)/CAJnMMq?k^[)%%ilHc69!adaPYD6S+9`]uBG %,gUU%-d^"L*[+^[+6[d:L6ja90SM1d-(oZ9iKccWoACqCpum+K7N::?(lMHQA,-JN(WNpPVutfVV/,-nK#NTG%^p'qEZY%A@*]2< %$1L"%>/7,'W(!"_ejB:9V"\9g4H!5?lRuWR(c$mk^of-ne,kr(8=lrd#\Zh-)io(kTUuVm`>7q["DUe1.prb+2\tKd3.\"'@-=9* %Htf1?\_%*M4j42/1(94Z&==u,/\m/T[=GBTdTAP+nH3T+fFD=q4BOcKGsnTP@I9d9YZ3\lKdmGg0.?s\j_u?qLfCV'C8i(&RV9(u %$e1h)q`raZKf(PM"tc90479?[BBVEuD#&\&d=c34&m.R'<#f%;fETnW9HbTqJS?:#,>K^.>n@/?/X'=o*X`mY3^Y.=#MB4CLM<R" %&`"S<:oOPe5SZ"AU*9iC?:9!0@$6/]SA<:p#caiY7:pF6#R+GJc]OVYLf#:Gr"0:iJrq/]!kegA,U#'"k(L5Eahb$4<misDJV=KE %@=2fP_kCt%Tu_o&(,H4b5tjSaN>q-lbUoCZX!<]PZ>@?Tj(WI=OdPf7`YC*kAmm-V8U!Y4i5P1TRjcYG8F\D^>u6@,^d1j8$Y+^R %OW$`p=P+VO#!.>5U*(YqKUd2O_P<TZ/Bu9`JVqZl;aALSk![*g!u+QCR+Ol=8-0HsGQ_O_MuQ<b'-JA<Ofmt34/a9#*!l_E5or>h %Qo+l%?iuuLJ.dL.OEtH%r?AhrP"mjR)mO5/NXD.DfSdVb'S8YhPBA*,$t<C,TYP/)NWE9UbT+S=ZlkR)TikfE!L+V0X"@#*Lge,' %S$jG[24=Xp@5sBCHkk0;P5k[O(UY6mm&'-r.(HFdK7R3ZJPS)=lS9>3c8JYpN#?_sB*V'BC/Q5m;)&JK7Fd7A=S0uJP2dT4A8>7U %(*kS)NhD`d`&DL3`!O;Jgh'Y;C&\sR2VC-S@.:j[d1?^,P&-isQ]RS5i")%sR.)j^),KUDG#66)P]5a.m6HCkJb);5!hQaW\*>1) %)8j_1iSQ+)"n`!eB,3>QV35S,/E_7'rH+:\\nYru05:T7X>k#PSR^UlRqW($P&+6/.^M]#kbK)dY-8\kc'fl/.F;%oi,$:s3/?N: %JC>Yj]]<nHLn>7_<-XGAl.@'>A@h[OIdl.=35ba"T54TV3/jTZ.CP#Zr>!=tO<eQCTX"Y.S,GQ9Qf-?A,p3b]C%!qud;dPO,41]k %I'*"^G.>]]CSr2u$u@RYgh@rgWZ&4+5<WlE&LbXM_Cm!h&7i3p0h'$CFU;fDK$m>@iF*oZ3F2R_<65HhCg%=$3Mr6\R;.a@e=8Lq %jTJ=6ZlJ)^WT@)XbE;&JdW3dGQ:"#hP*Y.K[@A"-bI%a1-TIq3lq8?&M"+H0fr(Vo</fiD"CdccAc`<ASM[I)LX^"]#m+%d,)27W %C]WXL[h"B0<Mm+Tl1YGoP>#c0Z:;'[APH4:e$9Hn=S&!9YZ;LV"9_&Q$,UdZO5rl`CH@"Ok7_#QG(V<>(/6TD5hN,JSC:t$[/&(c %-<C@Ur<6^9:;S"ZGcE)GA79/<Gq-C!p,JG7'&!p!&e`p$cm"U%K;=&V"+/8m'ImL^9ug"6OJk.E89Ena6H$Yu_&%RbG`G);9pPP* %,$Fs`&d,]W;2N-)i-6KBkQHl4>R;qc:>CB0`j'b*9BH\,Q^AWK!OQG](24j/=QkZbWBat"c!X'V_e:V78/+_4@&,3n'%)F^82_&0 %8/N'(D(Q/tQp>,gI1fq0&KS=-Rm?lo2jeXpX<Mr"ZRnhSNN(\ddn!:^)$u6>[5$KuB@VJj#<k;q!H[(A:b-2n/2JXLU?i.ce/aa2 %-kfRrecoAn"Qg<m&tUI2F'Ns(4NE0H,:;N^kk*a3;N;-fgm-pZOlFg[8T@$;'5Y\#Nq6+cM2EYefV2i6`J>$T*7:79\eZ#BVMaS. %c!Y48Hcie6nL1*9Kb!M?TH,G9hD<GP#qgHj;kl6FVZTgajPcRHSN.pJnN[<1TF6>`D!.4X^nVC!Z9\Ip$AXE1+T*Jl&=OFVUBRH3 %3bEQ3##J3_.lDhe;?)^r!-5pbcUbX0#[g(!<7G?@qB25YP!fUg8C50U[:up3=VLp56J!nX0[kW!0fU2o&TLYV'c@&h,u^h)BUfLh %_GuHSEMsR9`U-5BXH@IH3\VjH-0E0)QIULu"X$\l:ILrd)U,T#NNrJL1-cPqSH2'F*4'1+k[PJQRSCRp#)2r1(T7>p1-6eiaU/md %+N_nePpLHRe:rbEZk9*)=UK4b:8dKC:X*)e:<fKIo@+a7k<(WR`_XkPE2VhMpSk^cI;8cGF_YfugfW,0!#lAh9_uR`J3#bS=4t\4 %CBMTdo.!^7@EMb>HWn@tP(`*8lqTe]d3%e=e1bbY2iB[8.]H#K]qU.1/\6Oh>RCdGp)_Ya_#n(QZg8=_-aFDJ#LFNh?:5Q"D5r_7 %0V9nYel\4D.WDRB&I7]`Ab?$cagp?"K^)7_@;TLW6D'iP66i<fG&R\-Bpt0ELI[aP.;Mf0J\NXg8u=&q:.Nd(A)%O##s>2Fk4(V@ %F$'NDF)(rS'^QO"#uqQ*/6gA(2'+gtH$giF%UodY,KJXp.)]"%7rP,Q:5A)0.T@S@l)c^aHE4VQDcoCmW70MCLShZGU$8K<TrGk* %mSj!93Y3Vg$_&gS>[s00&rU<&cO86uRn6FeJ]S;$75O:1dOpPj#'?reOr9K%P8U_=aUIa!faJ5$2jV]RKR?)Mlr7-7N[P;*`5;1I %`!k7*69HZBi;<bcF')a,$`e7e1Nj*%'NOa\Tm2;qE$7=I5cfTB4I%;/b2*?(,T6njF=uKmN(c?E*(]<LAaj*a4ii&nB[b2#>>bah %MJM7AW't%l*::Uq6<QZE4b=)'<g(Bop8PaB/7.9PYHSJ?+<XZsD5+%tB;Gs8")+GD<>Geecj7QJOm,@C(K!4"qY1C<f]*t@L='U$ %(F\*,Oc2YA(8CO15C%s^]Y[h8e8e:m$cr=k"0pS8d$kD8`kj*1Omt+u/M\B*)%Y?/@lhTMGj)%@nHohe#EcYc9jRiL=3Sf;YVdL$ %)@qsU"k$@,c:;M>$AAXC<Ag#K6pW(\jjP)sOfq\oE=&r=n\bbjK`j.7k]"a"^bCQI>UrtiJ>,PAYXVJFMRVUM<S[pO!>oec5e!K- %`aW*JPffsr`Z"&;O]""^NicSc6lS;JrkR0n-&Jin('X$6lr5?a:o0APd@4O_WN;Hi&)tCC6REQs[8+P:IgXL%l%!)P?mf_/>==#n %=cTj02J?4@,@RGXB#YRBpE_(7"ckT"6Q50o^eQh6F>YMe6&B1\ZN2Le7[?2@J;>$H!`>[*14UlJ*0CDji=GW(35g'sNL1lU8sEFQ %M*U`'jO58HP+d\Km(?0uFDE'.!g;,&gD-uE")/Ha@oWt+5^4%qU8Gc2)*T=QYY^q8-r;$JRq&?],l)HAS/H4.Qu>HV?\s.d,W"70 %O>\.t)\:&9"n'CJHfH87cT'm.0QAZ#kR:'-M.'LV?qh8tSJ#iH"H3MWJ7C5N>L@RSi<<4H_/E-Q3iAED/93;gmSZGV36!#$4&A79 %%)0qc0gm?]n'E=GZn!+=,XF=L@?;=O&M,#i'aTuK3-T"d=tj\.RPZ6X&`XiJ?GRDJQWUC1a+D8O60>FCZtHVs.?f\]ORsI6BjIqn %hsoou7u.TVEJgJOKRuOtm;C@Z;8A>@;0^([n1[]o"bXlQ+G_sFV0EHXaYY'[&pEJPiQ8ccGpkqaNW>;)H+0P#I8L0.T^iT3N8Ya! %#[87&OT\T$ZD%giE0X!7C-4L-!h,Yoc%@$gg/f^m77I<86QK+7WJ0[[OGCJG)Q"EE`upCeN?_/VD3S4X8T3gKinu@>>em]goU0Y) %*7Z4k.0@IC6n1V^P>'*Mi_WkeL@'[lC8t)BFP4Ye(sGifdEXD<(!SNfNTG1gE)bp.L/E(Cgu;GQ*j,Le?f%`U!X`A@.8UMU.$0-0 %"\`D_aoi_n:OLD-*N`2.`8#,Ldo(:f$Src?FD5\k-jP$[AZ-Lc%[Xt+Z?:?1J,rSH=Va3A-ipl>4D6e7-P`bhqBm%.VGeAN&1*sT %L_t'o$VKD)(lGV=1a0/^-l-41pm]-97SF<9>a=DWiJAXGa:t&L!ue[1/)4UUp8C9%<_/!X-H!QN;14.mAfUVG'G\OiG_?PiieuhO %8?YSGGWaG*k37h`(-Nk?[>9#,c5i_P$K[6Pr5O>??D0`XB8)PX!2G'5MZU6Ld#'.!aJL&;E<4&]U1E=2#ms,J,pSUM^qbIg+a"?. %/-Cc>5me[$$->W4Jf7#cm"L$1+;fBmbY:r*C\,[E+K6\t-EunLC3ZUEfq^O"L:i7p/N+Zj6UiOiZ'r<LH>".WLQ?:'kEO\"Q.;[D %TM$)'q3=XMK@m'*Z6lrC.?W4u@jP7rM_%b3*/3H1_fl39;+[?1ZDaUQq*H'U+48t2fONi8U<oo1*7Gqo*"Rh9A#@5dG\FK#@0J8= %P<H9%C_8)RLpBN?Sq-Q;iA<)),=+a60;Ak8P!(iAmq?<(fT\O:I#UN)==mKNW>JsY(P+k?m=L(tUp>#K=YpUlE+m(dBk*!.==Jot %"$nD7bQu%^)o0:9>I4cLM+%Y'@`hQ$&UbB'<t!qu;P.-'ZW_2[Es-i\6o28C7QbinRH@ekk)<_XRlf2(UU>*1C^Z&..3B9X+j\<* %&R+:TN#b2Clh20.+j9.Q(lba3'uQHf.$0Gf].=nVXrPE4#geanV'm#k#@Squ4Gu^1A%7m>c\ds!-"o1=%:cXWfs!7_#("K+B!Y2d %KpK][ma:01/<,?@^F1#C$=,@=RQ&[PJ;+#1CM/jc0F1)*'BBYVA/WM!fYFpn]!Bg[HN9icX&<M1Ng3qcoA2_I'/-uA"GHRi%j*q# %fM+J6D"Z/d:'u8";.AQA5(lbP(o<OE<C*UU`RY_=Z$3MU$85b(+ioWC,\ZO-7j74L_SiTC^qm]NVs89ZF.ig7.\VqfB\TtU&6^qq %;OL"'M+&0mjIO``ip6D0P6L\=5c+>-\rCD/g'6n9)"hU:;4e.6Pt@:hLLGTB^L.d%2Mi;/?'cN'Y66,7(j'8fqe%<p,kTe#3Y-Kn %#AlHcSV:;DBcc>@2)eN>9il*3]>nX[B^R,8h8-sA6G$[H31/'-2Guit^_&Pti2#'j9CY?RJ_'s05PY_kI><pgc+GRQm<GkO,(NK! %RLCQ/>?Z8X\VGj%cl;e>q?!a&:g03\:;@.qQ/(!955^JbGd$B(n>o^a>c&$<W,k/_'5MS]DbL$+9$:YU``kLDBq!Y`VJl:n3%jI, %c:a<Ejr[\N91aRn?!^kJ^ZMkOa8~> %AI9_PrivateDataEnd \ No newline at end of file diff --git a/testopia/img/aw.gif b/testopia/img/aw.gif new file mode 100755 index 0000000000000000000000000000000000000000..ba6b1a5b844a25532daeaebbbf1da3ba4181c0a4 GIT binary patch literal 771 zcmV+e1N{6)Nk%w1VHp4y0OkMy001G}ylUQJ5X>_GcwI@Xj91agg6W=0NI*RQ=Yj8x zDZjdU?X{pYGc)X_fcfX&=z}eZf@%KNao%<>^tfC9%x3h@zZDTIhIw1lN)7kcbmWab z|M-$uO-l8<Qoo~U;A<ZA?T+fvewdSR;e=oj4=DD<T<@w(?2|88R8#fEp#R}}#J6}= zOGcuIT<x7c>~jF&gE@R^Od}vVzLQx(Iy(RWDc*5F<#Zm`#(1QaX!poxi*i%;zhUvV zkZNF8(mw$I?uh@>ZRfvi$ERNMwNdDcFY%l&N=HzUiDl)CVE^88*;o+Hwr%aFO9cff zVo^Z<|Ct>aEC1wv_uYItFgg0%zwe_y$eLRJ>xJcmFAWSX^09#B#A~#dVCH)z?b3Eh zJU->AQFUol?2kM0r8x))A)JL_nVDu&P)(woa=x2i-*_+YoJmztQP4a9<A*usltuTu zT=>hN>62jau7LQ>Yu?3c_q9^(#A%FsTHI_V9U3nW4lV!yGynhpA^8La6aaq!EC2ui z02u%m000O7fPaF6gmW;5R)mU+iV8<%M{SIgg-0e+9!H6klL}W^Q7c!HoQo<bCQ+&$ zD4V5&5TB}{S7fh)T&T0EMJOt_4>&JiAsieFGZ-%rw{<8*YDfkgBTs2!zNNu08cACz z5o&H|8q1}1MkiTGKS6$5EI~mhMn06=8d*6y7=2GOIkMP!f#bm>I_VN9%weMhh95c< zIx*sa(E|Z->`d7>20#@NNybo_vLg-%gNl@Bak8Ri6FxOsi0FVoLrW)GDiV6YWW$an zKxuYq@S#AJE<k&1I7vvQ6QE0)lnAgyMvX2X&PdpLK#P(=JU8^%DxpJ*tuD3@kr2R3 z7#DJ2HZVbXgUtaUcx6b*BV<SoD0cc*0dRrG0XAPP0D(gRuaGrs@D>O|1g{+ePYB1I zd*cloIXyy)?tz8I=pIm{5a<zS4+#=)GE9g;ySDAywI^g?@Q1;G-@t<lAI>`v06RB! BTq*zn literal 0 HcmV?d00001 diff --git a/testopia/img/awg.gif b/testopia/img/awg.gif new file mode 100755 index 0000000000000000000000000000000000000000..10768b984016c572cfa14b1f7798c038c0e89c5d GIT binary patch literal 377 zcmZ?wbhEHblw=TRIKsdX5)yLs=+UiPx2|2gwxy-z-o1NiX=%@%J)1dm=Cy0r-o1Ob zckf=HNL5wUnKNg;e*L<1>C)cb-l(Xk($doZ|Nk=(0*XIbSVb5_7<51iL3T2*ep68G zd$Ms3*UEKS3VZmpr#l5K`20rBU-8J!s|&wr=&`I+czHtm7t^VW!H!Ff7WXGVawzpt zXmY($-lZbK<oTqO!!E9~v1&tv`k{ln9~d~usIc*|J2SBw=QBl@3$O_ZNAv0P8%?Zk z<`fbV;FwmR(-Gaw!63|9%gR1=vKAlnw3TeUEUbdOtlQ_Q@G~>>ZQsJnDeQi5JL9_5 zN^4t>3GL(H<vYHgX|M8bX0z>ro0kc3vrc5Wxo7opX3p&#Y%lqE(^wBNunFujthveg zOZ^u!FZVAYg$V}l?=%<l32FIoBr7s9b3}cebYk_Qqumnh5=K)uK6Z6hWMHrc0Bb&m A$^ZZW literal 0 HcmV?d00001 diff --git a/testopia/img/circle.gif b/testopia/img/circle.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8f314a8205914bb9e640a4ce7baa3738dd0f8c4 GIT binary patch literal 342 zcmZ?wbhEHb6k-r!SZcw*zz|qe^j|>W76ZfbfPk+{mi#v`XxGxZVsHOz!GdE947L0B z|2H=N&cJYH=FI;L3|o78{$INWWb`mFq*+<rH!xT%FaIhn?SD(lKV#!FLPAFuEVw5i zu*AUNh^Oa228NlOoR^J_X95*7G3||v{Ih1we^1Yk8XBLnv%gA6+^?(q&(3~^fnfs! zLyWQU|9kiT3ku#~U}&_ldBVU@AR+NIIQYMc$~zX8qyKRL#h)yUA`JEnI?N2r3_L){ zz*c-<zCqK<N<Hp{n-~tV=$W!OMrs+(muqwV)@`wh?<#Ae@ES9Lj>QL5<|b@+Zx;zj zG|=dJW+-7}qtd9xE+f<?#4Iky!K2A<C@gGjEXvKJZlcZ1r90P{(_YO)L0Ntd&<ZaR WbDd=qS9#e>%jz&IE^u;Wum%7iI)qaI literal 0 HcmV?d00001 diff --git a/testopia/img/circle.png b/testopia/img/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..6de8ee0c26adbb148bc414f0935226424881f7ba GIT binary patch literal 29717 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 C@ozBz literal 0 HcmV?d00001 diff --git a/testopia/img/city.eps b/testopia/img/city.eps new file mode 100644 index 0000000..d36c86c --- /dev/null +++ b/testopia/img/city.eps @@ -0,0 +1,64 @@ +%!PS-Adobe-3.1 EPSF-3.0 %ADO_DSC_Encoding: MacOS Roman %%Title: city.eps %%Creator: Adobe Illustrator(R) 12 %%AI8_CreatorVersion: 12.0.1 %AI9_PrintingDataBegin %%For: Todd Purser %%CreationDate: 5/22/06 %%BoundingBox: 0 0 589 727 %%HiResBoundingBox: 0 0 588.2227 726.5215 %%CropBox: 0 0 588.2227 726.5215 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 %%+ procset Adobe_CoolType_Utility_T42 1.0 0 %%+ procset Adobe_CoolType_Utility_MAKEOCF 1.19 0 %%+ procset Adobe_CoolType_Core 2.23 0 %%+ procset Adobe_AGM_Core 2.0 0 %%+ procset Adobe_AGM_Utils 1.0 0 %%DocumentFonts: %%DocumentNeededFonts: %%DocumentNeededFeatures: %%DocumentSuppliedFeatures: %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %ADO_BuildNumber: Adobe Illustrator(R) 12.0.1 x5205 R agm 4.3861 ct 5.530 %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 104 128 8 %%BeginData: 18942 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD1AFF7D275228532752A8FD5FFF522E855A855A29292E52FD5DFF %52538584857E855329295352FD5BFFA828855A855A855A852929062F7DFD %5AFF27858485848584858454292F2952FD5AFF287E855A857E855A852F29 %282928CAFD59FF278584857E8584857E5A292929537DFD59FF285A855A85 %5A855A8554292929287DFD59FF2785848584858485847E292F292F52FD59 %FF275A857E855A857E85542929292852FD59FF52857E8584857E85848529 %2F292927FD59FF525A855A855A855A855A2906292952FD59FF527E848584 %8584858485292F292F27FD59FF7D52855A857E855A857E2928292928FD59 %FF7D5984857E8584857E852F29292F28FD5AFF27855A855A855A855A2F29 %290628FD5AFF5284858485848584852F2F292F28FD58FF7D7D27857E855A %857E855A532929282EA17DFD54FFA827592F537E8584857E8584852F2F29 %292E592F2E52FD52FF27855A8529855A855A855A855A5406292F855A5A29 %287DFD50FF7D53848584548485848584858485532F29858485842F2952FD %50FF7D52855A852F855A857E855A857E5428297E855A85292927FD50FFA8 %5284857E5A7E857E8584857E855A29298584857E54292EFD51FF27855A85 %545A5A855A855A855A5A29295A855A85292927FD51FF528485847E5A8584 %85848584855A2F2985848584542952FD51FF27857E855A5A7E855A857E85 %5A5A29295A857E85292928FD50FF7D277E858485538584857E8584855A2F %297E7E858453295352FD4EFF522729855A855A545A855A855A855A850629 %5A855A852F292E2FF8FD4DFF277E5A848584852F85848584858485842F29 %7E8485845A298553537DFD4CFF27857E5A5A857E545A857E855A857E8528 %295A855A852F545A5A297DFD4CFF527E855A857E8554857E8584857E8584 %2F295A84857E5A53855A537DFD4CFF52595A5A5A855A545A855A855A855A %8529292F855A852F2F5A5A287DFD1AFF7D27FFFF277DFFA827FFFF5252FF %A827FFFF5252FD1EFF7D53855485848554858485848584858454295A8485 %845A2F855A537DFD19FF522727FF2727A87DF827FF27F87D7D2727FF27F8 %7DFD1EFFA82E5A5A7E855A5A5A855A857E855A8529292F857E852F537E5A %287DFD18FF52F8F852F827F852F8272727F8F852F8F827F827F8CAFD1FFF %2785548584855A7E84857E8584857E5429547E85845A29855A2F27FD17FF %27272827F82759F8F87D27F8277DF8275327F8275327FD20FF275A5A5A85 %5A8553855A855A855A852F2929855A855A2F5A5A2952FD16FF21000629F8 %275A59F87E5A2727852E275A85F8285A52F8FD20FF27855A858485845A84 %8584858485845A29548485847E2F855A2F27FD14FFA80027282F29275385 %2E278485F87E8452278584277E852752FD20FF527E845A857E852F857E85 %5A857E852F2929855A855A2F5A5A2952FD13FF7DF82729292829F8855A2E %27855AF87E85272E7E59F8857E2752FD20FF2785847E7E8584547E858485 %7E85845A295484857E7E2F855A2F52FD12FF77F828292F29292905848527 %528459F8858427528552277E85F8A8FD20FF7D538554855A852F855A855A %855A855A2929855A8554295A5A0652FD11FF52F828292906292928F8855A %272E8552275A85F8595A2E27855AF8FD21FF7D59845A8485845A84858485 %8485847E292F8485847E2985842F52FD10FF27F82F292F292F292F282784 %85F8598452278584F884852752845927FD21FFCA278554855A852F855A85 %7E855A855A2928857E855A297E852852FD0EFFA827F82928292929282929 %2800857EF85A8527285A59F8855A2752852727FD22FF2E7E5A84857E5A84 %857E8584857E8529297E8584852985842927FD0DFF7D27002F2929292F29 %29292F27287E84F8857E2753852E278485F884842727FD22FF278553855A %85547E5A855A855A855A2929855A855A295A852952FD0CFF7DF800290629 %292906292929062727852E275A85F8595A28278553F85A85F87DFD22FF52 %847E8485847E5A85848584858485292F7E8584852985842F27FD0CFF7D27 %2F292F292F292F292F292F0053845927858427848527538453278584F8A8 %FD22FF27855A857E855A5A7E855A857E855A29295A5A857E295A852952FD %0CFF7C272929282929292829292928275285272E7E5AF8857E2752852727 %5A59F8FD1FFFA85252A85284855A858485538584857E858485292F5A857E %8529857E2F52FD0CFF7DF82F2929292F2929292F2929F87E842827855327 %7E85F8847E272E852E27FD1EFF7DFD05F8595A5A5A855A545A855A855A85 %5A2F065A5A855A295A850652FD0CFF52050629292906292929062929F85A %85F8525A52278553F85A85F8595A2827FD1EFFF827F8F8272727855A8584 %8553858485848584852F2F5A858485297E842F28FD0CFF52272F292F292F %292F292F292FF8858427538527528459278584277E85277DFD1DFF7D2727 %F8F8272EF8595A5A857E545A857E855A857E2F285A7E855A535A85282EFD %0CFF27272829292928292929282928275A85F87E5A272E8527277E5AF885 %7E057DFD05FF7D7DFD16FF7D5252F805F8F8F8525A857E8554857E858485 %7E855329538584852853522827522752275252597DFD04FF522729292F29 %29292F2929292827857E0584850059842E278553277E84F8FF7D52272700 %2E2727F82752FD12FF7D517DFD05F8275A5A855A545A855A855A855A5429 %542E2E2752F827F827F827F827F827F827F82752A8272729290629292906 %29292900275A53F8855AF85A85F8525A2E27852E27F8272E7E5A855A855A %85532EF87DFD11FF27FF2727F8F8F8525A85848554858485848584855452 %522752FF8427F827F82727522727F827F827F827F827272F292F292F292F %292F2928278553278484F8858427538527528427277D5A59275227272752 %28598484F87DFD10FF5252FF27F82727285A7E855A5A5A855A857E855927 %52FFF82752525259597E59857E7E597E53532727F827F827282928292929 %2829292900527E28278552275A85F8855A2752272752FD0CF82759F8A8FD %10FF2752FFA827F8845A8584855A7E84857E85595227537D52598484857E %8584857E8584857E8584857E7E5227F8272829292F2929292F2927528527 %2E7E53278553278485F82E2727F805F8F8F805F8F8F805F8F8F805F82727 %FD11FF5228292852528554855A8554855A855A275252287E5A855A595252 %FD0727522E595A855A855952F8272829062929290629F8535A272885272E %5A53F88559FD14F827FD08FFA8A8FD07FF7D2F292F5359847E8485845A84 %858484F8525385845928525927F827F827F827F827F827F82727597E8584 %59F852292F292F292F29F88485275984282E8527528459F827F8F8F827F8 %F8F827F8F8F827F8F8F827F8F827FD07FF27F8F820CAFD05FF7D29292853 %278553857E852F857E855227538552522727FFFFF827F827F8272727F827 %F827F827F8272E7E5A522729282929292829F8855AF85985F8597E272785 %2727F8F8F826F8272752275227522727FD05F852FD06FF7D27F8F85227FD %05FF532F29292852845A7E85845A7E85847D52842852FF52F87D5259537E %598484857E7E597D52522727F827277E59532929292F292928278485F885 %8427538527597E2727F8F82752FD0BFF5227F827FD07FF2752F8F8272752 %FD04FF5306292929278553855A852F855A855A592752F87D27595A855A85 %5A855A855A855A855A855A7E5352F827F87E2829292906292928F88553F8 %5A85F8855AF85985F859F87DFD04FF7E545A2929FD05FF5226A8FD07FF7D %7D27F827F84BFD04FF532F292F2952847E8485845A848584852E52595259 %858485597D5252275227522752525353858485847E27272753292F292F29 %2F27278459278559278484F88584277E27A8FFFFFF7E535A85292F53FD04 %FF4B27FD08FF7D5252F8F8F820FD04FF532829292928855A855A852F855A %857E27F8597E8553522752F827F827F827F827F827F827F85252855A8428 %272829292928292927278527275A59F88552277E5AF885272752FFA8292F %8554292829A8CA522727FD0AFF27FF76272752FD04FF5329292F2929537F %84857E5A84857E8527537E7E2E52F8A8FF27F827F82727522727F827F827 %F82727537E852729292F2929292F272E7E522785272E8452278553277E59 %F827F82F29855A53282929282752A8FD0BFFA8F87D52F87DFD04FF532929 %0629292E5A5A5A8554855A855A525A53F8A8522752532E59597E5A855A84 %597E52532827F827F827595329290629292906272E8505525A2727852728 %5A2E27852727FF5406547E522727282929FD10FF282F2EFD05FF282F292F %292F297E5A85847E5A858485525952275952528484858485848584858485 %848584857E7D2E27F82E592F292F292F292F005984275385275984272E85 %2752845252A9295384AFFFFF27522953FD08FF52F8277DFD04FF2F29297E %FFFFFF7E2F2929282929292E5A7E855A5A7E855A59F87D27597E855A8452 %5227282727272827522E7D7E855A855327F85229292829292928F85985F8 %597E275285F8535A275285F87D29297E85FFFFFF27522928FD08FF270527 %27A8FFFFFF282F2953FFFFFF7E292F2929292F2953548584855385848528 %27527E7E7E52525227F827F827F827F827F827F827287D7E857E28272F29 %29292F2929F88584F87E85F8857E057E85F88484F87E2F53AF84FFFFFF27 %7D2F29FD08FF52F8F8F827FFFFFF29062928FFFFFF532906292929062929 %535A855A545A855A5227845A52272752FF2727F82705272727F827F827F8 %27F8275285592706292929062928F85A7EF88553F85A5AF88559F85A7EF8 %5306A87EAFFFFFFF27525329A8FD07FF2752F8F8F8FFFFFF282F292F53FF %FF7D292F292F292F292F2885848554858485527E592752A8F8525259537E %598484857E7E597D52522727F82752852E2F292F292F2928008553278459 %278553278459278552282954FF85FD04FFF87D532F7EFD07FF277D522727 %FFFFFF2928292953FFFF2829282929292829292953857E545A857E535952 %2752525359855A857E855A857E855A857E855A7E5227F8272E5228292929 %282928275A53F88528277E2E278527275A2E28297EA984FD04FFF8FF5329 %A8FD08FF27525252FFFFFF2829292F29A8FF532929292F2929292F29537E %8554857E85FD0552847E857E592E52272E2752272E2E5959857E857E5327 %275229292F2929292827852752842E2785272E7E272E85272F29FF84FD05 %FFF8FF2F2F7EFD09FF29287EFFFF7E292929062953A828522728272E2728 %275228595A5A5A855A7EF82753855A5227522727F827F827F827F827F827 %F82E53855A59F85229290629292900285A27278505525A275285F8595A27 %067EA985FD04FF5227FF5306A8FD09FF282F53FFFF7E292F292F29532852 %53848485848584845952277D54858485842759855252F852FF7DF827F827 %27522727F827F827F827277E8459282F292F292F29272E85275984275385 %F87D84277E85282FA9AF85FD04FF7D27FF2F2FA8FD09FF29282F7EFF7D29 %2929282F27595A85848584857E855A857E7E28527E855A852E7E2752FF27 %277D5259537E5A855A85597E53532727F827F8595A52292928292929F859 %7E275285F87E5AF87E5AF8852E292FFF84AFFD04FF2752FF5328FD0AFF28 %29297DFF7D292F2929287E8485A9FFFFFF7E8584857E858485535284857E %7D2E52277D527D7E8584857E8584857E8584857E8559532727F87E282F29 %29292F29275285F8857E058459F88553277E53297EFF85FD05FF5227FF29 %29FD0AFF2F292928A95329062929275A85A8A9FFFFA9855A855A855A855A %85277E5A852827525259855A855252FD07275252595A855A7E2727275306 %2929290629F8855AF85A53F8852E275A2E27840629A8A97EFD05FFF87DFF %2929FD0AFF282F292F535328532E52278585FF84FFFFFF84858485848584 %85845959858452F859848553525252F827F827F827F827F827F827527E84 %855227292F292F292F29F8845905855227845227852752542F53FF85AFFD %05FF277DA9292FFD0AFF2F292928532752537E59525985FF85FFFFFF855A %857E855A857E85527D7E8527527E59272727FF5327F82727282727F827F8 %27F827F8525A842729282929292828F88552277E282785272E5A27522F28 %7EFF85A9FD05FFF8FF7E2929FD0AFF282F2953278484A9A98559597EFF85 %FFFFFF85857E8584857E85847E528584525A59F8FF27275253537E59847E %85847E597D5252F827F827597D2929292F29292827842E2785272E7E2753 %85F87E2929A8FF84FD05FF7D27FF7E2954FD0AFF290629277E84A9FFFF84 %7E2E8584A9A9FFFFA95A855A855A855A8559535A85525327277D5253845A %855A855A855A855A855A855A592827F8275329292906292928F88527285A %275285F87E59F82F2928FF84A9FD05FF52F8FF532929FD09FFA829532852 %7EAF85FFFFAF845284AFA9FFFFFFA98584858485848584842E858459277D %277D8485847D52522752275227525259598584855952F852292F292F292F %275284275285F87D5A27845927542953FFA9A9FD05FF2752FF54297EFD09 %FF52272853285984AFFFFFA885278584AFA8FFFFFF7E855A857E855A857E %2E5A852E272E847E5927525227F827F827F827F827F82727525A857E2E27 %292929282929272785F8535AF87E53F8852727282952FF5AFD06FF2752FF %292953FD08FF52527EA9A97E5285A9FFFFFF7E527E85A9A9FFFFA9858485 %7E8584857E8527857E5927845A522827FFA8F827F827272E2727F827F827 %F82752855928292F2929292F00537E275959F8852E277E272829297DAF85 %FD06FFF87DFF2F29A9FD08FF285AAFFFFF7E275AFF84FFFF852E7D5AFF7E %FFFFFF5A855A855A855A855A275A85525959277D7DF87D2E53537E59855A %85597E52522727F827278528290629292906275285F88552275A2E2785F8 %2F2928FFA984FD05FF7DF8FFA80629A8FD08FF527EAFFFFFAF2885A9AFFF %FF847E5285A9A9FFFFFFA984858485848584852885847D5952277D527D7E %858485848584858485848584855952F8275253292F292F292FF87E532784 %52278527538427292F27FF85AFFD05FF7DF8FF7E2F29FD09FF7D52AFA9FF %A85359A984FFFFA95A527EA984FFFFFF84857E855A857E855A525A855AFD %0452847E8553522827272827272752527E5A857E5927272E292829292928 %F87E53F88527285A27525AF8292927AF85A9FD05FF2727FF54282FFD0AFF %2E84AFFFFF595985AFAFFFA985278585AFA9FFFFAF7E8584857E85848552 %7E84852752598559522E7DF827F827F827F827F827F8275285847E275229 %29292F2929F8852E277E275285F8855328292F52FF84FD06FF2727FF5329 %2FFD0AFF2784A8FFFF842785A9AFFFFF5A285A85A9A9FFFFA8855A855A85 %5A855A5359855A2752852852F8A8FF27F8FD0527F827F827F827F8595A59 %27292929062928275A2E2785F85953F85A2E2829287D8485FD06FFF87DFF %292953FD0AFF7D59FFAFFF842884FFA9FFFF85527E84FF84FFFFFF848584 %8584858485535984855284277D84275253527E59848485847E597D5228F8 %27F8597E53292F292F292800852752842784592785272F2928A8A9A9FD05 %FFA8F8A8A9292F54FD0AFF7D52A8AFFFA9287EA9A9FFFF84595285A985FF %FFAF855A857E855A857E7E52857E5927FD04527E7E855A857E855A857E85 %5A857E592727F85928292929282900275A27527EF88527275A28292900FF %7EAFFD05FF7DF8FF7E2929A8FD0BFF27A9A9FFAF7D53AFA9FFFFAF7E527E %FF85FFFFFF84857E8584857E8559537E85522752527E857E7E5252275227 %2E275252595A85848552272753292F292929282785F87D53277E2E278527 %2F2927A985FD06FF2727FF54292FA9FD0BFF527EA9FFFF59527EAFA9FFA8 %85278584A9A9FFFF855A855A855A855A8527855A52F8535A842E27F827F8 %27F827F827F827F82727535A855227292906292929F8525AF85A520585F8 %595929062927A97EFD06FF2727FF292906FD0CFF537DA9FFFFA92785FFAF %FFFF845284AFA9FFFFFF8585848584858485845284852E52847D2727F827 %F827F827F827F827F827F827F85259852E2F292F292F2927537EF8852752 %84275953292F287D84AFFD06FFF87DFF2F2954FD0CFFA82EA9A8FFA8525A %AF84FFFF85527E84FFA8FFFFAF7E855A857E855A8527855A525953F827F8 %27F827F827F827F827F827F827F827F8275959292928292929F85952275A %272785F885282928287D85A8FD05FFA1F87DA9292953FD0DFF53A9AFFFFF %5984A9AFFFFF84847DA9FFAFFFFFA9A985A984A985A9845985A9537E2852 %27522852275228522752285227522852275228527D5453542F5453277E7D %27A9277E59278453535427FF85FD06FF7D27FF7E54537EFD74FFFD045227 %525252275252522752525227525252275252522752525227525252275252 %522752525227525252275252522752525227525252275252522752525227 %5252522752525227525252275252522752525227525252275252527DFD0A %FF20FD5DF852FD08FF7D05F8F8F805F8F8F805F8F8F805F8F8F805F8F8F8 %05F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8 %F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F805F8F8F8 %05F8F8F805F8F8F805F8F8F805F827FD08FF7DFD5FF8FD09FF27F8F852A8 %7DA87DA87DA87DA8A82752A87DA87DA87DA8A852F8F8F87D7DA85227F827 %7DA87DA87DA87DA87DA87EF8F82752A87DA87D52F827F8F852A87DA87DA8 %7D7D2727F8F8F87D7DA8A852F8F8F82752A87DA87D27F827F8F8F827F852 %FD09FF27F8F87D53292929282929292829537DFD0429282929295AF827FF %532F29295353F8FF2829292928292929285A00277D7E29292829297E27F8 %F87DFD0429282929537E00F8F8A829295353F8F8767E54292928292F84FD %06F87DFD09FF7DF80527A9292F2929292F29292984527E292F2929292F29 %7EF8FF5329292F29292F27FF29292F2929292F29295327A854292F292929 %2F297EF8057D53292F2929292F292F5905F8A9292F5353F87D7E29292F29 %29292F5352F805F8F8F8FD0BFFF8F8F82E592E7E29290684525953277E29 %065A53592E595327A82929295A5A292959535259532F29295A59525927A9 %29292984532906292928F8A12929297E59530629297EF8515329067E2727 %A82929295A7E2929065353FD04F827FD0BFF2727F8F8F8274B7E292F5AF8 %F827F8FF292F532EF827F8F827A9292F5359F87D297EF8F8F87D532F2985 %F8F8F8525A2F297E52F8532F29545327FF2F295453F8522F292F7E27527E %292F7E27527E292F5A59F87E292F5359F827F8F87DFD0BFF7DFD06F8A829 %285427F8F8F87D2F282F52FD05F87E29295327F8527E5A27F8F8527E2929 %5AF8F8F8527E29295A27F87D28292959F8A929295352F8522829297EF87D %29292884F8A12929295AF8275329287E2EFD04F8FD0DFF27F805F8F8F87D %29292959F8F8F87D53292984F8F8F805F8FF292F2959F8050527F805F852 %532F297EF805F852532F297EF8057D29295453F87E2F295A27055229292F %7EF87D2F29535305A929295A53F8522F29297E27F8F8F852FD0DFF27FD05 %F84B54292959F8F8F8277E29295AFD05F87D2F06292FFD07F8277E06295A %F8F8F8277E06295AF8F87D2929295927A806295427F87D2929285AF8A906 %295352277E29295A27F87D0629295AFD04F87DFD0DFF7DF827F8F8F8277E %2F297EF8F8F827A82F297E05F8F827F852542F292F5327F8F8F827F8527E %2F2985F827F852542F297EF827532F29542E527E2F2985F8275A2F295459 %277E2F297E277D532F2985F827532F295A5327F8F8F8FD0FFF27FD05F8A8 %29292927F8F8F8A82929292EFD05F87DFD042952FD05F827A828295AF8F8 %F8277E28295AF8F87E29295352277E28295A52532F2929532E4B7E28295A %F87D2F292F5352522F28295A27F8F8F827FD0FFF27F8F805F8F85254292F %5305F8F852542929292F297EF80527A8292F29530005F8F8F8277E292985 %F8F8F85254292985F8F8532F295A277D5429292F2929292F2F85F87D5329 %2984F8A9292F2929292F29292984F8F8F8057DFD0FFF7DFD05F852532929 %7EF8F8F8525329292906295AF8F8F8275406292954FD05F8A8292953F8F8 %F8277E29295AF8F87E062953275253292906FD04298527F87D2F29535327 %7E2906292929062929532EFD04F8FD11FF27F827F8F8F8FF292F5427F8F8 %27A9292F297E5385F827F8F87D54292F297EF8F8F827A82F297E27F8F852 %5A2F2985F8F8542F297E057D532F297E5A845A7E05F8F8FF292F5352527E %29537E857E54292F5A52F8F8F852FD11FF27FD05F87D2F295327F8F8F8A8 %2929542E522E27F8F8F8277DFD042927F8F8F8FF29295327F8F8277E2929 %5AF8F87E28295A277D53295353270027F8F8F8277E29297E007D29292959 %F85228292984FD04F87DFD11FFA8F8F8F805F852532F2959F805F87D292F %2F52F805F8F8F805F84B5A2F29295A05F8F8A82F295A0505F852532F2984 %F80553292985F8A8292F5353F805F8F8F805277E292F84F8A82F297E2705 %7D29295459F8F805F8FD13FF27FD05F87E06295AF8F8F85254062953FD08 %F87D2929295AF8F8F87D06295327F8F8277E06295AF8F85329295AF87D29 %065A27FD06F8525329295A277E06295AF8F85429295352F8F8F84BFD13FF %27F8F827F8F8A82F297EF827F8277E2F2984F827F8F8F827F8F8F87E292F %5327F8F87D53297E2727F852542F2985F852532F2984F8FF292F5427F827 %F8F8F8277D5329545952532F2984F8522F2F2985F8F8F8277DFD13FFA7FD %05F87D2F29292EF8F8F8A928295AFD04F827535AF8F85329295327F8F87D %29295327F8F8277E28295AF8272F29295AF8A829287EFD07F8A82929532E %7653285353F85229292F59FD04F8FD15FF27F8F8F805277E292F59F8F805 %7D53295427F8F805F8A92953F87D292F2F52F8057D5329542EF8F8527E29 %297EF853292F2984F8A929297E05F8F8F805F8F8A82F297EF8FF29295452 %F87E292F5453F805F852FD15FF27FD05F8A829067EF8F8F8525329295927 %2827287D5329532929065A27F8F85229292952F8F8F8FF29292953292906 %5353277E29297EFD06F8277E06295A277E29297EF82753290684FD04F87D %FD15FFA8F8F8F827F87D292F5327F827277E292F292F292F5452A853292F %292F7E27F827525429542EF8F8277D7E292F292F29537E52277E292F5A27 %F8F8F827F852532F297E527E292F5A27522F29535AF8F827F8FD17FF27FD %04F8527E295A2EF8F827A85329532953297E2784A87E29535A59F8F8F852 %7E535359F8F8F82784A92F5329548484F8277E532959FD06F85254295A52 %7D53535359F87D29535359F8F8F852FD17FF2705F8F8F827A9AF857EF8F8 %F8A9A9AF85AFA9AF8553F85384AF8559F805F8F82EAFA9AF5305F8F8F827 %84AF85AF8552F80552AF85AF59F8F805F8F8F884A9AF855284AF85AF27F8 %84AFA9852705F8F87DFD17FFA8FD4FF8FD19FFA8F8F8F827F8F8F827F8F8 %F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827 %F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8F827F8F8 %F827F8F8F82727FD1BFFA727FD49F827FD1EFFA8FD477DFD7AFFFF %%EndData %%EndComments %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Utils 70 dict dup begin put /bdf { bind def } bind def /nd{ null def }bdf /xdf { exch def }bdf /ldf { load def }bdf /ddf { put }bdf /xddf { 3 -1 roll put }bdf /xpt { exch put }bdf /ndf { exch dup where{ pop pop pop }{ xdf }ifelse }def /cdndf { exch dup currentdict exch known{ pop pop }{ exch def }ifelse }def /ps_level /languagelevel where{ pop systemdict /languagelevel get exec }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr} stopped { -1 }if def /set_gvm { currentglobal exch setglobal }bdf /reset_gvm { setglobal }bdf /makereadonlyarray { /packedarray where{ pop packedarray }{ array astore readonly }ifelse }bdf /map_reserved_ink_name { dup type /stringtype eq{ dup /Red eq{ pop (_Red_) }{ dup /Green eq{ pop (_Green_) }{ dup /Blue eq{ pop (_Blue_) }{ dup () cvn eq{ pop (Process) }if }ifelse }ifelse }ifelse }if }bdf /AGMUTIL_GSTATE 22 dict def /get_gstate { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_clr_spc currentcolorspace def /AGMUTIL_GSTATE_clr_indx 0 def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end }def /set_gstate { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap AGMUTIL_GSTATE_lj setlinejoin AGMUTIL_GSTATE_ml setmiterlimit AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash AGMUTIL_GSTATE_sa setstrokeadjust AGMUTIL_GSTATE_clr_rnd setcolorrendering AGMUTIL_GSTATE_op setoverprint AGMUTIL_GSTATE_bg cvx setblackgeneration AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or { currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne { mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark } if }{ AGMUTIL_GSTATE_ht sethalftone } ifelse AGMUTIL_GSTATE_flt setflat end }def /get_gstate_and_matrix { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_ctm matrix currentmatrix def end get_gstate }def /set_gstate_and_matrix { set_gstate AGMUTIL_GSTATE begin AGMUTIL_GSTATE_ctm setmatrix end }def /AGMUTIL_str256 256 string def /AGMUTIL_src256 256 string def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd /thold_halftone { level3 {sethalftone currenthalftone} { dup /HalftoneType get 3 eq { sethalftone currenthalftone } { begin Width Height mul { Thresholds read {pop} if } repeat end currenthalftone } ifelse }ifelse } def /rdcmntline { currentfile AGMUTIL_str256 readline pop (%) anchorsearch {pop} if } bdf /filter_cmyk { dup type /filetype ne{ exch () /SubFileDecode filter } { exch pop } ifelse [ exch { AGMUTIL_src256 readstring pop dup length /AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put /AGMUTIL_ndx AGMUTIL_ndx 1 add def }for pop AGMUTIL_dst64 0 AGMUTIL_ndx getinterval } bind /exec cvx ] cvx } bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get } bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf dup type /filetype ne{ 0 () /SubFileDecode filter }if [ exch [ /devicen_colorspace_dict /AGMCORE_gget cvx /begin cvx currentdict /srcStr get /readstring cvx /pop cvx /dup cvx /length cvx 0 /gt cvx [ Adobe_AGM_Utils /AGMUTIL_ndx 0 /ddf cvx names_index Names length currentdict /srcStr get length 1 sub { 1 /index cvx /exch cvx /get cvx currentdict /dstStr get /AGMUTIL_ndx /load cvx 3 -1 /roll cvx /put cvx Adobe_AGM_Utils /AGMUTIL_ndx /AGMUTIL_ndx /load cvx 1 /add cvx /ddf cvx } for currentdict /dstStr get 0 /AGMUTIL_ndx /load cvx /getinterval cvx ] cvx /if cvx /end cvx ] cvx bind /exec cvx ] cvx end } bdf /AGMUTIL_imagefile nd /read_image_file { AGMUTIL_imagefile 0 setfileposition 10 dict begin /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def /origDataSource imageDict /DataSource get def /origMultipleDataSources imageDict /MultipleDataSources get def /origDecode imageDict /Decode get def /dstDataStr imageDict /Width get colorSpaceElemCnt mul string def imageDict /MultipleDataSources known {MultipleDataSources}{false} ifelse { /imbufCnt imageDict /DataSource get length def /imbufs imbufCnt array def 0 1 imbufCnt 1 sub { /imbufIdx xdf imbufs imbufIdx imbufLen string put imageDict /DataSource get imbufIdx [ AGMUTIL_imagefile imbufs imbufIdx get /readstring cvx /pop cvx ] cvx put } for DeviceN_PS2 { imageDict begin /DataSource [ DataSource /devn_sep_datasource cvx ] cvx def /MultipleDataSources false def /Decode [0 1] def end } if }{ /imbuf imbufLen string def Indexed_DeviceN level3 not and DeviceN_NoneName or { /srcDataStrs [ imageDict begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def imageDict begin /DataSource [AGMUTIL_imagefile Decode BitsPerComponent false 1 /filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource /exec cvx] cvx def /Decode [0 1] def end }{ imageDict /DataSource [1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx /pop cvx names_index /get cvx /put cvx] cvx put imageDict /Decode [0 1] put } ifelse } ifelse imageDict exch load exec imageDict /DataSource origDataSource put imageDict /MultipleDataSources origMultipleDataSources put imageDict /Decode origDecode put end } bdf /write_image_file { begin { (AGMUTIL_imagefile) (w+) file } stopped{ false }{ Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def MultipleDataSources {DataSource 0 get}{DataSource}ifelse type /filetype eq { /imbuf imbufLen string def }if 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ pop MultipleDataSources { 0 1 DataSource length 1 sub { DataSource type dup /arraytype eq { pop DataSource exch get exec }{ /filetype eq { DataSource exch get imbuf readstring pop }{ DataSource exch get } ifelse } ifelse AGMUTIL_imagefile exch writestring } for }{ DataSource type dup /arraytype eq { pop DataSource exec }{ /filetype eq { DataSource imbuf readstring pop }{ DataSource } ifelse } ifelse AGMUTIL_imagefile exch writestring } ifelse }for end true }ifelse end } bdf /close_image_file { AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile }def statusdict /product known userdict /AGMP_current_show known not and{ /pstr statusdict /product get def pstr (HP LaserJet 2200) eq pstr (HP LaserJet 4000 Series) eq or pstr (HP LaserJet 4050 Series ) eq or pstr (HP LaserJet 8000 Series) eq or pstr (HP LaserJet 8100 Series) eq or pstr (HP LaserJet 8150 Series) eq or pstr (HP LaserJet 5000 Series) eq or pstr (HP LaserJet 5100 Series) eq or pstr (HP Color LaserJet 4500) eq or pstr (HP Color LaserJet 4600) eq or pstr (HP LaserJet 5Si) eq or pstr (HP LaserJet 1200 Series) eq or pstr (HP LaserJet 1300 Series) eq or pstr (HP LaserJet 4100 Series) eq or { userdict /AGMP_current_show /show load put userdict /show { currentcolorspace 0 get /Pattern eq {false charpath f} {AGMP_current_show} ifelse } put }if currentdict /pstr undef } if /consumeimagedata { begin currentdict /MultipleDataSources known not {/MultipleDataSources false def} if MultipleDataSources { DataSource 0 get type dup /filetype eq { 1 dict begin /flushbuffer Width cvi string def 1 1 Height cvi { pop 0 1 DataSource length 1 sub { DataSource exch get flushbuffer readstring pop pop }for }for end }if dup /arraytype eq exch /packedarraytype eq or DataSource 0 get xcheck and { Width Height mul cvi { 0 1 DataSource length 1 sub {dup DataSource exch get exec length exch 0 ne {pop}if}for dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if } { /DataSource load type dup /filetype eq { 1 dict begin /flushbuffer Width Decode length 2 idiv mul cvi string def 1 1 Height { pop DataSource flushbuffer readstring pop pop} for end }if dup /arraytype eq exch /packedarraytype eq or /DataSource load xcheck and { Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul { DataSource length dup 0 eq {pop exit}if sub dup 0 le {exit}if }loop pop }if }ifelse end }bdf /addprocs { 2{/exec load}repeat 3 1 roll [ 5 1 roll ] bind cvx }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end sethalftone pop }ifelse }def /clonearray { dup xcheck exch dup length array exch Adobe_AGM_Core/AGMCORE_tmp -1 ddf { Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf dup type /dicttype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonedict Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if dup type /arraytype eq { Adobe_AGM_Core/AGMCORE_tmp get exch clonearray Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if exch dup Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put }forall exch {cvx} if }bdf /clonedict { dup length dict begin { dup type /dicttype eq { clonedict } if dup type /arraytype eq { clonearray } if def }forall currentdict end }bdf /DeviceN_PS2 { /currentcolorspace AGMCORE_gget 0 get /DeviceN eq level3 not and } bdf /Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget dup null ne { dup /CSDBase known { /CSDBase get /CSD get_res /Names known }{ pop false }ifelse }{ pop false } ifelse } bdf /DeviceN_NoneName { /Names where { pop false Names { (None) eq or } forall }{ false }ifelse } bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { pop dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false } { true }ifelse } { true } ifelse } { true } ifelse } bdf /base_colorspace_type { dup type /arraytype eq {0 get} if } bdf /currentdistillerparams where { pop currentdistillerparams /CoreDistVersion get 5000 lt}{true}ifelse { /pdfmark_5 {cleartomark} bind def }{ /pdfmark_5 {pdfmark} bind def }ifelse /ReadBypdfmark_5 { 2 dict begin /makerString exch def string /tmpString exch def { currentfile tmpString readline pop makerString anchorsearch { pop pop cleartomark exit }{ 3 copy /PUT pdfmark_5 pop 2 copy (\n) /PUT pdfmark_5 } ifelse }loop end } bdf /doc_setup{ Adobe_AGM_Utils begin }bdf /doc_trailer{ currentdict Adobe_AGM_Utils eq{ end }if }bdf systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright (C) 1997-2005 Adobe Systems, Inc. All Rights Reserved. %% Note: This procset assumes Adobe_AGM_Utils is opened on the stack below it, for %% definitions of some fundamental procedures. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Core 201 dict dup begin put /Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen [currentscreen] cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&setcmykcolor nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_distilling nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSD_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd /AGMCORE_feature_opCount nd /AGMCORE_feature_ctm nd /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd /AGMCORE_in_pattern false def /AGMCORE_currentpagedevice nd /knockout_unitsq nd currentglobal true setglobal [/CSA /Gradient /Procedure] { /Generic /Category findresource dup length dict copy /Category defineresource pop } forall setglobal /AGMCORE_key_known { where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /flushinput { save 2 dict begin /CompareBuffer 3 -1 roll def /readbuffer 256 string def mark { currentfile readbuffer {readline} stopped {cleartomark mark} { not {pop exit} if CompareBuffer eq {exit} if }ifelse }loop cleartomark end restore }bdf /getspotfunction { AGMCORE_screen exch pop exch pop dup type /dicttype eq{ dup /HalftoneType get 1 eq{ /SpotFunction get }{ dup /HalftoneType get 2 eq{ /GraySpotFunction get }{ pop { abs exch abs 2 copy add 1 gt{ 1 sub dup mul exch 1 sub dup mul add 1 sub }{ dup mul exch dup mul add 1 exch sub }ifelse }bind }ifelse }ifelse }if } def /clp_npth { clip newpath } def /eoclp_npth { eoclip newpath } def /npth_clp { newpath clip } def /graphic_setup { /AGMCORE_graphicsave save def concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth [] 0 setdash 10 setmiterlimit newpath false setoverprint false setstrokeadjust //Adobe_AGM_Core/spot_alias get exec /Adobe_AGM_Image where { pop Adobe_AGM_Image/spot_alias 2 copy known{ get exec }{ pop pop }ifelse } if 100 dict begin /dictstackcount countdictstack def /showpage {} def mark } def /graphic_cleanup { cleartomark dictstackcount 1 countdictstack 1 sub {end}for end AGMCORE_graphicsave restore } def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def } { AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def } ifelse } forall } bdf /doc_setup{ Adobe_AGM_Core begin /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict /AGM_handleerror known not{ errordict /AGM_handleerror errordict /handleerror get put errordict /handleerror { Adobe_AGM_Core begin $error /newerror get AGMCORE_cur_err null ne and{ $error /newerror false put AGMCORE_cur_err compose_error_msg }if $error /newerror true put end errordict /AGM_handleerror get exec } bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err /AGMCORE_bad_environ def} if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def /AGMCORE_distilling /product where{ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and }{ false }ifelse def /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 10 def /AGMCORE_&gsave /gsave ldf /AGMCORE_&grestore /grestore ldf /AGMCORE_&grestoreall /grestoreall ldf /AGMCORE_&save /save ldf /AGMCORE_&setoverprint /setoverprint ldf /AGMCORE_gdictcopy { begin { def } forall end }def /AGMCORE_gput { AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget { AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave { AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore { AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt {1 add} if dup AGMCORE_gstack exch get dup /AGMCORE_currentoverprint known {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse /AGMCORE_gstackptr exch store }def /grestoreall { AGMCORE_&grestoreall /AGMCORE_gstackptr AGMCORE_gstacksaveptr store }def /save { AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if /AGMCORE_gstackptr exch store /AGMCORE_gstacksaveptr AGMCORE_gstackptr store AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /setoverprint{ dup /AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint }def 0 1 AGMCORE_gstack length 1 sub { AGMCORE_gstack exch AGMCORE_gstackframekeys dict put } for }if level3 /AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def /AGMCORE_&sysmakepattern systemdict/makepattern get def /AGMCORE_&usrmakepattern /makepattern load def }if /currentcmykcolor [0 0 0 0] AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace [/DeviceGray] AGMCORE_gput /sep_tint 0 AGMCORE_gput /devicen_tints [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent () AGMCORE_gput /customcolor_tint 1 AGMCORE_gput << /MaxPatternItem currentsystemparams /MaxPatternCache get >> setuserparams end }def /page_setup { /setcmykcolor where{ pop Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor pop }ndf /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint { pop }ndf /currentoverprint { false }ndf /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_have_reported_unsupported_color_space false def /AGMCORE_report_unsupported_color_space { AGMCORE_have_reported_unsupported_color_space false eq { (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.) == Adobe_AGM_Core /AGMCORE_have_reported_unsupported_color_space true ddf } if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_in_rip_sep /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ AGMCORE_distilling { false }{ userdict/Adobe_AGM_OnHost_Seps known{ false }{ level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse }ifelse }ifelse }ifelse def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ AGMCORE_distilling AGMCORE_producing_seps or }ifelse def /AGM_is_distiller_preserving_spotimages { currentdistillerparams/PreserveOverprintSettings known { currentdistillerparams/PreserveOverprintSettings get { currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get /sRGB ne }{ true }ifelse }{ false }ifelse }{ false }ifelse }def /convert_spot_to_process where {pop}{ /convert_spot_to_process { //Adobe_AGM_Core begin dup map_alias { /Name get exch pop } if dup dup (None) eq exch (All) eq or { pop false }{ AGMCORE_host_sep { gsave 1 0 0 0 setcmykcolor currentgray 1 exch sub 0 1 0 0 setcmykcolor currentgray 1 exch sub 0 0 1 0 setcmykcolor currentgray 1 exch sub 0 0 0 1 setcmykcolor currentgray 1 exch sub add add add 0 eq { pop false }{ false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne }ifelse grestore }{ AGMCORE_distilling { pop AGM_is_distiller_preserving_spotimages not }{ //Adobe_AGM_Core/AGMCORE_name xddf false //Adobe_AGM_Core/AGMCORE_in_pattern known {//Adobe_AGM_Core/AGMCORE_in_pattern get}{false} ifelse not AGMCORE_currentpagedevice/OverrideSeparations known and { AGMCORE_currentpagedevice/OverrideSeparations get { /HqnSpots /ProcSet resourcestatus { pop pop pop true }if }if }if { AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not }{ gsave [/Separation AGMCORE_name /DeviceGray {}]AGMCORE_&setcolorspace false AGMCORE_currentpagedevice/SeparationColorNames 2 copy known { get { AGMCORE_name eq or}forall not }{ pop pop pop true }ifelse grestore }ifelse }ifelse }ifelse }ifelse end }def }ifelse /convert_to_process where {pop}{ /convert_to_process { dup length 0 eq { pop false }{ AGMCORE_host_sep { dup true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } forall { true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch (Black) eq or and }forall not }{pop false}ifelse }{ false exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process or}ifelse } forall }ifelse }ifelse }def }ifelse /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse { /setcmykcolor[ { 4 copy add add add 0 eq currentoverprint and{ pop 0.0005 }if }/exec cvx /AGMCORE_&setcmykcolor load dup type/operatortype ne{ /exec cvx }if ]cvx def }if /AGMCORE_IsSeparationAProcessColor { dup (Cyan) eq exch dup (Magenta) eq exch dup (Yellow) eq exch (Black) eq or or or }def AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ AGMCORE_magenta_plate{ 4 3 roll pop pop pop }{ AGMCORE_yellow_plate{ 4 2 roll pop pop pop }{ 4 1 roll pop pop pop }ifelse }ifelse }ifelse settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames { 1 dict begin /filtername { dup /Cyan eq 1 index (Cyan) eq or {pop (_cyan_)}if dup /Magenta eq 1 index (Magenta) eq or {pop (_magenta_)}if dup /Yellow eq 1 index (Yellow) eq or {pop (_yellow_)}if dup /Black eq 1 index (Black) eq or {pop (_black_)}if }def dup type /arraytype eq {[exch {filtername}forall]} {filtername}ifelse end }def level3 { /AGMCORE_IsCurrentColor { dup AGMCORE_IsSeparationAProcessColor { AGMCORE_plate_ndx 0 eq {dup (Cyan) eq exch /Cyan eq or}if AGMCORE_plate_ndx 1 eq {dup (Magenta) eq exch /Magenta eq or}if AGMCORE_plate_ndx 2 eq {dup (Yellow) eq exch /Yellow eq or}if AGMCORE_plate_ndx 3 eq {dup (Black) eq exch /Black eq or}if AGMCORE_plate_ndx 4 eq {pop false}if }{ gsave false setoverprint current_spot_alias false set_spot_alias 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor set_spot_alias currentgray 1 ne grestore }ifelse }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf data_in type /stringtype eq { /ncomp xdf /comp xdf /string_out data_in length ncomp idiv string def 0 ncomp data_in length 1 sub { string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put }for string_out }{ string /string_in xdf /string_out 1 string def /component xdf [ data_in string_in /readstring cvx [component /get cvx 255 /exch cvx /sub cvx string_out /exch cvx 0 /exch cvx /put cvx string_out]cvx [/pop cvx ()]cvx /ifelse cvx ]cvx /ReusableStreamDecode filter }ifelse end }def /AGMCORE_separateShadingFunction { 2 dict begin /paint? xdf /channel xdf dup type /dicttype eq { begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def currentdict /Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not {/Decode [1 1]def}if }if FunctionType 2 eq { paint? { /C0 [C0 channel get 1 exch sub] def /C1 [C1 channel get 1 exch sub] def }{ /C0 [1] def /C1 [1] def }ifelse }if FunctionType 3 eq { /Functions [Functions {channel paint? AGMCORE_separateShadingFunction} forall] def }if currentdict /Range known {/Range [0 1] def}if currentdict end}{ channel get 0 paint? AGMCORE_separateShadingFunction }ifelse end }def /AGMCORE_separateShading { 3 -1 roll begin currentdict /Function known { currentdict /Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if Function 3 1 roll AGMCORE_separateShadingFunction /Function xdf /ColorSpace [/DeviceGray] def }{ ColorSpace dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse ColorSpace 0 get /Separation eq { { [1 /exch cvx /sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll put pop }{ { [exch ColorSpace 1 get length 1 sub exch sub /index cvx 1 /exch cvx /sub cvx ColorSpace 1 get length 1 add 1 /roll cvx ColorSpace 1 get length{/pop cvx} repeat]cvx }{ pop [ColorSpace 1 get length {/pop cvx} repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse ColorSpace 2 /DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { dup /ColorSpace get dup type /arraytype ne {[exch]}if dup 0 get /DeviceCMYK eq { exch begin currentdict AGMCORE_cyan_plate {0 true}if AGMCORE_magenta_plate {1 true}if AGMCORE_yellow_plate {2 true}if AGMCORE_black_plate {3 true}if AGMCORE_plate_ndx 4 eq {0 false}if dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading currentdict end exch }if dup 0 get /Separation eq { exch begin ColorSpace 1 get dup /None ne exch /All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /Separation ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading }if }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse }if currentdict end exch }if dup 0 get /DeviceN eq { exch begin ColorSpace 1 get convert_to_process { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /DeviceN ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading /ColorSpace [/DeviceGray] def }if }ifelse }{ currentdict false -1 ColorSpace 1 get { AGMCORE_IsCurrentColor { 1 add exch pop true exch exit }if 1 add }forall exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse currentdict end exch }if dup 0 get dup /DeviceCMYK eq exch dup /Separation eq exch /DeviceN eq or or not { exch begin ColorSpace dup type /arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { ColorSpace 0 get /CIEBasedA eq { /ColorSpace [/Separation /_ciebaseda_ /DeviceGray {}] def }if ColorSpace 0 get dup /CIEBasedABC eq exch dup /CIEBasedDEF eq exch /DeviceRGB eq or or { /ColorSpace [/DeviceN [/_red_ /_green_ /_blue_] /DeviceRGB {}] def }if ColorSpace 0 get /CIEBasedDEFG eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }if currentdict 0 false AGMCORE_separateShading }if }if currentdict end exch }if pop dup /AGMCORE_ignoreshade known { begin /ColorSpace [/Separation (None) /DeviceGray {}] def currentdict end }if }def /shfill { AGMCORE_separateShadingDict dup /AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch dup /PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def Shading /AGMCORE_ignoreshade known currentdict end exch {pop <</PatternType 1/PaintProc{pop}/BBox[0 0 1 1]/XStep 1/YStep 1/PaintType 1/TilingType 3>>}if exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern }ifelse }def }if }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4 {4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ //Adobe_AGM_Core begin /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf end [/Separation 4 -1 roll /DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation (All) /DeviceGray {}] setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4 {4 index mul 4 1 roll} repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval {255 div} forall } bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index } bdf /n_color_components { base_colorspace_type dup /DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse }bdf level2{ /mo /moveto ldf /li /lineto ldf /cv /curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def level2 /setcolorspace AGMCORE_key_known not and{ /AGMCORE_&&&setcolorspace /setcolorspace ldf /AGMCORE_ReplaceMappedColor { dup type dup /arraytype eq exch /packedarraytype eq or { /AGMCORE_SpotAliasAry2 where { begin dup 0 get dup /Separation eq { pop dup length array copy dup dup 1 get current_spot_alias { dup map_alias { false set_spot_alias dup 1 exch setsepcolorspace true set_spot_alias begin /sep_colorspace_dict currentdict AGMCORE_gput pop pop pop [ /Separation Name CSA map_csa MappedCSA /sep_colorspace_proc load ] dup Name end }if }if map_reserved_ink_name 1 xpt }{ /DeviceN eq { dup length array copy dup dup 1 get [ exch { current_spot_alias{ dup map_alias{ /Name get exch pop }if }if map_reserved_ink_name } forall ] 1 xpt }if }ifelse end } if }if }def /setcolorspace { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /Indexed eq { AGMCORE_distilling { /PhotoshopDuotoneList where { pop false }{ true }ifelse }{ true }ifelse { aload pop 3 -1 roll AGMCORE_ReplaceMappedColor 3 1 roll 4 array astore }if }{ AGMCORE_ReplaceMappedColor }ifelse }if DeviceN_PS2_inRip_seps {AGMCORE_&&&setcolorspace} if }def }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /li{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1 [8 0 0 8 0 0] {<ffffffffffffffff>} image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /setcolorspace { /currentcolorspace exch AGMCORE_gput } def /currentcolorspace { /currentcolorspace AGMCORE_gget } def /setcolor_devicecolor { base_colorspace_type dup /DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup /DeviceGray ne{ dup /DeviceCMYK ne{ dup /DeviceRGB ne{ dup /Separation eq{ pop currentcolorspace 3 get exec currentcolorspace 2 get }{ dup /Indexed eq{ pop currentcolorspace 3 get dup type /stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err /AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor } def }ifelse /sop /setoverprint ldf /lw /setlinewidth ldf /lc /setlinecap ldf /lj /setlinejoin ldf /ml /setmiterlimit ldf /dsh /setdash ldf /sadj /setstrokeadjust ldf /gry /setgray ldf /rgb /setrgbcolor ldf /cmyk /setcmykcolor ldf /sep /setsepcolor ldf /devn /setdevicencolor ldf /idx /setindexedcolor ldf /colr /setcolor ldf /csacrd /set_csa_crd ldf /sepcs /setsepcolorspace ldf /devncs /setdevicencolorspace ldf /idxcs /setindexedcolorspace ldf /cp /closepath ldf /clp /clp_npth ldf /eclp /eoclp_npth ldf /f /fill ldf /ef /eofill ldf /@ /stroke ldf /nclp /npth_clp ldf /gset /graphic_setup ldf /gcln /graphic_cleanup ldf /AGMCORE_def_ht currenthalftone def /clonedict Adobe_AGM_Utils begin /clonedict load end def /clonearray Adobe_AGM_Utils begin /clonearray load end def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { bind }if def }forall /getrampcolor { /indx exch def 0 1 NumComp 1 sub { dup Samples exch get dup type /stringtype eq {indx get} if exch Scaling exch get aload pop 3 1 roll mul add } for ColorSpaceFamily /Separation eq {sep} { ColorSpaceFamily /DeviceN eq {devn} {setcolor}ifelse }ifelse } bdf /sssetbackground {aload pop setcolor} bdf /RadialShade { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /r2 xdf /c2y xdf /c2x xdf /r1 xdf /c1y xdf /c1x xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if c1x c2x eq { c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse } { /slope c2y c1y sub c2x c1x sub div def /theta slope 1 atan def c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if } ifelse gsave clippath c1x c1y translate theta rotate -90 rotate { pathbbox } stopped { 0 0 0 0 } if /yMax xdf /xMax xdf /yMin xdf /xMin xdf grestore xMax xMin eq yMax yMin eq or { grestore end } { /max { 2 copy gt { pop } {exch pop} ifelse } bdf /min { 2 copy lt { pop } {exch pop} ifelse } bdf rampdict begin 40 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave c1x c1y translate theta rotate -90 rotate /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def /c1y 0 def /c1x 0 def /c2x 0 def ext0 { 0 getrampcolor c2y r2 add r1 sub 0.0001 lt { c1x c1y r1 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2y r1 add r2 le { c1x c1y r1 0 360 arc fill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r1 neg def /p1y c1y def /p2x r1 def /p2y c1y def p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y p1x SS1 div neg def /SS2 90 theta sub dup sin exch cos div def /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y p2x SS2 div neg def r1 r2 gt { /L1maxX p1x yMin p1y sub SS1 div add def /L2maxX p2x yMin p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def } ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if c1x c2x sub dup mul c1y c2y sub dup mul add 0.5 exp 0 dtransform dup mul exch dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop /hires xdf hires mul /numpix xdf /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if /xInc c2x c1x sub numsteps div def /yInc c2y c1y sub numsteps div def /rInc r2 r1 sub numsteps div def /cx c1x def /cy c1y def /radius r1 def newpath xInc 0 eq yInc 0 eq rInc 0 eq and and { 0 getrampcolor cx cy radius 0 360 arc stroke NumSamples 1 sub getrampcolor cx cy radius 72 hires div add 0 360 arc 0 setlinewidth stroke } { 0 numsteps { dup subsampling { round cvi } if getrampcolor cx cy radius 0 360 arc /cx cx xInc add def /cy cy yInc add def /radius radius rInc add def cx cy radius 360 0 arcn eofill rampIndxInc add } repeat pop } ifelse ext1 { c2y r2 add r1 lt { c2x c2y r2 0 360 arc fill } { c2y r1 add r2 sub 0.0001 le { c2x c2y r2 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r2 neg def /p1y c2y def /p2x r2 def /p2y c2y def p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto fill } { /AA r2 r1 sub c2y div def AA -1 eq { /theta 89.99 def} { /theta AA 1 AA dup mul sub sqrt div 1 atan def} ifelse /SS1 90 theta add dup sin exch cos div def /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y c2y p1x SS1 div sub def /SS2 90 theta sub dup sin exch cos div def /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y c2y p2x SS2 div sub def r1 r2 lt { /L1maxX p1x yMax p1y sub SS1 div add def /L2maxX p2x yMax p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if grestore grestore end end end } ifelse } bdf /GenStrips { 40 dict begin /ColorSpaceFamily xdf /background xdf /ext1 xdf /ext0 xdf /BBox xdf /y2 xdf /x2 xdf /y1 xdf /x1 xdf /rampdict xdf /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if x1 x2 eq { y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse } { /slope y2 y1 sub x2 x1 sub div def /theta slope 1 atan def x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if } ifelse gsave clippath x1 y1 translate theta rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { rampdict begin 20 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave x1 y1 translate theta rotate /xStart 0 def /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def /ySpan yMax yMin sub def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def xStart 0 transform xEnd 0 transform 3 -1 roll sub dup mul 3 1 roll sub dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop mul /numpix xdf numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if ext0 { 0 getrampcolor xMin xStart lt { xMin yMin xMin neg ySpan rectfill } if } if /xInc xEnd xStart sub numsteps div def /x xStart def 0 numsteps { dup subsampling { round cvi } if getrampcolor x yMin xInc ySpan rectfill /x x xInc add def rampIndxInc add } repeat pop ext1 { xMax xEnd gt { xEnd yMin xMax xEnd sub ySpan rectfill } if } if grestore grestore end end end } ifelse } bdf }def /page_trailer { end }def /doc_trailer{ }def /capture_currentpagedevice { //Adobe_AGM_Core/AGMCORE_currentpagedevice currentpagedevice ddf } def systemdict /findcolorrendering known{ /findcolorrendering systemdict /findcolorrendering get def }if systemdict /setcolorrendering known{ /setcolorrendering systemdict /setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { dup //Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA get_csa_by_name setcolorspace_opt set_crd end } def /map_csa { currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse {pop}{get_csa_by_name /MappedCSA xdf}ifelse } def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup /sep_tint exch AGMCORE_gput TintProc end } def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin Names length copy Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt } for TintProc end } def /sep_colorspace_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll } repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end } def /sep_colorspace_gray_proc { /AGMCORE_tmp exch store /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end } def /sep_proc_name { dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ pop [/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse } def /setsepcolorspace { current_spot_alias{ dup begin Name map_alias{ exch pop }if end }if dup /sep_colorspace_dict exch AGMCORE_gput begin CSA map_csa /AGMCORE_sep_special Name dup () eq exch (All) eq or store AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx ] setcolorspace_opt /TintProc { 255 mul round cvi setcolor }bdf }{ MappedCSA 0 get /DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc [ Components aload pop Name findcmykcustomcolor /exch cvx /setcustomcolor cvx ] cvx bdf }{ AGMCORE_host_sep Name (All) eq and{ /TintProc { 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and AGMCORE_host_sep or Name () eq and{ /TintProc [ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ cvx /setcmykcolor cvx }{ cvx /setgray cvx }ifelse ] cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc [ /dup cvx MappedCSA sep_proc_name cvx exch 0 get /DeviceGray eq{ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx }if /Name cvx /findcmykcustomcolor cvx /exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep /Name cvx /AGMCORE_IsSeparationAProcessColor load /exec cvx /not cvx /and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 ] cvx /if cvx /setcustomcolor cvx ] cvx bdf }{ /TintProc {setcolor} bdf [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd setsepcolor end } def /additive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 0 1 numarrays 1 sub { 1 exch add /index cvx c1 /get cvx /mul cvx }for numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /subtractive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 1 0 1 numarrays 1 sub { 1 3 3 -1 roll add /index cvx c1 /get cvx /sub cvx /mul cvx }for /sub cvx numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /exec_tint_transform { /TintProc [ /TintTransform cvx /setcolor cvx ] cvx bdf MappedCSA setcolorspace_opt } bdf /devn_makecustomcolor { 2 dict begin /names_index xdf /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor Names length {pop} repeat end } bdf /setdevicencolorspace { dup /AliasedColorants known {false}{true}ifelse current_spot_alias and { 7 dict begin /names_index 0 def dup /names_len exch /Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def dup /Names get { dup map_alias { exch pop dup /ColorLookup known { dup begin new_LookupTables names_index ColorLookup put end }{ dup /Components known { dup begin new_LookupTables names_index Components put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse new_names names_index 3 -1 roll /Name get put /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put dup /LookupTables known { dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse /names_index names_index 1 add def } forall alias_cnt 0 gt { /AliasedColorants true def /lut_entry_len new_LookupTables 0 get dup length 256 ge {0 get length}{length}ifelse def 0 1 names_len 1 sub { /names_index xdf new_LookupTables names_index get dup length 256 ge {0 get length}{length}ifelse lut_entry_len ne { /AliasedColorants false def exit } { new_LookupTables names_index get 0 get null eq { dup /Names get names_index get /name xdf name (Cyan) eq name (Magenta) eq name (Yellow) eq name (Black) eq or or or not { /AliasedColorants false def exit } if } if } ifelse } for lut_entry_len 1 eq { /AliasedColorants false def } if AliasedColorants { dup begin /Names new_names def /LookupTables new_LookupTables def /AliasedColorants true def /NComponents lut_entry_len def /TintMethod NComponents 4 eq {/Subtractive}{/Additive}ifelse def /MappedCSA TintMethod /Additive eq {/DeviceRGB}{/DeviceCMYK}ifelse def currentdict /TTTablesIdx known not { /TTTablesIdx -1 def } if end } if }if end } if dup /devicen_colorspace_dict exch AGMCORE_gput begin currentdict /AliasedColorants known { AliasedColorants }{ false } ifelse dup not { CSA map_csa } if /TintTransform load type /nulltype eq or { /TintTransform [ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def dup LookupTables exch get dup 0 get null eq { 1 index Names exch get dup (Cyan) eq { pop exch LookupTables length exch sub /index cvx 0 0 0 } { dup (Magenta) eq { pop exch LookupTables length exch sub /index cvx 0 /exch cvx 0 0 } { (Yellow) eq { exch LookupTables length exch sub /index cvx 0 0 3 -1 /roll cvx 0 } { exch LookupTables length exch sub /index cvx 0 0 0 4 -1 /roll cvx } ifelse } ifelse } ifelse 5 -1 /roll cvx /astore cvx } { dup length 1 sub LookupTables length 4 -1 roll sub 1 add /index cvx /mul cvx /round cvx /cvi cvx /get cvx } ifelse Names length TTTablesIdx add 1 add 1 /roll cvx } for Names length [/pop cvx] cvx /repeat cvx NComponents Names length TintMethod /Subtractive eq { subtractive_blend } { additive_blend } ifelse ] cvx bdf } if AGMCORE_host_sep { Names convert_to_process { exec_tint_transform } { currentdict /AliasedColorants known { AliasedColorants not }{ false } ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def AvoidAliasedColorants { /currentspotalias current_spot_alias def false set_spot_alias } if Names { AGMCORE_is_cmyk_sep { dup (Cyan) eq AGMCORE_cyan_plate and exch dup (Magenta) eq AGMCORE_magenta_plate and exch dup (Yellow) eq AGMCORE_yellow_plate and exch (Black) eq AGMCORE_black_plate and or or or { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def } if painted? {exit} if }{ 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def exit } if } ifelse /names_index names_index 1 add def } forall AvoidAliasedColorants { currentspotalias set_spot_alias } if painted? { /devicen_colorspace_dict AGMCORE_gget /names_index names_index put }{ /devicen_colorspace_dict AGMCORE_gget /TintProc [ names_len [/pop cvx] cvx /repeat cvx 1 /setseparationgray cvx 0 0 0 0 /setcmykcolor cvx ] cvx ddf } ifelse end } ifelse } { AGMCORE_in_rip_sep { Names convert_to_process not }{ level3 } ifelse { [/DeviceN Names MappedCSA /TintTransform load] setcolorspace_opt /TintProc level3 not AGMCORE_in_rip_sep and { [ Names /length cvx [/pop cvx] cvx /repeat cvx ] cvx bdf }{ {setcolor} bdf } ifelse }{ exec_tint_transform } ifelse } ifelse set_crd /AliasedColorants false def end } def /setindexedcolorspace { dup /indexed_colorspace_dict exch AGMCORE_gput begin currentdict /CSDBase known { CSDBase /CSD get_res begin currentdict /Names known { currentdict devncs }{ 1 currentdict sepcs } ifelse AGMCORE_host_sep{ 4 dict begin /compCnt /Names where {pop Names length}{1}ifelse def /NewLookup HiVal 1 add string def 0 1 HiVal { /tableIndex xdf Lookup dup type /stringtype eq { compCnt tableIndex map_index }{ exec } ifelse /Names where { pop setdevicencolor }{ setsepcolor } ifelse currentgray tableIndex exch HiVal mul cvi NewLookup 3 1 roll put } for [/Indexed currentcolorspace HiVal NewLookup] setcolorspace_opt end }{ level3 { currentdict /Names known { [/Indexed [/DeviceN Names MappedCSA /TintTransform load] HiVal Lookup] setcolorspace_opt }{ [/Indexed [/Separation Name MappedCSA sep_proc_name load] HiVal Lookup] setcolorspace_opt } ifelse }{ [/Indexed MappedCSA HiVal [ currentdict /Names known { Lookup dup type /stringtype eq {/exch cvx CSDBase /CSD get_res /Names get length dup /mul cvx exch /getinterval cvx {255 div} /forall cvx} {/exec cvx}ifelse /TintTransform load /exec cvx }{ Lookup dup type /stringtype eq {/exch cvx /get cvx 255 /div cvx} {/exec cvx}ifelse CSDBase /CSD get_res /MappedCSA get sep_proc_name exch pop /load cvx /exec cvx } ifelse ]cvx ]setcolorspace_opt }ifelse } ifelse end set_crd } { CSA map_csa AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ pop [/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval {} forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end } bind }{ Lookup }ifelse }ifelse ] setcolorspace_opt set_crd }ifelse }ifelse end }def /setindexedcolor { AGMCORE_host_sep { /indexed_colorspace_dict AGMCORE_gget dup /CSDBase known { begin CSDBase /CSD get_res begin currentdict /Names known{ map_indexed_devn devn } { Lookup 1 3 -1 roll map_index sep }ifelse end end }{ /Lookup get 4 3 -1 roll map_index setcmykcolor } ifelse }{ level3 not AGMCORE_in_rip_sep and /indexed_colorspace_dict AGMCORE_gget /CSDBase known and { /indexed_colorspace_dict AGMCORE_gget /CSDBase get /CSD get_res begin map_indexed_devn devn end } { setcolor } ifelse }ifelse } def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray /Decode [0 1] def /DataSource <FF> def /MultipleDataSources false def /BitsPerComponent 8 def currentdict end systemdict /image get exec grestore }if consumeimagedata }def /add_res { dup /CSD eq { pop //Adobe_AGM_Core begin /AGMCORE_CSD_cache load 3 1 roll put end }{ defineresource pop } ifelse }def /del_res { { aload pop exch dup /CSD eq { pop { //Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef }forall }{ exch { 1 index undefineresource }forall pop } ifelse } forall }def /get_res { dup /CSD eq { pop dup type dup /nametype eq exch /stringtype eq or { AGMCORE_CSD_cache exch get } if }{ findresource } ifelse }def /get_csa_by_name { dup type dup /nametype eq exch /stringtype eq or{ /CSA get_res } if }def /pattern_buf_init { /count get 0 0 put } def /pattern_buf_next { dup /count get dup 0 get dup 3 1 roll 1 add 0 xpt get } def /cachepattern_compress { 5 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def /string_size 16000 def /readbuffer string_size string def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal /LZWFilter { exch dup length 0 eq { pop }{ patarray dup length 1 sub 3 -1 roll put } ifelse {string_size}{0}ifelse string } /LZWEncode filter def { ReadFilter readbuffer readstring exch LZWFilter exch writestring not {exit} if } loop LZWFilter closefile patarray end }def /cachepattern { 2 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal { ReadFilter 16000 string readstring exch patarray dup length 1 sub 3 -1 roll put not {exit} if } loop patarray dup dup length 1 sub () put end }def /wrap_paintproc { statusdict /currentfilenameextend known{ clonedict begin /OldPaintProc /PaintProc load def /PaintProc { mark exch dup /OldPaintProc get stopped {closefile restore end} if cleartomark } def end } {pop} ifelse } def /make_pattern { exch clonedict exch dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix 1 index begin BBox 0 get XStep div cvi XStep mul /xshift exch neg def BBox 1 get YStep div cvi YStep mul /yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def [ xshift yshift /translate load null /exec load ] dup 3 /PaintProc load put cvx /PaintProc exch def end 1 index dup /ID get exch /Pattern add_res gsave 0 setgray makepattern grestore }def /set_pattern { dup /PatternType get 1 eq{ dup /PaintType get 1 eq{ currentoverprint sop [/DeviceGray] setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{ pop }{ setcolorspace }ifelse }def /updatecolorrendering { currentcolorrendering/RenderingIntent known{ currentcolorrendering/RenderingIntent get }{null}ifelse Intent ne { Intent /ColorRendering {findresource} stopped { pop pop systemdict /findcolorrendering known { Intent findcolorrendering pop /ColorRendering findresource true } {false} ifelse } {true} ifelse { dup begin currentdict /TransformPQR known { currentdict /TransformPQR get aload pop 3 {{} eq 3 1 roll} repeat or or } {true} ifelse currentdict /MatrixPQR known { currentdict /MatrixPQR get aload pop 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq and and and and and and and and } {true} ifelse end or { clonedict begin /TransformPQR [ {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add} bind {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add} bind {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add} bind ] def /MatrixPQR [ 0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] def /RangePQR [-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392] def currentdict end } if setcolorrendering_opt } if }if } def /set_crd { AGMCORE_host_sep not level2 and{ currentdict /ColorRendering known{ ColorRendering /ColorRendering {findresource} stopped not {setcolorrendering_opt} if }{ currentdict/Intent known{ updatecolorrendering }if }ifelse currentcolorspace dup type /arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ clonedict begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /cpaint_gcomp { convert_to_process //Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { (%end_cpaint_gcomp) flushinput }if }def /cpaint_gsep { //Adobe_AGM_Core/AGMCORE_ConvertToProcess get { (%end_cpaint_gsep) flushinput }if }def /cpaint_gend { newpath }def /set_spot_alias_ary { dup inherit_aliases //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf }def /set_spot_normalization_ary { dup inherit_aliases dup length /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add} if array //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf /AGMCORE_SpotAliasAry where{ pop AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval AGMCORE_SpotAliasAry length }{0} ifelse AGMCORE_SpotAliasAry2 3 1 roll exch putinterval true set_spot_alias }def /inherit_aliases { {dup /Name get map_alias {/CSD put}{pop} ifelse} forall }def /set_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop }ifelse }def /current_spot_alias { /AGMCORE_SpotAliasAry2 where{ /AGMCORE_current_spot_alias get }{ false }ifelse }def /map_alias { /AGMCORE_SpotAliasAry2 where{ begin /AGMCORE_name xdf false AGMCORE_SpotAliasAry2{ dup/Name get AGMCORE_name eq{ /CSD get /CSD get_res exch pop true exit }{ pop }ifelse }forall end }{ pop false }ifelse }bdf /spot_alias { true set_spot_alias /AGMCORE_&setcustomcolor AGMCORE_key_known not { //Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put } if /customcolor_tint 1 AGMCORE_gput //Adobe_AGM_Core begin /setcustomcolor { currentdict/TintProc known currentdict/CSA known and 3 1 roll //Adobe_AGM_Core begin dup /customcolor_tint exch AGMCORE_gput 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not current_spot_alias and{1 index 4 get map_alias}{false}ifelse { false set_spot_alias 4 -1 roll{ exch pop /sep_tint AGMCORE_gget exch }if mark 3 1 roll setsepcolorspace counttomark 0 ne{ setsepcolor }if pop pop true set_spot_alias }{ AGMCORE_&setcustomcolor pop }ifelse end }bdf end }def /begin_feature { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if }def /end_feature { 2 dict begin /spd /setpagedevice load def /setpagedevice { get_gstate spd set_gstate } def stopped{$error/newerror false put}if end count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if }def /set_negative { //Adobe_AGM_Core begin /AGMCORE_inverting exch def level2{ currentpagedevice/NegativePrint known{ currentpagedevice/NegativePrint get //Adobe_AGM_Core/AGMCORE_inverting get ne{ true begin_feature true{ << /NegativePrint //Adobe_AGM_Core/AGMCORE_inverting get >> setpagedevice }end_feature }if /AGMCORE_inverting false def }if }if AGMCORE_inverting{ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse /AGMIRS_&fill where {pop AGMIRS_&fill}{fill} ifelse grestore }if end }def /lw_save_restore_override { /md where { pop md begin initializepage /initializepage{}def /pmSVsetup{} def /endp{}def /pse{}def /psb{}def /orig_showpage where {pop} {/orig_showpage /showpage load def} ifelse /showpage {orig_showpage gR} def end }if }def /pscript_showpage_override { /NTPSOct95 where { begin showpage save /showpage /restore load def /restore {exch pop}def end }if }def /driver_media_override { /md where { pop md /initializepage known { md /initializepage {} put } if md /rC known { md /rC {4{pop}repeat} put } if }if /mysetup where { /mysetup [1 0 0 1 0 0] put }if Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put level2 {Adobe_AGM_Core /AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if }def /driver_check_media_override { /PrepsDict where {pop} { Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne Adobe_AGM_Core /AGMCORE_Default_PageSize get type /arraytype eq { Adobe_AGM_Core /AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and Adobe_AGM_Core /AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and }if { Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix }if }ifelse }def AGMCORE_err_strings begin /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def end /set_def_ht { AGMCORE_def_ht sethalftone } def end systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_CoolType_Core 2.25 0 %%Copyright: Copyright 1997-2005 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.25 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict /Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined { /Adobe_CoolType_Core userdict /Adobe_CoolType_Core get def } if userdict /Adobe_CoolType_Core 60 dict dup begin put /Adobe_CoolType_Version 2.25 def /Level2? systemdict /languagelevel known dup { pop systemdict /languagelevel get 2 ge } if def Level2? not { /currentglobal false def /setglobal /pop load def /gcheck { pop false } bind def /currentpacking false def /setpacking /pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def end setglobal /@_SaveStackLevels { Adobe_CoolType_Data begin /@vmState currentglobal def false setglobal @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup /args 7 index 5 add array put put get } { get dup /args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch /args exch put } { pop } ifelse } ifelse begin count 1 sub 1 index lt { pop count } if dup /argCount exch def dup 0 gt { args exch 0 exch getinterval astore pop } { pop } ifelse count /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def @vmState setglobal end } bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt { { pop } repeat } { pop } ifelse args 0 argCount getinterval {} forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt { { end } repeat } { pop } ifelse } bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end } bind def /@Raise { exch cvx exch errordict exch get exec stop } bind def /@ReRaise { cvx $error /errorname get errordict exch get exec stop } bind def /@Stopped { 0 @#Stopped } bind def /@#Stopped { @_SaveStackLevels stopped { @_RestoreStackLevels true } { @_PopStackLevels false } ifelse } bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get begin args exch argCount 1 sub exch sub get end end } bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup /@shouldNotDisappearDictValue true def Adobe_CoolType_Data exch /@shouldNotDisappearDict exch put begin count @_SaveStackLevels { (*) { pop stop } 128 string /Category resourceforall } stopped pop @_RestoreStackLevels currentdict Adobe_CoolType_Data /@shouldNotDisappearDict get ne dup { /@shouldNotDisappearDictValue known { { end currentdict 1 index eq { pop exit } if } loop } if } if end } { false } ifelse def true setglobal /CTHasResourceStatusBug Level2? { mark { /steveamerige /Category resourcestatus } stopped { cleartomark true } { cleartomark currentglobal not } ifelse } { false } ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse end } bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad /ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup /CMap CTHasResourceStatusBug { CTResourceStatus } { resourcestatus } ifelse { pop dup 0 eq exch 1 eq or { dup /CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug { exit } { stop } ifelse } ifelse } { pop } ifelse } 128 string /CMap resourceforall } stopped { cleartomark } stopped pop setglobal } if } if } bind def /doc_setup { Adobe_CoolType_Core begin CTWorkAroundBugs /mov /moveto load def /nfnt /newencodedfont load def /mfnt /makefont load def /sfnt /setfont load def /ufnt /undefinefont load def /chp /charpath load def /awsh /awidthshow load def /wsh /widthshow load def /ash /ashow load def /sh /show load def end currentglobal false setglobal userdict /Adobe_CoolType_Data 2 copy known not { 2 copy 10 dict put } if get begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end setglobal } bind def /doc_trailer { currentdict Adobe_CoolType_Core eq { end } if } bind def /page_setup { Adobe_CoolType_Core begin } bind def /page_trailer { end } bind def /unload { systemdict /languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known { undef } { pop pop } ifelse } if } if } bind def /ndf { 1 index where { pop pop pop } { dup xcheck { bind } if def } ifelse } def /findfont systemdict begin userdict begin /globaldict where { /globaldict get begin } if dup where pop exch get /globaldict where { pop end } if end end Adobe_CoolType_Core_Defined { /systemfindfont exch def } { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont { pop } ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq { 0 } { dup length } ifelse 2 index length add 1 add dict begin exch { 1 index /FID eq { pop pop } { def } ifelse } forall dup null eq { pop } { { def } forall } ifelse currentdict end exch setglobal } bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal } bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } { FontDirectory 3 index known { FontDirectory 3 index get /FontReferenced known } { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } ifelse } ifelse dup { 3 index findfont /FontReferenced get 2 index dup type /nametype eq {findfont} if ne { pop false } if } if { pop 1 index findfont /Encoding get exch 0 1 255 { 2 copy get 3 index 3 1 roll put } for pop pop pop } { dup type /nametype eq { findfont } if dup dup maxlength 2 add dict begin exch { 1 index /FID ne {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type /stringtype eq { cvn } if def dup currentdict end definefont def } ifelse } bind def /SetSubstituteStrategy { $SubstituteFont begin dup type /dicttype ne { 0 dict } if currentdict /$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin { def } forall { def } forall currentdict dup /$Init known { dup /$Init get exec } if end /$Strategy exch def } { pop pop pop } ifelse } { pop pop } ifelse end } bind def /scff { $SubstituteFont begin dup type /stringtype eq { dup length exch } { null } ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse def end { findfont } @Stopped { dup length 8 add string exch 1 index 0 (BadFont:) putinterval 1 index exch 8 exch dup length string cvs putinterval cvn { findfont } @Stopped { pop /Courier findfont } if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end } bind def /isWidthsOnlyFont { dup /WidthsOnly known { pop pop true } { dup /FDepVector known { /FDepVector get { isWidthsOnlyFont dup { exit } if } forall } { dup /FDArray known { /FDArray get { isWidthsOnlyFont dup { exit } if } forall } { pop } ifelse } ifelse } ifelse } bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 4 index def /$doSmartSub false def end 3 index currentglobal false setglobal exch /CompatibleFonts /ProcSet resourcestatus { pop pop /CompatibleFonts /ProcSet findresource begin dup /CompatibleFont currentexception 1 index /CompatibleFont true setexception 1 index /Font resourcestatus { pop pop 3 2 roll setglobal end exch dup findfont /CompatibleFonts /ProcSet findresource begin 3 1 roll exch /CompatibleFont exch setexception end } { 3 2 roll setglobal 1 index exch /CompatibleFont exch setexception end findfont $SubstituteFont /$substituteFound true put } ifelse } { exch setglobal findfont } ifelse $SubstituteFont begin $substituteFound { false (%%[Using embedded font ) print 5 index ?str1 cvs print ( to avoid the font substitution problem noted earlier.]%%\n) print } { dup /FontName known { dup /FontName get $fontname eq 1 index /DistillerFauxFont known not and /currentdistillerparams where { pop false 2 index isWidthsOnlyFont not and } if } { false } ifelse } ifelse exch pop /$doSmartSub true def end { exch pop exch pop exch 2 dict dup /Found 3 index put exch findfont exch } { exch exec exch dup findfont dup /FontType get 3 eq { exch ?str1 cvs dup length 1 sub -1 0 { exch dup 2 index get 42 eq { exch 0 exch getinterval cvn 4 1 roll 3 2 roll pop exit } {exch pop} ifelse }for } { exch pop } ifelse 2 dict dup /Downloaded 6 5 roll put } ifelse dup /FontName 4 index put copyfont definefont pop } bind def /?str2 256 string def /?add { 1 index type /integertype eq { exch true 4 2 } { false 3 1 } ifelse roll 1 index findfont dup /Widths known { Adobe_CoolType_Data /AddWidths? true put gsave dup 1000 scalefont setfont } if /Downloaded known { exec exch { exch ?str2 cvs exch findfont /Downloaded get 1 dict begin /Downloaded 1 index def ?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1 index add ?str1 2 index (*) putinterval ?str1 0 2 index getinterval cvn findfont ?str1 3 index (+) putinterval 2 dict dup /FontName ?str1 0 6 index getinterval cvn put dup /Downloaded Downloaded put end copyfont dup /FontName get exch definefont pop pop pop } { pop } ifelse } { pop exch { findfont dup /Found get dup length exch ?str1 cvs pop ?str1 1 index (+) putinterval ?str1 1 index 1 add 4 index ?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add getinterval cvn 1 dict exch 1 index exch /FontName exch put copyfont dup /FontName get exch definefont pop } { pop } ifelse } ifelse Adobe_CoolType_Data /AddWidths? get { grestore Adobe_CoolType_Data /AddWidths? false put } if } bind def /?sh { currentfont /Downloaded known { exch } if pop } bind def /?chp { currentfont /Downloaded known { pop } { false chp } ifelse } bind def /?mv { currentfont /Downloaded known { moveto pop pop } { pop pop moveto } ifelse } bind def setpacking userdict /$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known { get } { pop pop { pop /Courier } bind } ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams /CannotEmbedFontPolicy 2 copy known { get /Error eq } { pop pop false } ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup /WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type /stringtype eq { cvn } if def /FontType 3 def /FontMatrix [ .001 0 0 .001 0 0 ] def /Encoding 256 array dup 0 1 255 { /.notdef put dup } for pop def /FontBBox [ 0 0 0 0 ] def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth /y exch def /x exch def x y setcharwidth $SubstituteFont /$Strategy get /$Underprint get exec 0 0 moveto cc show x y moveto end end } bind def currentdict end exch setglobal } bind def /$GetaTint 2 dict dup begin /$BuildFont { dup /WMode known { dup /WMode get } { 0 } ifelse /$WMode exch def $fontname exch dup /FontName known { dup /FontName get dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse exch Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index /FontName get known { pop Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index get null copyfont } { $deepcopyfont } ifelse exch 1 index exch /FontBasedOn exch put dup /FontName $fontname dup type /stringtype eq { cvn } if put definefont Adobe_CoolType_Data /InVMDeepCopiedFonts get begin dup /FontBasedOn get 1 index def end } bind def /$Underprint { gsave x abs y abs gt { /y 1000 def } { /x -1000 def 500 120 translate } ifelse Level2? { [ /Separation (All) /DeviceCMYK { 0 0 0 1 pop } ] setcolorspace } { 0 setgray } ifelse 10 setlinewidth x .8 mul [ 7 3 ] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? { .2 setcolor } { .8 setgray } ifelse fill grestore stroke } forall pop grestore } bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict /FontName known { FontName dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse def /FontName $fontname dup type /stringtype eq { cvn } if def /currentdistillerparams where { pop } { /FontInfo currentdict /FontInfo known { FontInfo null copyfont } { 2 dict } ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [ 1 0 ItalicAngle dup sin exch cos div 1 0 0 ] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal } bind def end def /$None 1 dict dup begin /$BuildFont {} bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type /stringtype eq { cvn } if dup /$fontname exch def $sname null eq { $str cvs dup length $slen sub $slen getinterval } { pop $sname } ifelse $fontpat dup 0 (fonts/*) putinterval exch 7 exch putinterval /$match false def $SubstituteFont /$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval { /$match exch def exit } $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont /$dstack get { exch { 1 index eq { pop false } { true } ifelse } { begin false } ifelse } forall pop } if cleartomark /$slen 0 def $match false ne { $match (fonts/) anchorsearch pop pop cvn } { /Courier } ifelse } bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [ /Ryumin-Light /HeiseiMin-W3 /GothicBBB-Medium /HeiseiKakuGo-W5 /HeiseiMaruGo-W4 /Jun101-Light ] def /Korea1 [ /HYSMyeongJo-Medium /HYGoThic-Medium ] def /GB1 [ /STSong-Light /STHeiti-Regular ] def /CNS1 [ /MKai-Medium /MHei-Medium ] def end def end def /$cmapname null def /$deepcopyfont { dup /FontType get 0 eq { 1 dict dup /FontName /copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup /FontName /copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } { $Strategies /$Type3Underprint get exec } ifelse } bind def /$buildfontname { dup /CIDFont findresource /CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index (-) putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy (-) putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch { pop pop 3 2 roll putinterval cvn /$cmapname exch def } { pop pop pop pop pop } ifelse length $str 1 index (-) putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn } bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known { get } { pop pop [] } ifelse } { pop pop [] } ifelse false exch { dup /CIDFont resourcestatus { pop pop save 1 index /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get } { false } ifelse exch pop exch restore { pop } { exch pop true exit } ifelse } { pop } ifelse } forall { $str cvs $buildfontname } { false (*) { save exch dup /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get not } { true } ifelse exch /CIDSystemInfo get dup /Registry get Registry eq exch /Ordering get Ordering eq and and { exch restore exch pop true exit } { pop restore } ifelse } $str /CIDFont resourceforall { $buildfontname } { $fontname $findfontByEnum } ifelse } ifelse } bind def end end currentdict /$error known currentdict /languagelevel known and dup { pop $error /SubstituteFont known } if dup { $error } { Adobe_CoolType_Core } ifelse begin { /SubstituteFont /CMap /Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq { dup $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse Adobe_CoolType_Data /InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } { FontDirectory 1 index known { exch pop true exit } { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } ifelse } ifelse } forall } { pop pop false } ifelse { exch pop exch pop } { dup /CMap resourcestatus { pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS } { 128 string cvs dup (-) search { 3 1 roll search { 3 1 roll pop { dup cvi } stopped { pop pop pop pop pop $findfontByEnum } { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup /CMap resourcestatus { pop pop 4 1 roll pop pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS true exit } { pop } ifelse } for dup type /booleantype eq { pop } { pop pop pop $findfontByEnum } ifelse } ifelse } { pop pop pop $findfontByEnum } ifelse } { pop pop $findfontByEnum } ifelse } ifelse } ifelse } { //SubstituteFont exec } ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $findfontByEnum } { //SubstituteFont exec } ifelse end } } ifelse bind readonly def Adobe_CoolType_Core /scfindfont /systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup /FontName known { dup /FontName get dup 3 index ne } { /noname true } ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def /$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin { 1 index /FID eq { pop pop } { def } ifelse } forall currentdict end definefont dup /FontName known { dup /FontName get } { null } ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using ) print dup /FontName known { dup /FontName get } { (unspecified font) } ifelse $str cvs print (.\n) print } if } { exch pop } ifelse } { exch pop } ifelse end } bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core /findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type /stringtype ne { $str cvs } if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne { dup $inVMIndex $AddInVMFont } if $doSmartSub { currentdict /$Strategy known { $Strategy /$BuildFont get exec } if } if } if end } bind put } if } if end /$AddInVMFont { exch /FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data /InVMFontsByCMap get exch $DictAdd } { pop pop pop } ifelse } bind def /$DictAdd { 2 copy known not { 2 copy 4 index length dict put } if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get { forall } def 2 copy currentdict put end } { pop } ifelse } if get begin { def } forall end } bind def end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.21 0 %%Copyright: Copyright 1987-2005 Adobe Systems Incorporated. %%Version: 1.21 0 systemdict /languagelevel known dup { currentglobal false setglobal } { false } ifelse exch userdict /Adobe_CoolType_Utility 2 copy known { 2 copy get dup maxlength 27 add dict copy } { 27 dict } ifelse put Adobe_CoolType_Utility begin /@eexecStartData <BAB431EA07F209EB8C4348311481D9D3F76E3D15246555577D87BC510ED54E 118C39697FA9F6DB58128E60EB8A12FA24D7CDD2FA94D221FA9EC8DA3E5E6A1C 4ACECC8C2D39C54E7C946031DD156C3A6B4A09AD29E1867A> def /@recognizeCIDFont null def /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch /eCCRun known not ct_Level2? and or def ct_Level2? { globaldict begin currentglobal true setglobal } if /ct_AddStdCIDMap ct_Level2? { { mark Adobe_CoolType_Utility /@recognizeCIDFont currentdict put { ((Hex) 57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77) 0 () /SubFileDecode filter cvx exec } stopped { cleartomark Adobe_CoolType_Utility /@recognizeCIDFont get countdictstack dup array dictstack exch 1 sub -1 0 { 2 copy get 3 index eq { 1 index length exch sub 1 sub { end } repeat exit } { pop } ifelse } for pop pop Adobe_CoolType_Utility /@eexecStartData get eexec } { cleartomark } ifelse } } { { Adobe_CoolType_Utility /@eexecStartData get eexec } } ifelse bind def userdict /cid_extensions known dup { cid_extensions /cid_UpdateDB known and } if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type /stringtype eq { exch cvn exch } if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq { pop pop cid_UpdateDB } { exch 1 index /Created get eq { exch pop exch pop } { pop cid_UpdateDB } ifelse } ifelse } { pop cid_UpdateDB } ifelse } { cid_UpdateDB } ifelse end } bind def end } if ct_Level2? { end setglobal } if /ct_UseNativeCapability? systemdict /composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring () def /usewidths? true def end def ct_Level2? { setglobal } { pop } ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict /languagelevel known { pop /CIDFont findresource /GlyphDirectory get } { 1 index /CIDFont findresource /GlyphDirectory get dup type /dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + } def /+ { systemdict /languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } { 1 dict begin } ifelse /$ exch def systemdict /languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ? { $ begin } if } def /? { $ type /dicttype eq } def /| { userdict /Adobe_CoolType_Data known { Adobe_CoolType_Data /AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data /CC 3 index put ? { def } { $ 3 1 roll put } ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont /Widths get exch CC exch put } { ? { def } { $ 3 1 roll put } ifelse } ifelse end end } { ? { def } { $ 3 1 roll put } ifelse } ifelse } { ? { def } { $ 3 1 roll put } ifelse } ifelse } def /! { ? { end } if systemdict /languagelevel known { gvm setglobal } if end } def /: { string currentfile exch readstring pop } executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx [.001 0 0 .001 0 0] def /ct_1000Mtx [1000 0 0 1000 0 0] def /ct_raise {exch cvx exch errordict exch get exec stop} bind def /ct_reraise { cvx $error /errorname get (Error: ) print dup ( ) cvs print errordict exch get exec stop } bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop } bind def /ct_GetInterval { Adobe_CoolType_Utility /ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt { dup string /dst_string exch def } if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add /dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add /dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt { arrayIndex get } { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end } bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal { /unknowninstancename /Category resourcestatus } stopped { cleartomark setglobal true } { cleartomark currentglobal not exch setglobal } ifelse { { mark 3 1 roll /Category findresource begin ct_Vars /vm currentglobal put ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse ct_Vars /vm get setglobal end } } { { resourcestatus } } ifelse bind def /CIDFont /Category ct_resourcestatus { pop pop } { currentglobal true setglobal /Generic /Category findresource dup length dict copy dup /InstanceType /dicttype put /CIDFont exch /Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /CMapName /Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 1 begincidrange <0000> <FFFF> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } { pop pop /defineresource /undefined ct_raise } ifelse } bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known { get 3 1 roll pop pop} { pop pop /findresource /undefinedresource ct_raise } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /ct_resourcestatus /resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup (Binary) eq { pop null currentfile ct_Level2? { { cid_BYTE_COUNT () /SubFileDecode filter } stopped { pop pop pop } if } if /readstring load exit } if dup (Hex) eq { pop currentfile ct_Level2? { { null exch /ASCIIHexDecode filter /readstring } stopped { pop exch pop (>) exch /readhexstring } if } { (>) exch /readhexstring } ifelse load exit } if /StartData /typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch /GlyphData exch put 2 index null eq { pop pop pop } { pop /readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse } bind def /StartData { mark { currentdict dup /FDArray get 0 get /FontMatrix get 0 get 0.001 eq { dup /CDevProc known not { /CDevProc 1183615869 internaldict /stdCDevProc 2 copy known { get } { pop pop { pop pop pop pop pop 0 -1000 7 index 2 div 880 } } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp /cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul } def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup /cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup /SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup /SubrMapOffset undef dup /SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } { pop } ifelse } forall } if cleartomark pop pop end CIDFontName currentdict /CIDFont defineresource pop end end } stopped { cleartomark /StartData ct_reraise } if } bind def currentdict end def /ct_saveCIDInit { /CIDInit /ProcSet ct_resourcestatus { true } { /CIDInitC /ProcSet ct_resourcestatus } ifelse { pop pop /CIDInit /ProcSet findresource ct_UseNativeCapability? { pop null } { /CIDInit ct_CIDInit /ProcSet defineresource pop } ifelse } { /CIDInit ct_CIDInit /ProcSet defineresource pop null } ifelse ct_Vars exch /ct_oldCIDInit exch put } bind def /ct_restoreCIDInit { ct_Vars /ct_oldCIDInit get dup null ne { /CIDInit exch /ProcSet defineresource pop } { pop } ifelse } bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility /ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge { pop 0 } if /cid exch def { GlyphDirectory cid 2 copy known { get } { pop pop nullstring } ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne { 0 FDBytes ct_cvnsi } { pop 0 } ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq { /charstring nullstring def exit } if /cid 0 def } ifelse } loop } def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto } def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont /Widths get cid 2 copy known { get exch pop aload pop } { pop pop stringwidth } ifelse } { stringwidth } ifelse setcharwidth 0 0 moveto } ifelse } def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known { get } { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup /FontMatrix 2 copy known { get } { pop pop ct_defaultFontMtx } ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont /Widths get def /CharStrings 1 dict dup /.notdef <d841272cf18f54fc13> dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup /CharStrings get 1 index /Encoding get ct_dfCharCode get charstring put rootfont /WMode 2 copy known { get } { pop pop 0 } ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } { ct_str1 show } ifelse } def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup /FontMatrix get dup ct_defaultFontMtx ct_matrixeq not { ct_1000Mtx matrix concatmatrix concat } { pop } ifelse /Private get Adobe_CoolType_Utility /ct_Level2? get not { ct_dfDict /Private 3 -1 roll { put } 1183615869 internaldict /superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility /ct_Level2? get { 1 index } { 3 index /Private get mark 6 1 roll } ifelse dup /RunInt known { /RunInt get } { pop /CCRun } ifelse get exec Adobe_CoolType_Utility /ct_Level2? get not { cleartomark } if } bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility /ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped { stop } if end end end end } bind def /BaseFontNameStr (BF00) def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /BuildChar /ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString /ct_Type3ShowCharString load def /ct_dfSetCacheProc /ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup /lenIV 4 put def /CharStrings 1 dict dup /.notdef <d841272cf18f54fc13> put def /PaintType 0 def /ct_ShowCharString /ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not { exit } if } for exch pop exch pop } bind def /ct_makeocf { 15 dict begin exch /WMode exch def exch /FontName exch def /FontType 0 def /FMapType 2 def dup /FontMatrix known { dup /FontMatrix get /FontMatrix exch def } { /FontMatrix matrix def } ifelse /bfCount 1 index /CIDCount get 256 idiv 1 add dup 256 gt { pop 256} if def /Encoding 256 array 0 1 bfCount 1 sub { 2 copy dup put pop } for bfCount 1 255 { 2 copy bfCount put pop } for def /FDepVector bfCount dup 256 lt { 1 add } if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont /FontBBox known { CIDFont /FontBBox get /FontBBox exch def } if CIDFont /CDevProc known { CIDFont /CDevProc get /CDevProc exch def } if currentdict end BaseFontNameStr 3 (0) putinterval 0 1 bfCount dup 256 eq { 1 sub } if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup /CIDFirstByte exch 256 mul def FontType 3 eq { /ct_FDDict 2 dict def } if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? { /Widths 1 index /CIDFont get /GlyphDirectory get length dict def } if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont /Widths get begin exch /CIDFont get /GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } { exch pop } ifelse } bind def /ct_ComposeFont { ct_UseNativeCapability? { 2 index /CMap ct_resourcestatus { pop pop exch pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch /WMode exch def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity)} ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> <FFFF> endcodespacerange 1 begincidrange <0000> <FFFF> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def /ct_MakeIdentity { ct_UseNativeCapability? { 1 index /CMap ct_resourcestatus { pop pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity) } ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> <FFFF> endcodespacerange 1 begincidrange <0000> <FFFF> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { exch pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def currentdict readonly pop end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. %%Version: 1.0 0 userdict /ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge } bind def /AllocGlyphStorage { Is2015? { pop } { {string} forall } ifelse } bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def 4 array astore cvx /FontBBox exch def /sfnts } bind def /Type42DictEnd { currentdict dup /FontName get exch definefont end ct_T42Dict exch dup /FontName get exch put } bind def /RD {string currentfile exch readstring pop} executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop } ifelse } bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop } ifelse } bind def /T0AddT42Mtx2 { /CIDFont findresource /Metrics2 get begin def end }bind def end %%EndResource Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Image 75 dict dup begin put /Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd /AGMIMG_mbuf () def /AGMIMG_ybuf () def /AGMIMG_kbuf () def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def /AGMIMG_k 0 def /AGMIMG_tmp nd /AGMIMG_imagestring0 nd /AGMIMG_imagestring1 nd /AGMIMG_imagestring2 nd /AGMIMG_imagestring3 nd /AGMIMG_imagestring4 nd /AGMIMG_imagestring5 nd /AGMIMG_cnt nd /AGMIMG_fsave nd /AGMIMG_colorAry nd /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd /AGMIMG_flushfilters nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd /doc_setup { Adobe_AGM_Core begin Adobe_AGM_Image begin /AGMIMG_&image systemdict/image get def /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMIMG_&colorimage /colorimage ldf }if end end }def /page_setup { Adobe_AGM_Image begin /AGMIMG_ccimage_exists {/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where { pop false }{ /Adobe_AGM_InRip_Seps where { pop false }{ true }ifelse }ifelse }{ false }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf /Decode [ Decode 1 get Decode 0 get] def }def /knockout_image_samples { Operator/imagemask ne{ /Decode [1 1] def }if }def }{ /invert_image_samples { {1 exch sub} currenttransfer addprocs settransfer }def /knockout_image_samples { { pop 1 } currenttransfer addprocs settransfer }def }ifelse /img /imageormask ldf /sepimg /sep_imageormask ldf /devnimg /devn_imageormask ldf /idximg /indexed_imageormask ldf /_ctype 7 def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{ bind }if def }forall }def /page_trailer { end }def /doc_trailer { }def /AGMIMG_flushfilters { dup type /arraytype ne {1 array astore}if aload length { dup type /filetype eq { dup status 1 index currentfile ne and {dup flushfile closefile} {pop} ifelse }{pop}ifelse } repeat }def /imageormask_sys { begin save mark level2{ currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMIMG_&imagemask }{ BitsPerComponent ImageMatrix /DataSource load AGMIMG_&image }ifelse }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if cleartomark restore end }def /overprint_plate { currentoverprint { 0 get dup type /nametype eq { dup /DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false exch { AGMOHS_sepink eq or } forall not } ifelse }{ pop false }ifelse }def /process_mask_L3 { dup begin /ImageType 1 def end 4 dict begin /DataDict exch def /ImageType 3 def /InterleaveType 3 def /MaskDict 9 dict begin /ImageType 1 def /Width DataDict dup /MaskWidth known {/MaskWidth}{/Width} ifelse get def /Height DataDict dup /MaskHeight known {/MaskHeight}{/Height} ifelse get def /ImageMatrix [Width 0 0 Height neg 0 Height] def /NComponents 1 def /BitsPerComponent 1 def /Decode [0 1] def /DataSource AGMIMG_maskSource def currentdict end def currentdict end }def /use_mask { dup type /dicttype eq { dup /Mask known { dup /Mask get { level3 {true} { dup /MaskWidth known {dup /MaskWidth get 1 index /Width get eq}{true}ifelse exch dup /MaskHeight known {dup /MaskHeight get 1 index /Height get eq}{true}ifelse 3 -1 roll and } ifelse } {false} ifelse } {false} ifelse } {false} ifelse }def /make_line_source { begin MultipleDataSources { [ Decode length 2 div cvi {Width string} repeat ] }{ Width Decode length 2 div mul cvi string }ifelse end }def /datasource_to_str { exch dup type dup /filetype eq { pop exch readstring }{ /arraytype eq { exec exch copy }{ pop }ifelse }ifelse pop }def /masked_image_simulation { 3 dict begin dup make_line_source /line_source xdf /mask_source AGMIMG_maskSource /LZWDecode filter def dup /Width get 8 div ceiling cvi string /mask_str xdf begin gsave 0 1 translate 1 -1 Height div scale 1 1 Height { pop gsave MultipleDataSources { 0 1 DataSource length 1 sub { dup DataSource exch get exch line_source exch get datasource_to_str } for }{ DataSource line_source datasource_to_str } ifelse << /PatternType 1 /PaintProc [ /pop cvx << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1.0 sub 1 matrix scale 0.5 0 matrix translate matrix concatmatrix /MultipleDataSources MultipleDataSources /DataSource line_source /BitsPerComponent BitsPerComponent /Decode Decode >> /image cvx ] cvx /BBox [0 0 Width 1] /XStep Width /YStep 1 /PaintType 1 /TilingType 2 >> matrix makepattern set_pattern << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1 matrix scale /MultipleDataSources false /DataSource mask_source mask_str readstring pop /BitsPerComponent 1 /Decode [0 1] >> imagemask grestore 0 1 translate } for grestore end end }def /imageormask { begin SkipImageProc { currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict Operator /imagemask eq DeviceN_PS2 not and { imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ [/Separation /Black /DeviceGray {}] setcolorspace /Decode [ Decode 1 get Decode 0 get ] def }if use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { Names convert_to_process not { 2 dict begin /imageDict xdf /names_index 0 def gsave imageDict write_image_file { Names { dup (None) ne { [/Separation 3 -1 roll /DeviceGray {1 exch sub}] setcolorspace Operator imageDict read_image_file names_index 0 eq {true setoverprint} if /names_index names_index 1 add def }{ pop } ifelse } forall close_image_file } if grestore end }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load /Adobe_AGM_OnHost_Seps where { pop imagemask }{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator /colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ /DataSource [ DataSource 0 get /exec cvx DataSource 1 get /exec cvx DataSource 2 get /exec cvx DataSource 3 get /exec cvx /AGMCORE_get_ink_data cvx ] cvx def }{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load filter_cmyk 0 () /SubFileDecode filter def }ifelse /Decode [ Decode 0 get Decode 1 get ] def /MultipleDataSources false def /NComponents 1 def /Operator /image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator /image eq{ AGMCORE_host_sep{ /DoImage true def HostSepColorImage{ invert_image_samples }{ AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if }ifelse 1 AGMCORE_&setgray DoImage {currentdict imageormask_sys} if }{ use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ image }ifelse }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentcolorspace overprint_plate not{ knockout_unitsq }if }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin CSA map_csa begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_avoid_L2_sep_space{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def }if AGMIMG_ccimage_exists MappedCSA 0 get /DeviceCMYK eq and currentdict/Components known and Name () ne and Name (All) ne and Operator /image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load /exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for } /exec cvx ] cvx bind MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator /imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentdict/ImageMatrix get concat knockout_unitsq }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name (All) ne and{ level2{ Name AGMCORE_IsSeparationAProcessColor { Operator /imagemask eq{ /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor }{ invert_image_samples }ifelse }{ [ /Separation Name [/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub } bind ] AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor }ifelse currentdict imageormask_sys }{ currentdict Operator /imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name (All) eq or Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentcolorspace 0 get /Separation ne{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentoverprint MappedCSA 0 get /DeviceCMYK eq and Name AGMCORE_IsSeparationAProcessColor not and Name inRip_spot_has_ink not and Name (All) ne and { imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end }def /decode_image_sample { 4 1 roll exch dup 5 1 roll sub 2 4 -1 roll exp 1 sub div mul add } bdf /colorSpaceElemCnt { mark currentcolor counttomark dup 2 add 1 roll cleartomark } bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ 0 1 dataSource length 1 sub { dup currentdict /dataSource get /exch cvx /get cvx /exec cvx /exch cvx names_index /ne cvx [ /pop cvx ] cvx /if cvx } for ] cvx bind end } bdf /devn_alt_datasource { 11 dict begin /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf /dsCnt origMultipleDataSources {origDataSource length}{1}ifelse def /DataSource origMultipleDataSources { [ BitsPerComponent 8 idiv origDecode length 2 idiv mul string 0 1 origDecode length 2 idiv 1 sub { dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch origDataSource exch get 0 () /SubFileDecode filter BitsPerComponent 8 idiv string /readstring cvx /pop cvx /putinterval cvx }for ]bind cvx }{origDataSource}ifelse 0 () /SubFileDecode filter def [ origcolorSpaceElemCnt string 0 2 origDecode length 2 sub { dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div 1 BitsPerComponent 8 idiv {DataSource /read cvx /not cvx{0}/if cvx /mul cvx}repeat /mul cvx /add cvx }for /convProc load /exec cvx origcolorSpaceElemCnt 1 sub -1 0 { /dup cvx 2 /add cvx /index cvx 3 1 /roll cvx /exch cvx 255 /mul cvx /cvi cvx /put cvx }for ]bind cvx 0 () /SubFileDecode filter end } bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin CSA map_csa 2 dict begin dup /srcDataStrs [ 3 -1 roll begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi { dup 65535 gt {1 add 2 div cvi}{exit}ifelse } loop string } repeat end ] def /dstDataStr srcDataStrs 0 get length string def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_producing_seps not { level3 not { Operator /imagemask ne { /DataSource [ [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse colorSpaceElemCnt /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource 1 /string cvx /readstring cvx /pop cvx] cvx colorSpaceElemCnt 1 sub{dup}repeat] def /MultipleDataSources true def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def } if }if currentdict imageormask }{ AGMCORE_host_sep{ Names convert_to_process { CSA get_csa_by_name 0 get /DeviceCMYK eq { /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse 4 /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource filter_cmyk 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode [1 0] def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate { /DataSource DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse CSA get_csa_by_name 0 get /DeviceRGB eq{3}{1}ifelse /devicen_colorspace_dict AGMCORE_gget /TintTransform get devn_alt_datasource /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def currentdict imageormask_sys } { gsave knockout_unitsq grestore currentdict consumeimagedata } ifelse } ifelse } { /devicen_colorspace_dict AGMCORE_gget /names_index known { Operator/imagemask ne{ MultipleDataSources { /DataSource [ DataSource devn_sep_datasource /exec cvx ] cvx def /MultipleDataSources false def }{ /DataSource /DataSource load dstDataStr srcDataStrs 0 get filter_devn def } ifelse invert_image_samples } if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentdict imageormask }ifelse }ifelse cleartomark restore }ifelse currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end end end }def /imageormask_l2_overprint { currentdict currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ level3{ currentcmykcolor /AGMIMG_k xdf /AGMIMG_y xdf /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ [/DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK {}] setcolorspace AGMIMG_c 0 ne {AGMIMG_c} if AGMIMG_m 0 ne {AGMIMG_m} if AGMIMG_y 0 ne {AGMIMG_y} if AGMIMG_k 0 ne {AGMIMG_k} if setcolor }{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def [/Indexed [ /DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK { AGMIMG_k 0 eq {0} if AGMIMG_y 0 eq {0 exch} if AGMIMG_m 0 eq {0 3 1 roll} if AGMIMG_c 0 eq {0 4 1 roll} if } ] 255 { 255 div mark exch dup dup dup AGMIMG_k 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_y 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_m 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_c 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop counttomark 1 roll }{ pop }ifelse counttomark 1 add -1 roll pop } ] setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ [/Separation /Black /DeviceGray {}] setcolorspace gsave /Black [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Yellow /DeviceGray {}] setcolorspace gsave /Yellow [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Magenta /DeviceGray {}] setcolorspace gsave /Magenta [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Cyan /DeviceGray {}] setcolorspace gsave /Cyan [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore } if close_image_file }{ imageormask }ifelse }ifelse }ifelse } def /indexed_imageormask { begin save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget dup /CSA known { /CSA get get_csa_by_name }{ /Names get } ifelse overprint_plate not{ knockout_unitsq }if }{ Indexed_DeviceN { /devicen_colorspace_dict AGMCORE_gget /names_index known { indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata } ifelse }{ AGMCORE_is_cmyk_sep{ Operator /imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ level2{ Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget begin }{ /indexed_colorspace_dict AGMCORE_gget begin CSA get_csa_by_name 0 get /DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and { [/Indexed [/DeviceN [/Cyan /Magenta /Yellow /Black] /DeviceCMYK {}] HiVal Lookup] setcolorspace } if end } ifelse imageormask Indexed_DeviceN { end } if }{ Operator /imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore currentdict /_Filters known {_Filters AGMIMG_flushfilters} if end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin Indexed_DeviceN not { currentcolorspace dup 1 /DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put }for put setcolorspace } if currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse end end }def /OPIimage { dup type /dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /ImageType 1 def /Decode [0 1 def] currentdict end }if dup begin /NComponents 1 cdndf /MultipleDataSources false cdndf /SkipImageProc {false} cdndf /HostSepColorImage false cdndf /Decode [ 0 currentcolorspace 0 get /Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ] cdndf /Operator /image cdndf end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cachemask_level2 { 3 dict begin /LZWEncode filter /WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile 0 (%EndMask) /SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring not {exit} if }loop WriteFilter closefile end }def /cachemask_level3 { currentfile << /Filter [ /SubFileDecode /ASCII85Decode /RunLengthDecode ] /DecodeParms [ << /EODCount 0 /EODString (%EndMask) >> null null ] /Intent 1 >> /ReusableStreamDecode filter }def /spot_alias { /mapto_sep_imageormask { dup type /dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def }{ begin }ifelse /Decode [/customcolor_tint AGMCORE_gget 0] def /Operator /image def /HostSepColorImage false def /SkipImageProc {false} def currentdict end sep_imageormask }bdf /customcolorimage { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget << /Name AGMIMG_colorAry 4 get /CSA [ /DeviceCMYK ] /TintMethod /Subtractive /TintProc null /MappedCSA null /NComponents 4 /Components [ AGMIMG_colorAry aload pop pop ] >> setsepcolorspace mapto_sep_imageormask }ndf Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put current_spot_alias{dup 4 get map_alias}{false}ifelse { false set_spot_alias /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask true set_spot_alias }{ AGMIMG_&customcolorimage }ifelse }bdf }def /snap_to_device { 6 dict begin matrix currentmatrix dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { 1 1 dtransform 0 gt exch 0 gt /AGMIMG_xSign? exch def /AGMIMG_ySign? exch def 0 0 transform AGMIMG_ySign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch AGMIMG_xSign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch itransform /AGMIMG_llY exch def /AGMIMG_llX exch def 1 1 transform AGMIMG_ySign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch AGMIMG_xSign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch itransform /AGMIMG_urY exch def /AGMIMG_urX exch def [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY] concat }{ }ifelse end } def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ dup 2 index exch get 255 exch sub 2 index 3 1 roll put }for }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin /AGMIMG_mbuf 0 string def /AGMIMG_ybuf 0 string def /AGMIMG_kbuf 0 string def { colorbuf dup length AGMIMG_mbuf length ne { dup length dup dup /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def } if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage end } def /sep_imageormask_lev1 { begin MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get } currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get /DeviceGray eq { {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} {AGMIMG_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceGray eq { {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def }if end systemdict /setpacking known { setpacking } if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin 2 2010 Adobe_AGM_Core/doc_setup get exec Adobe_CoolType_Core/doc_setup get exec Adobe_AGM_Image/doc_setup get exec currentdict Adobe_AGM_Utils eq {end} if %%EndSetup %%Page: (Page 1) 1 %%EndPageComments %%BeginPageSetup /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="3.1.1-111"> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <dc:format>application/postscript</dc:format> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang="x-default">TESTOPIA_3s</rdf:li> + </rdf:Alt> + </dc:title> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xap="http://ns.adobe.com/xap/1.0/" + xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xap:CreatorTool>Adobe Illustrator CS2</xap:CreatorTool> + <xap:CreateDate>2006-05-22T11:56:36-06:00</xap:CreateDate> + <xap:ModifyDate>2006-05-22T11:56:36-06:00</xap:ModifyDate> + <xap:MetadataDate>2006-05-22T11:56:36-06:00</xap:MetadataDate> + <xap:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xapGImg:width>208</xapGImg:width> + <xapGImg:height>256</xapGImg:height> + <xapGImg:format>JPEG</xapGImg:format> + <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADQAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYqp3Nzb2 tvLc3Eiw28CNJNK5CqiIOTMxPQACpxV4ZqGu695+Y39zd3Wl+U5q/o3RrWR7aa5gOyz3s0ZWT96P iEKsFC05cjXM/T6UEXJws+qINRY7rf5WeVZNOmbStOis9TROVtcxg8yy7hWYmvxUpXr3zNhgxjnE U40dRO9ylX5cfnn5l8r3cVnrlzNq/l4sqzLcu0t1ap0aSGVuUkgUbtE5Nf2COjVazs4RHFDl3Odj zXsX1Va3Vvd20N1bSrNbXCLLBNGQyOjjkrKw2IINQc1DkKmKuxV2KuxV2KuxV2KuxV2KuxV2KuxV 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 oWOOOONY41CRoAqIooABsAAO2Kt4q7FXYq//2Q==</xapGImg:image> + </rdf:li> + </rdf:Alt> + </xap:Thumbnails> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"> + <xapMM:DocumentID>uuid:33406112EB1C11DA9AE8AF786C667F62</xapMM:DocumentID> + <xapMM:InstanceID>uuid:33406113EB1C11DA9AE8AF786C667F62</xapMM:InstanceID> + <xapMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>uuid:33406111EB1C11DA9AE8AF786C667F62</stRef:instanceID> + <stRef:documentID>uuid:33406110EB1C11DA9AE8AF786C667F62</stRef:documentID> + </xapMM:DerivedFrom> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?> % &&end XMP packet marker&& [{ai_metadata_stream_123} <</Type /Metadata /Subtype /XML>> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 %AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0 Adobe_AGM_Utils begin Adobe_AGM_Core/page_setup get exec Adobe_AGM_Core/capture_currentpagedevice get exec Adobe_CoolType_Core/page_setup get exec Adobe_AGM_Image/page_setup get exec %%EndPageSetup Adobe_AGM_Core/AGMCORE_save save ddf 1 -1 scale 0 -726.521 translate [1 0 0 1 0 0 ] concat % page clip gsave newpath gsave % PSGState 0 0 mo 0 726.521 li 588.223 726.521 li 588.223 0 li cp clp [1 0 0 1 0 0 ] concat 7.29304 lw 0 lc 0 lj 4 ml [] 0 dsh true sadj 244.819 154.515 mo 243.075 154.515 241.473 155.104 240.152 156.105 cv 239.251 123.084 li 238.966 112.665 230.86 104.223 221.146 104.223 cv 217.531 104.223 214.224 105.397 211.523 107.402 cv 208.422 41.3643 li 207.444 20.5254 189.772 3.64648 168.932 3.64648 cv 148.102 3.64648 132.86 20.5254 134.894 41.3643 cv 141.328 107.402 li 138.342 105.397 134.867 104.223 131.246 104.223 cv 121.534 104.223 114.646 112.665 115.868 123.084 cv 119.735 156.105 li 118.272 155.104 116.585 154.515 114.84 154.515 cv 110.157 154.515 106.9 158.735 107.561 163.941 cv 163.501 604.679 li 261.173 604.679 li 253.459 163.941 li 253.37 158.735 249.503 154.515 244.819 154.515 cv cp false sop /0 [/DeviceCMYK] /CSA add_res 0.74902 0.678431 0.670588 0.901961 cmyk @ 163.501 604.679 mo 107.561 163.941 li 106.9 158.735 110.157 154.515 114.84 154.515 cv 119.522 154.515 123.799 158.735 124.394 163.941 cv 174.769 604.679 li 0.352941 0.101961 0 0 cmyk f 171.387 604.679 mo 119.344 163.941 li 118.728 158.735 116.713 154.515 114.84 154.515 cv 119.522 154.515 123.799 158.735 124.394 163.941 cv 174.769 604.679 li 0.882353 0.768627 0 0 cmyk f 172.266 604.679 mo 115.868 123.084 li 114.646 112.665 121.534 104.223 131.246 104.223 cv 140.963 104.223 149.612 112.665 150.568 123.084 cv 194.805 604.679 li 0.352941 0.101961 0 0 cmyk f 188.042 604.679 mo 140.159 123.084 li 139.123 112.665 135.139 104.223 131.246 104.223 cv 140.963 104.223 149.612 112.665 150.568 123.084 cv 194.805 604.679 li 0.882353 0.768627 0 0 cmyk f 189.797 604.679 mo 134.894 41.3643 li 132.86 20.5254 148.102 3.64648 168.932 3.64648 cv 189.772 3.64648 207.444 20.5254 208.422 41.3643 cv 234.877 604.679 li 0.352941 0.101961 0 0 cmyk f 221.354 604.679 mo 186.362 41.3643 li 185.07 20.5254 177.271 3.64648 168.932 3.64648 cv 189.772 3.64648 207.444 20.5254 208.422 41.3643 cv 234.877 604.679 li 0.882353 0.768627 0 0 cmyk f 229.868 604.679 mo 204.55 123.084 li 204.001 112.665 211.434 104.223 221.146 104.223 cv 230.86 104.223 238.966 112.665 239.251 123.084 cv 252.409 604.679 li 0.352941 0.101961 0 0 cmyk f 245.645 604.679 mo 228.841 123.084 li 228.476 112.665 225.036 104.223 221.146 104.223 cv 230.86 104.223 238.966 112.665 239.251 123.084 cv 252.409 604.679 li 0.882353 0.768627 0 0 cmyk f 249.905 604.679 mo 236.627 163.941 li 236.47 158.735 240.139 154.515 244.819 154.515 cv 249.503 154.515 253.37 158.735 253.459 163.941 cv 261.173 604.679 li 0.352941 0.101961 0 0 cmyk f 257.793 604.679 mo 248.411 163.941 li 248.302 158.735 246.69 154.515 244.819 154.515 cv 249.503 154.515 253.37 158.735 253.459 163.941 cv 261.173 604.679 li 0.882353 0.768627 0 0 cmyk f 31.2988 386.679 mo 33.3477 394.086 29.5098 400.092 22.7275 400.092 cv 15.9473 400.092 8.62012 394.086 6.36426 386.679 cv 4.11035 379.271 7.9502 373.265 14.9365 373.265 cv 21.9268 373.265 29.252 379.271 31.2988 386.679 cv cp 0.74902 0.678431 0.670588 0.901961 cmyk f 437.919 609.321 mo 378.852 675.794 li 431.939 248.468 li 515.457 181.995 li 437.919 609.321 li cp 0.352941 0.101961 0 0 cmyk f 5.46978 lw 6 ml 437.919 609.321 mo 378.852 675.794 li 431.939 248.468 li 515.457 181.995 li 437.919 609.321 li cp 0.74902 0.678431 0.670588 0.901961 cmyk @ 424.37 609.321 mo 366.316 675.794 li 412.885 248.468 li 495.387 181.995 li 424.37 609.321 li cp 0.352941 0.101961 0 0 cmyk f 424.37 609.321 mo 366.316 675.794 li 412.885 248.468 li 495.387 181.995 li 424.37 609.321 li cp 0.74902 0.678431 0.670588 0.901961 cmyk @ 410.822 609.321 mo 353.781 675.794 li 393.829 248.468 li 475.316 181.995 li 410.822 609.321 li cp 0.352941 0.101961 0 0 cmyk f 410.822 609.321 mo 353.781 675.794 li 393.829 248.468 li 475.316 181.995 li 410.822 609.321 li cp 0.74902 0.678431 0.670588 0.901961 cmyk @ 397.272 609.321 mo 341.247 675.794 li 374.771 248.468 li 455.249 181.995 li 397.272 609.321 li cp 0.352941 0.101961 0 0 cmyk f 397.272 609.321 mo 341.247 675.794 li 374.771 248.468 li 455.249 181.995 li 397.272 609.321 li cp 0.74902 0.678431 0.670588 0.901961 cmyk @ 383.723 609.321 mo 328.713 675.794 li 355.717 248.468 li 435.18 181.995 li 383.723 609.321 li cp 0.352941 0.101961 0 0 cmyk f 383.723 609.321 mo 328.713 675.794 li 355.717 248.468 li 435.18 181.995 li 383.723 609.321 li cp 0.74902 0.678431 0.670588 0.901961 cmyk @ 370.174 609.321 mo 316.177 675.794 li 336.663 248.468 li 415.108 181.995 li 370.174 609.321 li cp 0.882353 0.768627 0 0 cmyk f 370.174 609.321 mo 316.177 675.794 li 336.663 248.468 li 415.108 181.995 li 370.174 609.321 li cp 0.74902 0.678431 0.670588 0.901961 cmyk @ 480.717 346.36 mo 475.8 323.569 li 479.402 302.329 507.679 285.11 538.965 285.11 cv 570.248 285.11 591.08 302.329 585.494 323.569 cv 570.77 346.16 li 0.352941 0.101961 0 0 cmyk f 3.64652 lw 480.717 346.36 mo 475.8 323.569 li 479.402 302.329 507.679 285.11 538.965 285.11 cv 570.248 285.11 591.08 302.329 585.494 323.569 cv 570.77 346.16 li 0.74902 0.678431 0.670588 0.901961 cmyk @ 480.717 346.36 mo 475.8 323.569 li 478.202 309.409 505.24 297.93 536.192 297.93 cv 567.143 297.93 589.219 309.409 585.494 323.569 cv 570.72 346.36 li f 574.382 340.663 mo 571.95 350.104 549.061 357.756 523.254 357.756 cv 497.446 357.756 477.866 350.104 479.521 340.663 cv 481.173 331.224 504.064 323.569 530.646 323.569 cv 557.229 323.569 576.81 331.224 574.382 340.663 cv cp 0 0 0 0 cmyk f 4 ml 574.382 340.663 mo 571.95 350.104 549.061 357.756 523.254 357.756 cv 497.446 357.756 477.866 350.104 479.521 340.663 cv 481.173 331.224 504.064 323.569 530.646 323.569 cv 557.229 323.569 576.81 331.224 574.382 340.663 cv cp 0.74902 0.678431 0.670588 0.901961 cmyk @ 500.555 552.345 mo 506.639 552.345 li 506.639 552.345 552.653 334.965 528.182 334.965 cv 524.44 352.273 li 546.106 352.273 500.555 552.345 500.555 552.345 cv cp f 446.006 552.345 mo 430.234 552.345 li 430.234 552.345 479.244 334.965 528.182 334.965 cv 524.44 352.272 li 481.104 352.272 446.006 552.345 446.006 552.345 cv cp 0.882353 0.768627 0 0 cmyk f 516.332 552.345 mo 532.102 552.345 li 532.102 552.345 577.125 334.965 528.182 334.965 cv 524.44 352.273 li 567.772 352.273 516.332 552.345 516.332 552.345 cv cp f 461.785 552.345 mo 455.701 552.345 li 455.701 552.345 503.713 334.965 528.182 334.965 cv 524.44 352.272 li 502.775 352.272 461.785 552.345 461.785 552.345 cv cp 0.352941 0.101961 0 0 cmyk f 31.2988 386.679 mo 33.3477 395.938 29.5098 403.445 22.7275 403.445 cv 15.9473 403.445 8.62012 395.938 6.36426 386.679 cv 4.11035 377.42 7.9502 369.912 14.9365 369.912 cv 21.9268 369.912 29.252 377.42 31.2988 386.679 cv cp 0.74902 0.678431 0.670588 0.901961 cmyk f 9.66895 476.706 mo 21.6279 476.706 17.6045 401.257 17.6045 401.257 cv 17.6191 401.257 li 18.8594 400.478 20.3105 400.045 21.9385 400.045 cv 23.5654 400.045 25.2197 400.478 26.8193 401.257 cv 26.833 401.257 li 26.833 401.257 57.8594 476.706 69.8174 476.706 cv 0.882353 0.768627 0 0 cmyk f 1.21551 lw 9.66895 476.706 mo 21.6279 476.706 17.6045 401.257 17.6045 401.257 cv 17.6191 401.257 li 18.8594 400.478 20.3105 400.045 21.9385 400.045 cv 23.5654 400.045 25.2197 400.478 26.8193 401.257 cv 26.833 401.257 li 26.833 401.257 57.8594 476.706 69.8174 476.706 cv 0 0 0 1 cmyk @ 69.8174 476.706 mo 86.0186 556.604 li 30.5801 556.604 li 9.66895 476.706 li 7.24414 467.447 18.9668 459.94 35.8496 459.94 cv 52.7305 459.94 67.9385 467.447 69.8174 476.706 cv cp 0.352941 0.101961 0 0 cmyk f 3.64652 lw 69.8174 476.706 mo 86.0186 556.604 li 30.5801 556.604 li 9.66895 476.706 li 7.24414 467.447 18.9668 459.94 35.8496 459.94 cv 52.7305 459.94 67.9385 467.447 69.8174 476.706 cv cp 0 0 0 1 cmyk @ 53.6387 556.563 mo 44.0537 556.563 li 22.7363 470.396 li 25.6211 469.318 28.9775 468.557 32.6738 468.177 cv 53.6387 556.563 li cp 0 0 0 0 cmyk f 40.3652 556.604 mo 38.293 556.604 li 17.124 473.112 li 17.7344 472.697 18.3896 472.303 19.0859 471.929 cv 40.3652 556.604 li cp f 19.9141 376.137 mo 19.3525 377.213 20.1807 379.394 21.7559 381.005 cv 23.3281 382.617 25.0537 383.054 25.6113 381.979 cv 26.1748 380.904 25.3564 378.727 23.7861 377.113 cv 22.2109 375.499 20.4766 375.063 19.9141 376.137 cv cp 0.352941 0.101961 0 0 cmyk f 1.21551 lw 19.9141 376.137 mo 19.3525 377.213 20.1807 379.394 21.7559 381.005 cv 23.3281 382.617 25.0537 383.054 25.6113 381.979 cv 26.1748 380.904 25.3564 378.727 23.7861 377.113 cv 22.2109 375.499 20.4766 375.063 19.9141 376.137 cv cp 0 0 0 1 cmyk @ 10.4287 375.805 mo 9.75977 378.008 9.7002 380.707 10.3994 383.632 cv 12.1709 391.039 18.0273 397.045 23.4854 397.045 cv 25.6416 397.045 27.416 396.097 28.6807 394.507 cv 27.6504 397.887 25.2412 400.092 21.9492 400.092 cv 16.5068 400.092 10.6484 394.088 8.8584 386.679 cv 7.77832 382.196 8.47656 378.239 10.4287 375.805 cv cp 0 0 0 0 cmyk f 70.9541 344.199 mo 73.0215 355.774 67.5811 365.159 58.8096 365.159 cv 50.0352 365.159 40.9834 355.774 38.5938 344.199 cv 36.2021 332.625 41.6377 323.24 50.7373 323.24 cv 59.835 323.24 68.8867 332.625 70.9541 344.199 cv cp 0.74902 0.678431 0.670588 0.901961 cmyk f 38.1123 456.733 mo 53.3516 456.733 52.3096 362.422 52.3096 362.422 cv 52.3291 362.422 li 53.9766 361.444 55.8828 360.906 57.9902 360.906 cv 60.0967 360.906 62.209 361.444 64.2344 362.422 cv 64.2559 362.422 li 64.2559 362.422 99.5283 456.733 114.769 456.733 cv 0.882353 0.768627 0 0 cmyk f 38.1123 456.733 mo 53.3516 456.733 52.3096 362.422 52.3096 362.422 cv 52.3291 362.422 li 53.9766 361.444 55.8828 360.906 57.9902 360.906 cv 60.0967 360.906 62.209 361.444 64.2344 362.422 cv 64.2559 362.422 li 64.2559 362.422 99.5283 456.733 114.769 456.733 cv 0 0 0 1 cmyk @ 114.766 456.733 mo 130.317 556.604 li 61.0186 556.604 li 38.1123 456.733 li 35.458 445.157 50.8115 435.772 72.4053 435.772 cv 93.9971 435.772 112.964 445.157 114.766 456.733 cv cp 0.352941 0.101961 0 0 cmyk f 3.64652 lw 114.766 456.733 mo 130.317 556.604 li 61.0186 556.604 li 38.1123 456.733 li 35.458 445.157 50.8115 435.772 72.4053 435.772 cv 93.9971 435.772 112.964 445.157 114.766 456.733 cv cp 0 0 0 1 cmyk @ 89.8457 556.557 mo 77.8643 556.557 li 55.0859 448.847 li 58.8262 447.496 63.1504 446.543 67.8896 446.069 cv 89.8457 556.557 li cp 0 0 0 0 cmyk f 73.252 556.604 mo 70.6582 556.604 li 47.7891 452.241 li 48.5898 451.72 49.4424 451.229 50.3486 450.76 cv 73.252 556.604 li cp f 56.8262 331.023 mo 56.0293 332.365 56.9697 335.091 58.917 337.106 cv 60.8604 339.12 63.0713 339.667 63.8652 338.321 cv 64.6631 336.979 63.7412 334.254 61.7979 332.24 cv 59.8506 330.225 57.6221 329.677 56.8262 331.023 cv cp 0.352941 0.101961 0 0 cmyk f 1.21551 lw 56.8262 331.023 mo 56.0293 332.365 56.9697 335.091 58.917 337.106 cv 60.8604 339.12 63.0713 339.667 63.8652 338.321 cv 64.6631 336.979 63.7412 334.254 61.7979 332.24 cv 59.8506 330.225 57.6221 329.677 56.8262 331.023 cv cp 0 0 0 1 cmyk @ 44.5107 330.604 mo 43.5117 333.359 43.2686 336.731 44.0049 340.388 cv 45.8682 349.648 53.1074 357.155 60.1748 357.155 cv 62.9678 357.155 65.3232 355.973 67.0635 353.983 cv 65.5156 358.208 62.2627 360.967 58.001 360.967 cv 50.9561 360.967 43.7158 353.459 41.8291 344.199 cv 40.6875 338.598 41.8291 333.648 44.5107 330.604 cv cp 0 0 0 0 cmyk f 127.202 291.099 mo 128.996 305.564 121.185 317.297 109.755 317.297 cv 98.3232 317.297 87.1914 305.564 84.8887 291.099 cv 82.5859 276.63 90.3994 264.901 102.337 264.901 cv 114.276 264.901 125.406 276.63 127.202 291.099 cv cp 0.74902 0.678431 0.670588 0.901961 cmyk f 76.8994 431.766 mo 96.4053 431.766 101.487 313.876 101.487 313.876 cv 101.514 313.876 li 103.73 312.655 106.255 311.983 109.002 311.983 cv 111.749 311.983 114.464 312.655 117.03 313.876 cv 117.056 313.876 li 117.056 313.876 155.513 431.766 175.018 431.766 cv 0.882353 0.768627 0 0 cmyk f 76.8994 431.766 mo 96.4053 431.766 101.487 313.876 101.487 313.876 cv 101.514 313.876 li 103.73 312.655 106.255 311.983 109.002 311.983 cv 111.749 311.983 114.464 312.655 117.03 313.876 cv 117.056 313.876 li 117.056 313.876 155.513 431.766 175.018 431.766 cv 0 0 0 1 cmyk @ 175.016 431.766 mo 186.939 556.604 li 100.32 556.604 li 76.8994 431.766 li 74.1855 417.297 94.4893 405.567 122.248 405.567 cv 150.011 405.567 173.634 417.297 175.016 431.766 cv cp 0.352941 0.101961 0 0 cmyk f 3.64652 lw 175.016 431.766 mo 186.939 556.604 li 100.32 556.604 li 76.8994 431.766 li 74.1855 417.297 94.4893 405.567 122.248 405.567 cv 150.011 405.567 173.634 417.297 175.016 431.766 cv cp 0 0 0 1 cmyk @ 136.354 556.543 mo 121.374 556.543 li 99.1309 421.907 li 104.016 420.222 109.625 419.029 115.734 418.438 cv 136.354 556.543 li cp 0 0 0 0 cmyk f 115.607 556.604 mo 112.365 556.604 li 89.5635 426.151 li 90.6211 425.5 91.7461 424.882 92.9365 424.302 cv 115.607 556.604 li cp f 109.729 274.628 mo 108.584 276.307 109.606 279.716 112.003 282.233 cv 114.39 284.754 117.246 285.432 118.39 283.753 cv 119.535 282.074 118.539 278.667 116.152 276.148 cv 113.756 273.63 110.872 272.948 109.729 274.628 cv cp 0.352941 0.101961 0 0 cmyk f 1.21551 lw 109.729 274.628 mo 108.584 276.307 109.606 279.716 112.003 282.233 cv 114.39 284.754 117.246 285.432 118.39 283.753 cv 119.535 282.074 118.539 278.667 116.152 276.148 cv 113.756 273.63 110.872 272.948 109.729 274.628 cv cp 0 0 0 1 cmyk @ 93.623 274.105 mo 92.1133 277.549 91.5439 281.765 92.2402 286.333 cv 94.0049 297.912 102.911 307.292 112.134 307.292 cv 115.773 307.292 118.938 305.813 121.362 303.329 cv 119.021 308.612 114.572 312.058 109.013 312.058 cv 99.8291 312.058 90.9209 302.673 89.1191 291.099 cv 88.0303 284.095 89.8838 277.912 93.623 274.105 cv cp 0 0 0 0 cmyk f 352.604 340.534 mo 353.521 325.582 li 354.598 302.461 314.437 284.646 266.696 285.78 cv 219.057 286.919 184.809 304.892 187.01 328.01 cv 188.204 346.901 li 0 0 0 1 cmyk f 352.604 340.534 mo 353.521 325.582 li 354.598 302.461 314.437 284.646 266.696 285.78 cv 219.057 286.919 184.809 304.892 187.01 328.01 cv 188.204 346.901 li @ 269.129 300.733 mo 222.061 301.87 185.793 321.534 187.985 344.661 cv 190.183 367.773 227.354 385.588 271.118 384.461 cv 314.973 383.314 351.498 363.648 352.604 340.534 cv 353.692 317.419 316.276 299.597 269.129 300.733 cv cp 0.352941 0.101961 0 0 cmyk f 269.129 300.733 mo 222.061 301.87 185.793 321.534 187.985 344.661 cv 190.183 367.773 227.354 385.588 271.118 384.461 cv 314.973 383.314 351.498 363.648 352.604 340.534 cv 353.692 317.419 316.276 299.597 269.129 300.733 cv cp 0 0 0 1 cmyk @ 350.744 368.877 mo 351.666 353.924 li 352.751 330.803 313.555 312.988 266.933 314.128 cv 220.407 315.262 186.995 333.233 189.185 356.351 cv 190.387 375.242 li f 350.744 368.877 mo 351.666 353.924 li 352.751 330.803 313.555 312.988 266.933 314.128 cv 220.407 315.262 186.995 333.233 189.185 356.351 cv 190.387 375.242 li @ 269.312 329.078 mo 223.357 330.216 187.985 349.881 190.17 373.002 cv 192.357 396.12 228.617 413.933 271.262 412.804 cv 314.001 411.659 349.632 391.997 350.744 368.877 cv 351.846 345.762 315.342 327.942 269.312 329.078 cv cp 0.352941 0.101961 0 0 cmyk f 269.312 329.078 mo 223.357 330.216 187.985 349.881 190.17 373.002 cv 192.357 396.12 228.617 413.933 271.262 412.804 cv 314.001 411.659 349.632 391.997 350.744 368.877 cv 351.846 345.762 315.342 327.942 269.312 329.078 cv cp 0 0 0 1 cmyk @ 348.889 397.222 mo 349.81 382.271 li 350.908 359.146 312.676 341.332 267.17 342.47 cv 221.76 343.608 189.181 361.58 191.362 384.696 cv 192.568 403.588 li f 348.889 397.222 mo 349.81 382.271 li 350.908 359.146 312.676 341.332 267.17 342.47 cv 221.76 343.608 189.181 361.58 191.362 384.696 cv 192.568 403.588 li @ 269.493 357.425 mo 224.658 358.561 190.18 378.226 192.354 401.349 cv 194.53 424.465 229.876 442.277 271.408 441.144 cv 313.03 440.004 347.765 420.338 348.889 397.222 cv 349.997 374.107 314.408 356.284 269.493 357.425 cv cp 0.352941 0.101961 0 0 cmyk f 269.493 357.425 mo 224.658 358.561 190.18 378.226 192.354 401.349 cv 194.53 424.465 229.876 442.277 271.408 441.144 cv 313.03 440.004 347.765 420.338 348.889 397.222 cv 349.997 374.107 314.408 356.284 269.493 357.425 cv cp 0 0 0 1 cmyk @ 208.146 302.487 mo 208.592 310.295 li 214.704 306.908 li 214.297 299.1 li 208.146 302.487 li cp 0 0 0 0 cmyk f 198.62 308.619 mo 199.135 316.426 li 196.931 319.177 li 196.401 311.37 li 198.62 308.619 li cp f 209.773 330.828 mo 210.222 338.638 li 216.181 335.252 li 215.773 327.446 li 209.773 330.828 li cp f 200.484 336.966 mo 201 344.771 li 198.85 347.52 li 198.323 339.712 li 200.484 336.966 li cp f 211.403 359.176 mo 211.85 366.979 li 217.658 363.598 li 217.252 355.79 li 211.403 359.176 li cp f 202.349 365.307 mo 202.863 373.116 li 200.774 375.867 li 200.243 368.061 li 202.349 365.307 li cp f 226.583 295.372 mo 226.911 303.18 li 236.458 300.733 li 236.195 292.927 li 226.583 295.372 li cp f 227.767 323.715 mo 228.093 331.523 li 237.413 329.077 li 237.15 321.269 li 227.767 323.715 li cp f 228.952 352.058 mo 229.276 359.865 li 238.369 357.419 li 238.105 349.613 li 228.952 352.058 li cp f 347.03 425.571 mo 347.955 410.618 li 349.062 387.498 311.796 369.684 267.405 370.817 cv 223.112 371.954 191.368 389.929 193.54 413.046 cv 194.751 431.937 li 0 0 0 1 cmyk f 347.03 425.571 mo 347.955 410.618 li 349.062 387.498 311.796 369.684 267.405 370.817 cv 223.112 371.954 191.368 389.929 193.54 413.046 cv 194.751 431.937 li @ 269.674 385.771 mo 225.954 386.908 192.371 406.57 194.538 429.696 cv 196.705 452.811 231.138 470.624 271.552 469.496 cv 312.058 468.351 345.895 448.687 347.03 425.571 cv 348.149 402.455 313.472 384.635 269.674 385.771 cv cp 0.352941 0.101961 0 0 cmyk f 269.674 385.771 mo 225.954 386.908 192.371 406.57 194.538 429.696 cv 196.705 452.811 231.138 470.624 271.552 469.496 cv 312.058 468.351 345.895 448.687 347.03 425.571 cv 348.149 402.455 313.472 384.635 269.674 385.771 cv cp 0 0 0 1 cmyk @ 345.17 453.915 mo 346.096 438.961 li 347.216 415.838 310.916 398.025 267.642 399.165 cv 224.465 400.3 193.555 418.271 195.717 441.391 cv 196.935 460.278 li f 345.17 453.915 mo 346.096 438.961 li 347.216 415.838 310.916 398.025 267.642 399.165 cv 224.465 400.3 193.555 418.271 195.717 441.391 cv 196.935 460.278 li @ 269.855 414.114 mo 227.252 415.253 194.566 434.918 196.721 458.038 cv 198.878 481.155 232.397 498.971 271.697 497.84 cv 311.087 496.696 344.025 477.033 345.17 453.915 cv 346.302 430.8 312.539 412.979 269.855 414.114 cv cp 0.352941 0.101961 0 0 cmyk f 269.855 414.114 mo 227.252 415.253 194.566 434.918 196.721 458.038 cv 198.878 481.155 232.397 498.971 271.697 497.84 cv 311.087 496.696 344.025 477.033 345.17 453.915 cv 346.302 430.8 312.539 412.979 269.855 414.114 cv cp 0 0 0 1 cmyk @ 343.314 482.258 mo 344.24 467.307 li 345.371 444.183 310.035 426.37 267.877 427.507 cv 225.816 428.646 195.741 446.617 197.893 469.731 cv 199.117 488.624 li f 343.314 482.258 mo 344.24 467.307 li 345.371 444.183 310.035 426.37 267.877 427.507 cv 225.816 428.646 195.741 446.617 197.893 469.731 cv 199.117 488.624 li @ 270.037 442.461 mo 228.55 443.597 196.761 463.261 198.906 486.385 cv 201.052 509.5 233.658 527.314 271.842 526.183 cv 310.116 525.04 342.16 505.374 343.314 482.258 cv 344.453 459.146 311.604 441.323 270.037 442.461 cv cp 0.352941 0.101961 0 0 cmyk f 270.037 442.461 mo 228.55 443.597 196.761 463.261 198.906 486.385 cv 201.052 509.5 233.658 527.314 271.842 526.183 cv 310.116 525.04 342.16 505.374 343.314 482.258 cv 344.453 459.146 311.604 441.323 270.037 442.461 cv cp 0 0 0 1 cmyk @ 213.031 387.524 mo 213.481 395.329 li 219.14 391.943 li 218.733 384.137 li 213.031 387.524 li cp 0 0 0 0 cmyk f 204.213 393.656 mo 204.727 401.461 li 202.696 404.214 li 202.165 396.407 li 204.213 393.656 li cp f 214.658 415.868 mo 215.108 423.673 li 220.617 420.287 li 220.209 412.483 li 214.658 415.868 li cp f 206.079 422.002 mo 206.591 429.807 li 204.615 432.559 li 204.088 424.749 li 206.079 422.002 li cp f 216.289 444.213 mo 216.734 452.015 li 222.096 448.634 li 221.688 440.825 li 216.289 444.213 li cp f 207.943 450.345 mo 208.455 458.154 li 206.537 460.903 li 206.009 453.096 li 207.943 450.345 li cp f 230.136 380.409 mo 230.462 388.216 li 239.325 385.771 li 239.063 377.963 li 230.136 380.409 li cp f 231.32 408.752 mo 231.646 416.56 li 240.279 414.114 li 240.017 406.305 li 231.32 408.752 li cp f 232.504 437.096 mo 232.829 444.905 li 241.235 442.459 li 240.972 434.651 li 232.504 437.096 li cp f 341.458 510.607 mo 342.385 495.653 li 343.523 472.535 309.155 454.719 268.115 455.853 cv 227.168 456.991 197.927 474.964 200.068 498.084 cv 201.3 516.973 li 0 0 0 1 cmyk f 341.458 510.607 mo 342.385 495.653 li 343.523 472.535 309.155 454.719 268.115 455.853 cv 227.168 456.991 197.927 474.964 200.068 498.084 cv 201.3 516.973 li @ 270.22 470.809 mo 229.848 471.945 198.956 491.608 201.09 514.733 cv 203.225 537.849 234.918 555.659 271.985 554.534 cv 309.144 553.388 340.292 533.722 341.458 510.607 cv 342.606 487.491 310.67 469.669 270.22 470.809 cv cp 0.352941 0.101961 0 0 cmyk f 270.22 470.809 mo 229.848 471.945 198.956 491.608 201.09 514.733 cv 203.225 537.849 234.918 555.659 271.985 554.534 cv 309.144 553.388 340.292 533.722 341.458 510.607 cv 342.606 487.491 310.67 469.669 270.22 470.809 cv cp 0 0 0 1 cmyk @ 339.603 538.95 mo 340.53 523.998 li 341.678 500.875 308.275 483.062 268.351 484.2 cv 228.521 485.336 200.114 503.308 202.246 526.426 cv 203.481 545.316 li f 339.603 538.95 mo 340.53 523.998 li 341.678 500.875 308.275 483.062 268.351 484.2 cv 228.521 485.336 200.114 503.308 202.246 526.426 cv 203.481 545.316 li @ 339.603 538.95 mo 340.761 515.833 309.736 498.016 270.399 499.151 cv 231.146 500.288 201.148 519.954 203.273 543.076 cv 0.352941 0.101961 0 0 cmyk f 339.603 538.95 mo 340.761 515.833 309.736 498.016 270.399 499.151 cv 231.146 500.288 201.148 519.954 203.273 543.076 cv 0 0 0 1 cmyk @ 337.741 567.296 mo 338.673 552.345 li 339.834 529.219 307.396 511.405 268.589 512.544 cv 229.874 513.683 202.302 531.656 204.421 554.768 cv 205.666 573.66 li f 337.741 567.296 mo 338.673 552.345 li 339.834 529.219 307.396 511.405 268.589 512.544 cv 229.874 513.683 202.302 531.656 204.421 554.768 cv 205.666 573.66 li @ 217.917 472.56 mo 218.366 480.367 li 223.576 476.981 li 223.167 469.174 li 217.917 472.56 li cp 0 0 0 0 cmyk f 209.806 478.691 mo 210.32 486.5 li 208.46 489.249 li 207.931 481.443 li 209.806 478.691 li cp f 219.546 500.901 mo 219.994 508.71 li 225.052 505.325 li 224.645 497.521 li 219.546 500.901 li cp f 211.67 507.039 mo 212.184 514.844 li 210.38 517.595 li 209.851 509.787 li 211.67 507.039 li cp f 233.689 465.446 mo 234.014 473.254 li 242.191 470.809 li 241.93 463.001 li 233.689 465.446 li cp f 234.872 493.788 mo 235.198 501.598 li 243.146 499.151 li 242.883 491.344 li 234.872 493.788 li cp f 21.8791 lw 83.4258 715.581 mo 71.3926 715.581 58.3984 706.253 54.5498 694.852 cv 12.0264 568.857 li 8.17871 557.457 14.876 548.128 26.9082 548.128 cv 532.75 548.128 li 544.784 548.128 551.497 557.462 547.672 568.871 cv 505.436 694.84 li 501.609 706.249 488.635 715.582 476.602 715.582 cv 83.4258 715.581 li cp @ 83.4258 715.581 mo 71.3926 715.581 58.3984 706.253 54.5498 694.852 cv 12.0264 568.857 li 8.17871 557.457 14.876 548.128 26.9082 548.128 cv 532.75 548.128 li 544.784 548.128 551.497 557.462 547.672 568.871 cv 505.436 694.84 li 501.609 706.249 488.635 715.582 476.602 715.582 cv 83.4258 715.581 li cp 0.74902 0.678431 0.670588 0.901961 cmyk f 300.363 679.701 mo 298.781 677.022 298.015 673.869 298.077 670.23 cv 299.227 600.775 li 299.291 596.977 300.277 593.745 302.196 591.084 cv 304.126 588.425 306.4 587.094 309.01 587.091 cv 310.219 587.091 311.331 587.374 312.359 587.913 cv 312.259 587.751 312.169 587.583 312.064 587.423 cv 310.284 584.77 308.048 583.442 305.363 583.444 cv 302.755 583.446 300.479 584.779 298.55 587.438 cv 296.631 590.101 295.643 593.33 295.579 597.128 cv 294.431 666.584 li 294.367 670.274 295.155 673.47 296.78 676.172 cv 297.828 677.923 299.021 679.093 300.363 679.701 cv cp 325.939 574.495 mo 325.938 574.497 li 325.95 574.508 325.959 574.516 325.971 574.526 cv 325.939 574.495 li cp 332.414 581.687 mo 331.53 580.333 330.585 579.153 329.585 578.142 cv 329.588 578.142 li 325.973 574.528 li 326.961 575.531 327.894 576.702 328.767 578.042 cv 332.221 583.395 333.7 589.747 333.237 597.103 cv 329.009 666.471 li 328.546 673.826 326.484 680.194 322.856 685.573 cv 319.277 690.954 315.239 693.666 310.705 693.705 cv 293.97 693.705 li 290.796 693.73 287.938 692.427 285.368 689.854 cv 285.341 689.863 li 288.986 693.51 li 288.991 693.479 li 291.566 696.067 294.433 697.377 297.616 697.35 cv 314.351 697.35 li 318.885 697.316 322.923 694.604 326.503 689.22 cv 330.132 683.841 332.193 677.473 332.654 670.118 cv 336.884 600.749 li 337.347 593.394 335.865 587.041 332.414 581.687 cv cp 0.368627 0.043137 0 0 cmyk f 2.43101 lw 1 ml 300.363 679.701 mo 298.781 677.022 298.015 673.869 298.077 670.23 cv 299.227 600.775 li 299.291 596.977 300.277 593.745 302.196 591.084 cv 304.126 588.425 306.4 587.094 309.01 587.091 cv 310.219 587.091 311.331 587.374 312.359 587.913 cv 312.259 587.751 312.169 587.583 312.064 587.423 cv 310.284 584.77 308.048 583.442 305.363 583.444 cv 302.755 583.446 300.479 584.779 298.55 587.438 cv 296.631 590.101 295.643 593.33 295.579 597.128 cv 294.431 666.584 li 294.367 670.274 295.155 673.47 296.78 676.172 cv 297.828 677.923 299.021 679.093 300.363 679.701 cv cp 325.939 574.495 mo 325.938 574.497 li 325.95 574.508 325.959 574.516 325.971 574.526 cv 325.939 574.495 li cp 332.414 581.687 mo 331.53 580.333 330.585 579.153 329.585 578.142 cv 329.588 578.142 li 325.973 574.528 li 326.961 575.531 327.894 576.702 328.767 578.042 cv 332.221 583.395 333.7 589.747 333.237 597.103 cv 329.009 666.471 li 328.546 673.826 326.484 680.194 322.856 685.573 cv 319.277 690.954 315.239 693.666 310.705 693.705 cv 293.97 693.705 li 290.796 693.73 287.938 692.427 285.368 689.854 cv 285.341 689.863 li 288.986 693.51 li 288.991 693.479 li 291.566 696.067 294.433 697.377 297.616 697.35 cv 314.351 697.35 li 318.885 697.316 322.923 694.604 326.503 689.22 cv 330.132 683.841 332.193 677.473 332.654 670.118 cv 336.884 600.749 li 337.347 593.394 335.865 587.041 332.414 581.687 cv cp 0.368627 0.039216 0 0 cmyk @ 441.978 570.008 mo 416.281 693.705 li 399.677 693.705 li 403.323 697.35 li 419.926 697.35 li 445.623 573.654 li 441.978 570.008 li cp 0.368627 0.043137 0 0 cmyk f 441.978 570.008 mo 416.281 693.705 li 399.677 693.705 li 403.323 697.35 li 419.926 697.35 li 445.623 573.654 li 441.978 570.008 li cp 0.368627 0.039216 0 0 cmyk @ 476.021 640.607 mo 477.035 636.941 li 459.064 637.02 li 444.585 693.705 li 427.85 693.705 li 431.495 697.35 li 448.232 697.35 li 462.711 640.666 li 476.021 640.607 li cp 511.584 581.585 mo 510.779 579.617 509.757 578.018 508.516 576.782 cv 508.52 576.78 li 508.493 576.757 li 508.491 576.755 508.49 576.752 508.488 576.75 cv 504.872 573.134 li 504.87 573.137 li 506.11 574.373 507.135 575.974 507.937 577.939 cv 510.044 583.227 509.926 589.5 507.616 596.762 cv 477.923 693.705 li 461.319 693.705 li 464.965 697.35 li 481.571 697.35 li 511.264 600.41 li 513.572 593.146 513.689 586.873 511.584 581.585 cv cp 473.608 600.456 mo 474.627 596.696 476.424 593.504 479.01 590.873 cv 481.608 588.239 484.217 586.925 486.825 586.923 cv 487.577 586.923 488.26 587.037 488.889 587.24 cv 488.884 587.232 488.882 587.221 488.879 587.213 cv 487.767 584.587 485.864 583.274 483.181 583.276 cv 480.569 583.278 477.962 584.594 475.364 587.226 cv 472.776 589.856 470.98 593.05 469.962 596.808 cv 462.719 623.532 li 467.357 623.519 li 473.608 600.456 li cp 401.511 577.504 mo 401.543 577.495 li 397.896 573.849 li 397.884 573.879 li 399.026 575.015 400.075 576.371 401 578.01 cv 403.965 583.345 404.861 589.673 403.728 596.998 cv 401.65 610.413 li 400.519 617.741 397.753 624.078 393.396 629.425 cv 389.083 634.777 384.51 637.461 379.642 637.482 cv 361.671 637.562 li 355.819 693.705 li 339.085 693.705 li 342.731 697.35 li 359.466 697.35 li 365.316 641.207 li 383.289 641.129 li 388.157 641.108 392.729 638.423 397.04 633.071 cv 401.4 627.726 404.164 621.389 405.298 614.06 cv 407.374 600.645 li 408.507 593.317 407.612 586.991 404.648 581.657 cv 403.715 580.007 402.661 578.645 401.511 577.504 cv cp 371.2 587.039 mo 380.752 587.029 li 381.775 587.029 382.717 587.224 383.574 587.608 cv 383.527 587.523 383.489 587.435 383.441 587.35 cv 381.905 584.702 379.79 583.381 377.104 583.383 cv 367.555 583.392 li 363.147 623.964 li 367.191 623.952 li 371.2 587.039 li cp 0.368627 0.043137 0 0 cmyk f 476.021 640.607 mo 477.035 636.941 li 459.064 637.02 li 444.585 693.705 li 427.85 693.705 li 431.495 697.35 li 448.232 697.35 li 462.711 640.666 li 476.021 640.607 li cp 511.584 581.585 mo 510.779 579.617 509.757 578.018 508.516 576.782 cv 508.52 576.78 li 508.493 576.757 li 508.491 576.755 508.49 576.752 508.488 576.75 cv 504.872 573.134 li 504.87 573.137 li 506.11 574.373 507.135 575.974 507.937 577.939 cv 510.044 583.227 509.926 589.5 507.616 596.762 cv 477.923 693.705 li 461.319 693.705 li 464.965 697.35 li 481.571 697.35 li 511.264 600.41 li 513.572 593.146 513.689 586.873 511.584 581.585 cv cp 473.608 600.456 mo 474.627 596.696 476.424 593.504 479.01 590.873 cv 481.608 588.239 484.217 586.925 486.825 586.923 cv 487.577 586.923 488.26 587.037 488.889 587.24 cv 488.884 587.232 488.882 587.221 488.879 587.213 cv 487.767 584.587 485.864 583.274 483.181 583.276 cv 480.569 583.278 477.962 584.594 475.364 587.226 cv 472.776 589.856 470.98 593.05 469.962 596.808 cv 462.719 623.532 li 467.357 623.519 li 473.608 600.456 li cp 401.511 577.504 mo 401.543 577.495 li 397.896 573.849 li 397.884 573.879 li 399.026 575.015 400.075 576.371 401 578.01 cv 403.965 583.345 404.861 589.673 403.728 596.998 cv 401.65 610.413 li 400.519 617.741 397.753 624.078 393.396 629.425 cv 389.083 634.777 384.51 637.461 379.642 637.482 cv 361.671 637.562 li 355.819 693.705 li 339.085 693.705 li 342.731 697.35 li 359.466 697.35 li 365.316 641.207 li 383.289 641.129 li 388.157 641.108 392.729 638.423 397.04 633.071 cv 401.4 627.726 404.164 621.389 405.298 614.06 cv 407.374 600.645 li 408.507 593.317 407.612 586.991 404.648 581.657 cv 403.715 580.007 402.661 578.645 401.511 577.504 cv cp 371.2 587.039 mo 380.752 587.029 li 381.775 587.029 382.717 587.224 383.574 587.608 cv 383.527 587.523 383.489 587.435 383.441 587.35 cv 381.905 584.702 379.79 583.381 377.104 583.383 cv 367.555 583.392 li 363.147 623.964 li 367.191 623.952 li 371.2 587.039 li cp 0.368627 0.039216 0 0 cmyk @ 34.1709 583.674 mo 37.8164 587.322 li 54.3945 587.307 li 53.3496 583.658 li 34.1709 583.674 li cp 0.368627 0.043137 0 0 cmyk f 34.1709 583.674 mo 37.8164 587.322 li 54.3945 587.307 li 53.3496 583.658 li 34.1709 583.674 li cp 0.368627 0.039216 0 0 cmyk @ 76.0645 587.288 mo 95.2451 587.275 li 91.9541 573.653 li 88.3066 570.007 li 91.5986 583.627 li 72.418 583.644 li 101.467 693.705 li 84.8623 693.705 li 88.5078 697.35 li 105.113 697.35 li 76.0645 587.288 li cp 0.368627 0.043137 0 0 cmyk f 76.0645 587.288 mo 95.2451 587.275 li 91.9541 573.653 li 88.3066 570.007 li 91.5986 583.627 li 72.418 583.644 li 101.467 693.705 li 84.8623 693.705 li 88.5078 697.35 li 105.113 697.35 li 76.0645 587.288 li cp 0.368627 0.039216 0 0 cmyk @ 169.417 683.776 mo 165.771 680.127 li 168.145 693.705 li 126.405 693.705 li 130.053 697.35 li 171.792 697.35 li 169.417 683.776 li cp 150.758 628.414 mo 147.111 624.768 li 149.679 638.564 li 131.74 638.644 li 140.308 679.76 li 143.202 679.799 li 135.387 642.289 li 153.324 642.212 li 150.758 628.414 li cp 128.861 624.83 mo 131.746 624.819 li 123.917 587.253 li 152.632 587.229 li 150.258 573.653 li 146.61 570.007 li 148.985 583.582 li 120.272 583.604 li 128.861 624.83 li cp 0.368627 0.043137 0 0 cmyk f 169.417 683.776 mo 165.771 680.127 li 168.145 693.705 li 126.405 693.705 li 130.053 697.35 li 171.792 697.35 li 169.417 683.776 li cp 150.758 628.414 mo 147.111 624.768 li 149.679 638.564 li 131.74 638.644 li 140.308 679.76 li 143.202 679.799 li 135.387 642.289 li 153.324 642.212 li 150.758 628.414 li cp 128.861 624.83 mo 131.746 624.819 li 123.917 587.253 li 152.632 587.229 li 150.258 573.653 li 146.61 570.007 li 148.985 583.582 li 120.272 583.604 li 128.861 624.83 li cp 0.368627 0.039216 0 0 cmyk @ 216.534 669.917 mo 215.888 663.214 li 215.228 656.349 212.866 649.027 208.773 643.047 cv 185.678 610.717 li 183.494 607.666 182.18 604.447 181.741 601.062 cv 181.14 596.441 181.523 592.976 182.903 590.661 cv 184.292 588.351 186.675 587.192 190.043 587.19 cv 191.363 587.189 192.574 587.485 193.676 588.076 cv 191.8 585.057 189.375 583.541 186.396 583.543 cv 183.029 583.546 180.646 584.703 179.257 587.016 cv 177.878 589.328 177.492 592.795 178.094 597.416 cv 178.534 600.801 179.85 604.019 182.031 607.071 cv 205.127 639.4 li 209.221 645.381 211.579 652.702 212.24 659.566 cv 212.886 666.268 li 213.6 673.677 212.552 679.191 209.778 684.61 cv 207.05 690.031 203.404 693.666 198.801 693.705 cv 190.492 693.705 li 185.683 693.741 181.662 692.109 178.408 688.722 cv 178.399 688.719 li 182.045 692.365 li 182.045 692.358 li 185.299 695.756 189.324 697.391 194.14 697.35 cv 202.448 697.35 li 207.05 697.313 210.696 693.681 213.425 688.258 cv 216.199 682.839 217.247 677.326 216.534 669.917 cv cp 197.402 575.188 mo 197.397 575.188 li 197.414 575.202 197.431 575.214 197.445 575.229 cv 197.402 575.188 li cp 182.512 677.297 mo 183.165 677.929 183.826 678.443 184.486 678.871 cv 183.385 677.129 182.642 674.971 182.274 672.379 cv 182.197 671.827 182.088 671.056 181.947 670.063 cv 178.301 666.417 li 178.441 667.407 178.551 668.18 178.627 668.729 cv 179.157 672.473 180.453 675.33 182.512 677.297 cv cp 209.982 601.016 mo 208.571 590.83 205.639 583.502 201.198 579.002 cv 201.219 579.002 li 197.478 575.262 li 201.961 579.752 204.917 587.12 206.336 597.369 cv 196.96 597.386 li 200.606 601.031 li 209.982 601.016 li cp 0.368627 0.043137 0 0 cmyk f 216.534 669.917 mo 215.888 663.214 li 215.228 656.349 212.866 649.027 208.773 643.047 cv 185.678 610.717 li 183.494 607.666 182.18 604.447 181.741 601.062 cv 181.14 596.441 181.523 592.976 182.903 590.661 cv 184.292 588.351 186.675 587.192 190.043 587.19 cv 191.363 587.189 192.574 587.485 193.676 588.076 cv 191.8 585.057 189.375 583.541 186.396 583.543 cv 183.029 583.546 180.646 584.703 179.257 587.016 cv 177.878 589.328 177.492 592.795 178.094 597.416 cv 178.534 600.801 179.85 604.019 182.031 607.071 cv 205.127 639.4 li 209.221 645.381 211.579 652.702 212.24 659.566 cv 212.886 666.268 li 213.6 673.677 212.552 679.191 209.778 684.61 cv 207.05 690.031 203.404 693.666 198.801 693.705 cv 190.492 693.705 li 185.683 693.741 181.662 692.109 178.408 688.722 cv 178.399 688.719 li 182.045 692.365 li 182.045 692.358 li 185.299 695.756 189.324 697.391 194.14 697.35 cv 202.448 697.35 li 207.05 697.313 210.696 693.681 213.425 688.258 cv 216.199 682.839 217.247 677.326 216.534 669.917 cv cp 197.402 575.188 mo 197.397 575.188 li 197.414 575.202 197.431 575.214 197.445 575.229 cv 197.402 575.188 li cp 182.512 677.297 mo 183.165 677.929 183.826 678.443 184.486 678.871 cv 183.385 677.129 182.642 674.971 182.274 672.379 cv 182.197 671.827 182.088 671.056 181.947 670.063 cv 178.301 666.417 li 178.441 667.407 178.551 668.18 178.627 668.729 cv 179.157 672.473 180.453 675.33 182.512 677.297 cv cp 209.982 601.016 mo 208.571 590.83 205.639 583.502 201.198 579.002 cv 201.219 579.002 li 197.478 575.262 li 201.961 579.752 204.917 587.12 206.336 597.369 cv 196.96 597.386 li 200.606 601.031 li 209.982 601.016 li cp 0.368627 0.039216 0 0 cmyk @ 271.999 587.12 mo 271.771 573.653 li 268.122 570.007 li 268.353 583.476 li 249.173 583.489 li 253.511 693.705 li 236.907 693.705 li 240.554 697.35 li 257.156 697.35 li 252.819 587.136 li 271.999 587.12 li cp 210.926 583.521 mo 214.571 587.168 li 230.33 587.155 li 230.105 583.506 li 210.926 583.521 li cp 0.352941 0.101961 0 0 cmyk f 271.999 587.12 mo 271.771 573.653 li 268.122 570.007 li 268.353 583.476 li 249.173 583.489 li 253.511 693.705 li 236.907 693.705 li 240.554 697.35 li 257.156 697.35 li 252.819 587.136 li 271.999 587.12 li cp 210.926 583.521 mo 214.571 587.168 li 230.33 587.155 li 230.105 583.506 li 210.926 583.521 li cp 0.368627 0.039216 0 0 cmyk @ 84.8623 693.705 mo 53.3496 583.658 li 34.1709 583.673 li 29.96 570.007 li 88.3066 570.007 li 91.5986 583.627 li 72.418 583.644 li 101.467 693.705 li 84.8623 693.705 li cp 0 0 0 0 cmyk f 1.21551 lw 4 ml 84.8623 693.705 mo 53.3496 583.658 li 34.1709 583.673 li 29.96 570.007 li 88.3066 570.007 li 91.5986 583.627 li 72.418 583.644 li 101.467 693.705 li 84.8623 693.705 li cp @ 126.405 693.705 mo 97.9141 570.007 li 146.61 570.007 li 148.985 583.582 li 120.272 583.604 li 128.861 624.83 li 147.111 624.768 li 149.679 638.563 li 131.74 638.642 li 140.308 679.76 li 165.771 680.129 li 168.145 693.705 li 126.405 693.705 li cp f 126.405 693.705 mo 97.9141 570.007 li 146.61 570.007 li 148.985 583.582 li 120.272 583.604 li 128.861 624.83 li 147.111 624.768 li 149.679 638.563 li 131.74 638.642 li 140.308 679.76 li 165.771 680.129 li 168.145 693.705 li 126.405 693.705 li cp @ 206.336 597.369 mo 196.96 597.386 li 195.128 588.155 191.604 583.539 186.397 583.543 cv 183.029 583.546 180.646 584.703 179.257 587.016 cv 177.878 589.328 177.492 592.795 178.093 597.416 cv 178.535 600.801 179.85 604.019 182.03 607.071 cv 205.127 639.398 li 209.221 645.379 211.579 652.702 212.241 659.567 cv 212.887 666.269 li 213.6 673.678 212.552 679.191 209.778 684.611 cv 207.051 690.032 203.404 693.666 198.801 693.705 cv 190.492 693.705 li 184.954 693.751 180.457 691.583 176.979 687.063 cv 173.464 682.538 170.993 675.674 169.587 666.472 cv 178.301 666.417 li 178.441 667.408 178.55 668.181 178.627 668.73 cv 179.157 672.473 180.453 675.331 182.512 677.299 cv 184.558 679.269 186.636 680.243 188.75 680.228 cv 191.725 680.206 193.727 679.011 194.761 676.635 cv 195.804 674.261 196.06 670.82 195.522 666.311 cv 195.108 662.82 193.887 659.606 191.854 656.67 cv 168.522 623.425 li 164.06 617.536 161.275 611.095 160.207 604.101 cv 159.182 597.381 li 158.048 589.949 158.943 583.529 161.911 578.118 cv 164.924 572.71 169.133 570.007 174.506 570.007 cv 184.198 570.007 li 196.42 570.007 203.81 579.129 206.336 597.369 cv cp f 206.336 597.369 mo 196.96 597.386 li 195.128 588.155 191.604 583.539 186.397 583.543 cv 183.029 583.546 180.646 584.703 179.257 587.016 cv 177.878 589.328 177.492 592.795 178.093 597.416 cv 178.535 600.801 179.85 604.019 182.03 607.071 cv 205.127 639.398 li 209.221 645.379 211.579 652.702 212.241 659.567 cv 212.887 666.269 li 213.6 673.678 212.552 679.191 209.778 684.611 cv 207.051 690.032 203.404 693.666 198.801 693.705 cv 190.492 693.705 li 184.954 693.751 180.457 691.583 176.979 687.063 cv 173.464 682.538 170.993 675.674 169.587 666.472 cv 178.301 666.417 li 178.441 667.408 178.55 668.181 178.627 668.73 cv 179.157 672.473 180.453 675.331 182.512 677.299 cv 184.558 679.269 186.636 680.243 188.75 680.228 cv 191.725 680.206 193.727 679.011 194.761 676.635 cv 195.804 674.261 196.06 670.82 195.522 666.311 cv 195.108 662.82 193.887 659.606 191.854 656.67 cv 168.522 623.425 li 164.06 617.536 161.275 611.095 160.207 604.101 cv 159.182 597.381 li 158.048 589.949 158.943 583.529 161.911 578.118 cv 164.924 572.71 169.133 570.007 174.506 570.007 cv 184.198 570.007 li 196.42 570.007 203.81 579.129 206.336 597.369 cv cp @ 236.907 693.705 mo 230.105 583.506 li 210.926 583.521 li 209.776 570.007 li 268.121 570.007 li 268.353 583.476 li 249.172 583.489 li 253.511 693.705 li 236.907 693.705 li cp f 236.907 693.705 mo 230.105 583.506 li 210.926 583.521 li 209.776 570.007 li 268.121 570.007 li 268.353 583.476 li 249.172 583.489 li 253.511 693.705 li 236.907 693.705 li cp @ 295.579 597.127 mo 294.431 666.583 li 294.367 670.274 295.155 673.47 296.78 676.172 cv 298.395 678.872 300.355 680.214 302.669 680.197 cv 305.049 680.18 307.12 678.949 308.888 676.229 cv 310.669 673.506 311.639 670.301 311.785 666.616 cv 314.484 597.097 li 314.634 593.304 313.831 590.08 312.064 587.423 cv 310.284 584.77 308.048 583.442 305.363 583.444 cv 302.755 583.445 300.479 584.777 298.55 587.438 cv 296.631 590.101 295.643 593.329 295.579 597.127 cv cp 296.04 570.007 mo 315.563 570.007 li 320.853 570.007 325.268 572.685 328.767 578.041 cv 332.221 583.394 333.7 589.747 333.237 597.102 cv 329.009 666.471 li 328.546 673.826 326.484 680.194 322.856 685.573 cv 319.277 690.957 315.239 693.667 310.705 693.705 cv 293.97 693.705 li 289.427 693.741 285.517 691.117 282.202 685.826 cv 278.84 680.535 277.119 674.146 277.074 666.655 cv 276.676 597.195 li 276.631 589.705 278.493 583.302 282.294 577.981 cv 286.145 572.663 290.741 570.007 296.04 570.007 cv cp f 295.579 597.127 mo 294.431 666.583 li 294.367 670.274 295.155 673.47 296.78 676.172 cv 298.395 678.872 300.355 680.214 302.669 680.197 cv 305.049 680.18 307.12 678.949 308.888 676.229 cv 310.669 673.506 311.639 670.301 311.785 666.616 cv 314.484 597.097 li 314.634 593.304 313.831 590.08 312.064 587.423 cv 310.284 584.77 308.048 583.442 305.363 583.444 cv 302.755 583.445 300.479 584.777 298.55 587.438 cv 296.631 590.101 295.643 593.329 295.579 597.127 cv cp 296.04 570.007 mo 315.563 570.007 li 320.853 570.007 325.268 572.685 328.767 578.041 cv 332.221 583.394 333.7 589.747 333.237 597.102 cv 329.009 666.471 li 328.546 673.826 326.484 680.194 322.856 685.573 cv 319.277 690.957 315.239 693.667 310.705 693.705 cv 293.97 693.705 li 289.427 693.741 285.517 691.117 282.202 685.826 cv 278.84 680.535 277.119 674.146 277.074 666.655 cv 276.676 597.195 li 276.631 589.705 278.493 583.302 282.294 577.981 cv 286.145 572.663 290.741 570.007 296.04 570.007 cv cp @ 363.147 623.964 mo 372.234 623.934 li 374.789 623.926 377.125 622.595 379.258 619.941 cv 381.4 617.286 382.72 614.123 383.204 610.449 cv 384.978 596.992 li 385.475 593.209 384.966 589.997 383.441 587.35 cv 381.905 584.702 379.79 583.381 377.104 583.383 cv 367.555 583.391 li 363.147 623.964 li cp 339.085 693.705 mo 349.484 570.007 li 388.532 570.007 li 393.822 570.007 397.989 572.677 401 578.01 cv 403.965 583.344 404.861 589.673 403.728 596.998 cv 401.65 610.413 li 400.519 617.74 397.753 624.077 393.396 629.424 cv 389.083 634.773 384.51 637.461 379.642 637.482 cv 361.671 637.561 li 355.819 693.705 li 339.085 693.705 li cp f 363.147 623.964 mo 372.234 623.934 li 374.789 623.926 377.125 622.595 379.258 619.941 cv 381.4 617.286 382.72 614.123 383.204 610.449 cv 384.978 596.992 li 385.475 593.209 384.966 589.997 383.441 587.35 cv 381.905 584.702 379.79 583.381 377.104 583.383 cv 367.555 583.391 li 363.147 623.964 li cp 339.085 693.705 mo 349.484 570.007 li 388.532 570.007 li 393.822 570.007 397.989 572.677 401 578.01 cv 403.965 583.344 404.861 589.673 403.728 596.998 cv 401.65 610.413 li 400.519 617.74 397.753 624.077 393.396 629.424 cv 389.083 634.773 384.51 637.461 379.642 637.482 cv 361.671 637.561 li 355.819 693.705 li 339.085 693.705 li cp @ 399.677 693.705 mo 422.604 570.007 li 441.978 570.007 li 416.281 693.705 li 399.677 693.705 li cp f 399.677 693.705 mo 422.604 570.007 li 441.978 570.007 li 416.281 693.705 li 399.677 693.705 li cp @ 462.719 623.532 mo 481.004 623.47 li 488.866 596.776 li 489.972 593.024 489.978 589.838 488.879 587.212 cv 487.767 584.586 485.864 583.274 483.181 583.276 cv 480.569 583.277 477.962 584.594 475.364 587.225 cv 472.776 589.856 470.98 593.05 469.962 596.807 cv 462.719 623.532 li cp 427.85 693.705 mo 451.055 596.854 li 452.886 589.459 456.351 583.134 461.484 577.881 cv 466.667 572.632 471.927 570.007 477.227 570.007 cv 496.75 570.007 li 502.039 570.007 505.78 572.651 507.937 577.939 cv 510.044 583.224 509.926 589.499 507.616 596.761 cv 477.923 693.705 li 461.319 693.705 li 477.035 636.941 li 459.064 637.019 li 444.585 693.705 li 427.85 693.705 li cp f 462.719 623.532 mo 481.004 623.47 li 488.866 596.776 li 489.972 593.024 489.978 589.838 488.879 587.212 cv 487.767 584.586 485.864 583.274 483.181 583.276 cv 480.569 583.277 477.962 584.594 475.364 587.225 cv 472.776 589.856 470.98 593.05 469.962 596.807 cv 462.719 623.532 li cp 427.85 693.705 mo 451.055 596.854 li 452.886 589.459 456.351 583.134 461.484 577.881 cv 466.667 572.632 471.927 570.007 477.227 570.007 cv 496.75 570.007 li 502.039 570.007 505.78 572.651 507.937 577.939 cv 510.044 583.224 509.926 589.499 507.616 596.761 cv 477.923 693.705 li 461.319 693.705 li 477.035 636.941 li 459.064 637.019 li 444.585 693.705 li 427.85 693.705 li cp @ 100.471 689.93 mo 72.418 583.644 li 91.5986 583.627 li 89.1885 573.653 li 37.0352 573.653 li 40.1201 583.669 li 53.3496 583.658 li 54.1611 586.49 li 59.0234 586.485 li 88.6416 689.93 li 100.471 689.93 li cp 0.882353 0.768627 0 0 cmyk f 130.396 689.93 mo 167.485 689.93 li 165.771 680.129 li 140.308 679.76 li 131.74 638.642 li 135.508 638.626 li 135.412 638.17 li 149.593 638.108 li 147.181 625.136 li 132.707 625.186 li 132.63 624.815 li 128.861 624.83 li 120.272 583.604 li 148.985 583.582 li 147.248 573.653 li 103.616 573.653 li 130.396 689.93 li cp f 212.887 666.269 mo 212.241 659.567 li 211.579 652.702 209.221 645.379 205.127 639.398 cv 182.03 607.071 li 179.85 604.019 178.535 600.801 178.093 597.416 cv 177.492 592.795 177.878 589.328 179.257 587.016 cv 180.646 584.703 183.029 583.546 186.397 583.543 cv 188.941 583.54 191.082 584.651 192.821 586.854 cv 195.942 588.062 198.224 591.577 199.663 597.381 cv 206.336 597.369 li 205.128 588.653 202.798 582.042 199.374 577.489 cv 196.295 574.941 192.55 573.653 188.12 573.653 cv 179.009 573.653 li 173.958 573.653 170 576.195 167.168 581.277 cv 164.381 586.362 163.538 592.4 164.604 599.384 cv 165.567 605.702 li 166.571 612.276 169.189 618.332 173.384 623.866 cv 195.315 655.115 li 197.228 657.876 198.374 660.897 198.765 664.179 cv 199.27 668.417 199.028 671.651 198.048 673.884 cv 197.36 675.467 196.202 676.481 194.597 676.952 cv 193.525 679.107 191.584 680.207 188.75 680.228 cv 186.636 680.243 184.558 679.269 182.512 677.299 cv 180.453 675.331 179.157 672.473 178.627 668.73 cv 178.55 668.181 178.441 667.408 178.301 666.417 cv 174.75 666.439 li 176.114 674.024 178.308 679.789 181.334 683.686 cv 184.604 687.936 188.829 689.974 194.037 689.93 cv 201.846 689.93 li 204.479 689.907 206.776 688.628 208.751 686.488 cv 209.107 685.889 209.45 685.263 209.778 684.611 cv 212.552 679.191 213.6 673.678 212.887 666.269 cv cp f 253.361 689.93 mo 249.172 583.489 li 268.353 583.476 li 268.185 573.653 li 216.031 573.653 li 216.872 583.515 li 230.105 583.506 li 230.281 586.347 li 235.144 586.341 li 241.535 689.93 li 253.361 689.93 li cp f 317.09 599.115 mo 314.554 664.465 li 314.415 667.931 313.503 670.943 311.829 673.5 cv 310.863 674.988 309.797 675.987 308.64 676.578 cv 306.924 679.044 304.94 680.181 302.669 680.197 cv 300.355 680.214 298.395 678.872 296.78 676.172 cv 295.155 673.47 294.367 670.274 294.431 666.583 cv 295.579 597.127 li 295.643 593.329 296.631 590.101 298.55 587.438 cv 300.479 584.777 302.755 583.445 305.363 583.444 cv 307.953 583.442 310.122 584.69 311.869 587.16 cv 312.966 587.783 313.947 588.732 314.814 590.023 cv 316.477 592.522 317.23 595.551 317.09 599.115 cv cp 318.104 573.653 mo 299.751 573.653 li 294.77 573.653 290.451 576.15 286.831 581.149 cv 283.257 586.15 281.508 592.171 281.55 599.209 cv 281.924 664.503 li 281.967 671.543 283.583 677.55 286.743 682.523 cv 289.86 687.497 293.534 689.964 297.806 689.93 cv 313.537 689.93 li 317.534 689.896 321.117 687.623 324.325 683.168 cv 327.038 678.321 328.615 672.762 329.009 666.471 cv 333.237 597.102 li 333.615 591.107 332.678 585.789 330.457 581.124 cv 327.176 576.147 323.049 573.653 318.104 573.653 cv cp f 387.402 599.019 mo 385.735 611.667 li 385.281 615.123 384.041 618.097 382.027 620.591 cv 380.023 623.085 377.825 624.337 375.425 624.344 cv 366.883 624.373 li 366.929 623.952 li 363.147 623.964 li 367.555 583.391 li 377.104 583.383 li 379.701 583.381 381.756 584.629 383.279 587.1 cv 384.315 587.721 385.213 588.668 385.959 589.956 cv 387.393 592.443 387.869 595.464 387.402 599.019 cv cp 390.745 573.653 mo 354.04 573.653 li 344.264 689.93 li 356.211 689.93 li 361.671 637.561 li 365.454 637.543 li 365.494 637.154 li 382.389 637.08 li 382.552 637.08 382.714 637.051 382.879 637.045 cv 386.55 636.1 390.053 633.572 393.396 629.424 cv 397.753 624.077 400.519 617.74 401.65 610.413 cv 403.728 596.998 li 404.65 591.033 404.204 585.74 402.415 581.097 cv 399.59 576.139 395.687 573.653 390.745 573.653 cv cp f 417.064 689.93 mo 441.22 573.653 li 426.79 573.653 li 405.239 689.93 li 417.064 689.93 li cp f 466.394 623.968 mo 466.516 623.52 li 462.719 623.532 li 469.962 596.807 li 470.98 593.05 472.776 589.856 475.364 587.225 cv 477.962 584.594 480.569 583.277 483.181 583.276 cv 485.787 583.274 487.651 584.523 488.773 587 cv 489.708 587.616 490.445 588.555 490.983 589.824 cv 492.018 592.295 492.013 595.29 490.973 598.816 cv 483.582 623.909 li 466.394 623.968 li cp 507.616 596.761 mo 509.492 590.863 509.895 585.627 508.862 581.035 cv 506.831 576.117 503.328 573.653 498.384 573.653 cv 480.031 573.653 li 475.049 573.653 470.104 576.12 465.233 581.057 cv 460.407 585.993 457.15 591.938 455.432 598.89 cv 433.616 689.93 li 445.551 689.93 li 459.064 637.019 li 462.866 637.002 li 462.959 636.643 li 479.852 636.572 li 465.078 689.93 li 479.081 689.93 li 507.616 596.761 li cp f %ADOBeginClientInjection: EndPageContent "AI11EPS" userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" % page clip grestore grestore % PSGState Adobe_AGM_Core/AGMCORE_save get restore %%PageTrailer [/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 [ [/CSA [/0 ]] ] del_res Adobe_AGM_Image/page_trailer get exec Adobe_CoolType_Core/page_trailer get exec Adobe_AGM_Core/page_trailer get exec currentdict Adobe_AGM_Utils eq {end} if %%Trailer Adobe_AGM_Image/doc_trailer get exec Adobe_CoolType_Core/doc_trailer get exec Adobe_AGM_Core/doc_trailer get exec %%EOF %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 12.0 %%AI8_CreatorVersion: 12.0.1 %%For: (Todd Purser) ($) %%Title: (city.eps) %%CreationDate: 5/22/06 11:56 AM %AI9_DataStream %Gb"-6H&j4@Fsm%ki]G(C"Jj^NVRr8,*K@l8OdQfMeoZg<Z[53rL-T9N--9'J6"O&q`VK0'IdaMY4fTui*+9.I=-+:3(3[B(n$Zlk %?[Qkdo`"CRS&b!#T)RbOqg$om]O+:aVmu*-pu9''q;'l]<K.C_.8mR3Bl[01?^.'DeINISo77h94M?(@E;0.qX66B^GAlAF5M\Oe %^\u^^qT%@2rGQVhUL.p5s*T$?s7DZVec"m95Bfgs:QOtClITtBT,tT'J%WC?IJ8'cnaPl+S(!l(]@57#_sP'!9a>79qr[2BS,:h; %q#95JGL+%X05arim_@^pr8B5e:K,)B.K9##X8DXpn%PNQgqE^["9&-55GW5mo@J3Th@\g*l:f[;rp;rMO6cOYh`X,A#?7Y*^\QpY %m_4&>p>,?-]/NNHs73X&[mtsJT'5i+It.LjVq_+Ic/%1dqlfI+#mp(hd,b5\:D]EKb[%'[J%iOAPTQ`Eqrt0UcZb=ID7aQ)57<p^ %_E:fmh;.DNnmWJcqYK++hnK'GjtpZ4(XLWhS!R5RZh=eQrr2?EL\ohMG>'0/MU\1M$i[T\>*Du\kfD^IU9ohH1pg%M5"MeF6$NA. %k3an;,-lLek4.9Vg[A\k^O#KD#iP4Mmcuh3McMZ4B;mj>rS@AJ]B;C@^&bW\;3>J*I<p<cY=77?FFT4VSLX4&Y>k;qmIPOGmt_"9 %mb_M[J$mUdr^>i?S(f%R5h>NX,CK=)h;dsrrZ@a"hhA`0b7(2l99-qIbHuI$&!6M,lU\<&ZZM&tBPm^&,qSnRf&8,'`\3tAI.udn %=$"+gc/1b#H//`_\UBc.$j%iVra5#AR4<ddmbQ^ZY@M<URHrb=I\uAh[pR;Y^]0n8kjeAk4kMsFHK@:AckfbOl]4!6mr#*aQf.T; %rU)oD=$OD$k=kNoHi/j8InRW8lYA$D*q.tG=7>[[p[[Y7K\"R$7b!;-hdT!U(f;g'e&hG;"a*F'SO3A'\eNXD"h!h+Io5P.)RZ`O %dIR,P^Kb-@cKU!h:T#&WqK0UCVj"KM)9[D=4u/l1MO*tJpU`*J(UX5Vrh:091.^Lc5_QnN",QF_E#U."/RZG&Hile3Mk1&IdPE#_ %?bhYFPQE1j.G0mT;%%@%0C#'&.'rT_bQZ%=7DTW98kX_?AhS4l\]O'&\ZM"EOFO24q!](_aU/C)nsc]thGF[Mfa8*fUb1NB?[Mrt %ZMsVL1IhcNU))\)?Wfgk'#CW-NtI?U0QX!2>;M\>?lcWXDh]'Z>\9%bbIh@jl.OW\C=kc#!H^f!J.A[bCAAV6i@epPI02[LM6t6/ %e,a['09!2rG6DtBJl&r(YgJ>*)eL^e,.(a*@;@?;Qe;\rAR*%jAo9,.YfYZtb=7iTV7ldZs((9/R6o0(k(4Q:iPbbLIN,ahS)"n# %Xc9Xq:Q>(%\rH+srLnA/+li4'b(f#d%[`Ae'!3*2Cp#[')cum$QLd6/5J2nRSFrLqnk4=rIj)o-p+HAg?S%,"[!2>4P'h3:nh4YO %T!OEIp#"^N^U/4\GBG4hgUmC<I;s<Q-1,";*KTd)^!"0irY'R;[DQ?S=8?akjIP4MiArNfS,%"aV&Pa:kORX&I`SFVL$DLV0e^]N %s1:V$j5T9h)em"\]O]I#$$A@Z?Te@;FZLPKbLTSja6urK1t(WC>18ik8c/5]&uaB<qEZd5OctfDn+_&"L!*FK?QZ4IC&O]b]^'BJ %4rB:FA=EhDel`0U7AJXs4gk==;.ela4=@"=_GE09I]kn+/RY`RO1b).:L#PUXWBiaB>RPD*,lp5cZ@cfd:R!sZC]JR7NCTFq8fXR %k#AC?QkG?u:K_\/2DYu9@pW>o`X3rfW6VC9OtdRtb%?9ob9rtsRb.'`1Y)ZW$CRQ?@DBY2ai5[M6gm?kY0GC[ok]u1pcJ$/K2;r: %1bnpb-uBCoc0U,?jL\84;9RI!=8M<h9P[F+Y4QG/3rpsQM,>O5o^E0H<f.%a*N@lM@&)9R0FZ<JX.H56[(3:F``c<!XC9FdN(4m] %=6@k.1q9?@`H5RR1l8Rn=F)E(@q!@);+e(P+rA+Y,t_of#5H42_qHsXAXY[.EmqPW#.%n).a>*+<N*n3"nTe46jeT_K2upuS?Mb@ %A^%fH0)-erZp""ia7X3h(]K^<ni0rh^9q;TH9;^$<_RbC6@\"bR=7k&6Zs+aDM2q'/>^/pj>uqjDs!hC43s*l-EQaVPeaW%Z%9)W %S*sU([1^K#l$uoIq0'othtE%KINp)c*0-#E)YFU<EAGW<NX+>H@E+,1f"ABR=5J3B/X:AS&*Z<b*b0YuPV0#oklSX;PSSrs%O*jp %,d$=-]ojYcJ5*`a][2K-rPhPUrrk0S<56k'-fJm*SjGfW-=j/:==?T!^`)r8T3,SL^d6Jqg4`!ANPuIpR*qU(p;l+mRE7:Kr21#s %QEXog!(tHd@D4QVNJ.-FS_?0QIDXU?!G#H_5*\?-9fhq#j".8QoZ-8F&te+C3_*J\"-6+X30Fs`s-esbA=65Y,/I<Eq0RW/FUV_# %RCFDKc*D(U=<8Y@P"9+$%FDCcG67Fd*u*IhDgIg)*87KfAjl^b.Iu,td'.1idGuQ1Za9q<17kR%U]IY$@tVdm9h1\;CXN\4g+8E\ %=l^Wb4UF'I-FWq1eep9aG\s9k:-ho!pgDgQdB=)#9g.Qho*Tb\)GHqR7\>\jO`IikoH!j([P5*LYn[I8'Y<HkGR^%\D]CV2d:Bo& %S*a&>Pp2u\'u\Jjm&(ebO$r6Dk1+W_4,Igr:oVYHY6bH\hpBUj),KjMX%)J.[#X.(82\E&[89!1TSOZTBE7KO%d2Bg17DV5`,ZE1 %=<,oH1n!V#dJd?YJ[o(K!'4IaJc8GON0j2QqH"U)XJ_=9@(16F31RGhbW7F^Zf-K5&'X%EEW57Z<h*7&n\%a">98mD/D\]&r"62O %$k$j?KC*`OLZhS&n^Oa6:D<,$A=ot)`YLSMSAi-ueM:E&^$2PffAN#V@5uuEJeO7S'5RV^l):;&a6G113_943-B(]1*hrU,0,dTQ %;Z5/n2iKK;"L69a0%@I1"]K17<b8&pj[63l=Bd;j!Ga`gULE>UFlh6\1G=9X-,\^WC/HRqVA,^>i=++rU+qg.%T[CLFD][r&1n9J %*T@GW-FUfPX%h[o>H!FW$sQ_FeGb6R`ZkVm?WXP0dPZ=d9ga:tZ;tPKB=nghah0<W6jW:_g(pQna<ii,'.`+5SHt2WhgjF=^8s6? %p4)QAj*%(USU#cdJCP3&>j9M$<at@?`i4S+oN5tM2L?%AJj$9_=e#VOK*LI@T0Q11:Vl^Ir]QMVPZi>JZ?o6L9HuKX,h=d.To%D( %%Qa@+XQMWJrdaB>`-)^kA"%p"?XUF#"i?lpB%5)>dtJ^J@'%8G;@'9S@(K0Hb$:q^.BJ]g(S]_?"4=D`Q*"n0RM1#>9`GO#8]A*p %DjD(%f=?q4;.VL2'sMft#CS)p)Mal1=6ZAYO^J9YCDKBf56t:q2G+&s=>@[G:rdRTSf*!`3VS^/"R^u.aJ*$DQO%^M[Y.e@:)Q"o %<i<kk9]A,TphINQ[BKa31s:YCk$L<rDceac"gN5-mm.%WX/iJ]3Aq1ZEa@NrVRDZ]c7l3[7GfG:66c@r%P;!=Cd2+j65b#,^Ws2X %V1*m6fNfrt^<4,a109l@6q=N%9^Gn]8`4(<D>Tr<cVfMSU\_>K2=Luf"+ipM0g[Ho$a]WiSYIojX\Q=4L">3U!p@,j"H_=PeuW&M %BEZI+4]`Sa/aOrS'HY(Lch0o+Iuf*N84BtcL@@Zpc&V.=#a%[;AN#G6U6<Fo/5oNbZcqX8#Os<,W27Ut[NZpU0IP8fChYT"&0.t& %5J22Emr2i7(rZR.4]eSR4>P2&ief4>.^fT,l'kZs(hHLSncRXGTGt9nphqP-d=u8UrtlOW[Iu`FM3qnb17gCp03hB5W&37UkbcB5 %CH19Uf)-W?V^f:gTK]7Ed:*^b5+,JjSu#O=.b>iW=c\F&LmEgDIAiZU&8dkFeH5kAV-'J`PPBaS:D+V<rEr#a+koa6eucgHdXpX> %b'i5nVm+\'J64NG8'^7.MCiI<B%o>53;tRYfk=2i+T</14]W"r2#uCF*j\r5nLX9)[67Wh@W";?ZZ25-#>^7#RhiGCCfQiqe?36E %LIa.HGHP)@l9tfdU[X.19rd;`^0(!KKG/SONr>2:S?7)*/=CD*Y*,1GkaduF#-f1i'Ud+,&AA_)5RrR56is&jQl@l.-It12/o(fn %B`(e??El@)4ZecDVSdq(Ze(`4#ITKsL)LZn_AT-1DGj#+9IpM!cLP,F(&M2U,j_-WohJtA<:6)q=F>g6YZ7Xb)TOd0?EaX:@%)(8 %HCr[@=We?hCi/!d1m3*KpoDkQSt_H:+q^:LK8!n%M</T6C7[7G9>:k:.V,4/d2sX8q9enK*Xo'(P?=nAo4_p-gM@,$rC*:fI:Hgu %Lr>[9.FO&i'e[PZ'5<5D'FL%h_&Q0ZR,0n6/&O.<,eH`f7Fs/QrW#tfo\`%5Kbrul[RQ<FcQ$"!RhV$b=fA>pf]L*n'<N#@"A:&% %fSRFR*gq#);6`rdgI/Bd=)@jflpg\"9])+!7^@L3m-UQO`6C6^bo=R`FDTB_,o?#+*=,":MpMqXs2Ho_kB1'pJe,EWO;6B'DdYa` %,bF;uKi^fUj&%\T;<5"3'otW<*r=,:B=?3(rl5pQ@GZV)LTq]ZR3e-"8.kctA*%^,>N.8'`(^jb7@rh:FVg/@"fmo8kUb"8*7&rt %W&;gtDgXO\',982H:2<]U+lt#N7VNQE<3?CGV+elL!WZN6O"N\!^&C)M'*^iBX-r9-)MrrBGP6cFIDqb\0T&o%qXZ1`Hou`J32T: %=:WkFPXFOCfjVaD<&hD.F;2GiWJE:YH>RuQkSu@bm?G`HMo<KVS$h+c\[CVE.lq>XPTa4/[Du/<&(J$s%"kQNAr5s9&V4f,WNs`1 %h/r4e85,Bd\sQN$m:CUu^L_\>e2;9@/'`Lkm%#UWXA)/iU@YibOkPY$>C#_Ib,WEo8m3_Z3pT/tF9]braId#\%\*E9Nekill/F7; %@C:?X;#G+^RhQo!42$Od`QmL")0Joh7.M,.@h))4-FWfiB!SsK/\sR-S_BIXs/%_FX%>D]OZ9R5AH+ts7JPk00e]UXb;Jfn=8qrG %h4R1oW\\@s"Q@sk":+TeZ.]Fh\Ink)-,VQE"Im&=!lNIL4.,1_'I.['MJDLAm4FcT2<o+>UkP)sSXX8#ZIU$RG/SJT1it.S&gg3I %Fg/q)nU=o(<Q[*LLijSL)k'FN60%PaYs`hdr@"oa=g=j7Rt\#MM8AL![0*-=_V(jgN?pX&A.n>c"GK-TT-^)U4k:SK'&s'@iJ!7U %?.?#t_P'(bm!Wt;HgC]7U=p+H`qu'XU"\ZRQ\t2h0Ed0rEM'6@(:ac:d'Ngi/YO9=OH;JXPKBUfa_Pf=#b7P4GjkF.*qhT)>kuF7 %An+6O4H!g:K9E$KhV%OgJO,u-2)sQ9c7'Bsb`EP18e-dt?AhbRhUhH4iejHR`6U90n3_@[s!E(!8(Jt*hci2O?3P722d:g"og.S3 %!e[jtIM;JhE!hjhI3<j;;:N)\D8*J_94jm(SU\^thC[15r,9!g]00o^SRYtSU)21:V/[:,FV#$o3(1WhFf/OM-@RZ;-p`fK>\+r" %H!AN0gsWas&YU";'^Q:[H,e_Wq%jRSMlO$g)8'n:E>%(C5%hF'I%`Ib,$#09-UdV\ZK)uR*O4c-qa<OSP<u]!daMs_.k<!3?<`KD %'!#:EN@'RMe*hp'e2rHsCceJn;j-C&#)@HU_VZ25\/=p"quVUVjc[tpYP1NcYfoA`7)<\[gRDsW\59>S,"64JdhZce2/^JRB0VoN %CCZo4Yc%gaKZI;8W:@79&V<RL5]jKWWPd;1EgDR$,8T+)3&WjAX1'ZQ#T:&D^Ps$ZD+WOI,WeT;gT"76Y%Z3>JfkGe0k[1,E.I#& %<o39(K,0G(Dbb`,grIurZV>fY/'EBTmrA(a!"B'qM`9h)8FE(E43;T+Clf=j*&0t1Ms@oCXIQ]c1h?Q1[?k"0Mp9TEg53PH\HT(: %U!L[J&:8flAXf8Fhcb6d19<[5+E/a)*_LZg6A:!gI%_K]gkKh=HE[ItIGB.4>q,\(Zjk2bi]15hg+nhE#67-[[ECb3=C3p$HdE`Q %cBr4#1NIM5M0+IEQ8p$H1T73soZ320)*,8%"mXs&'5_4K.+-GJ&)?Mi=g9,F?G1*5??D;1Q)R><dF`GYJS/Wm(;RM%0hYT&-Aufh %gItfZ89,-kEq!n)*k-=XTVL&SEl4KTfWsj*3*>&N)-j74;U;&^?eT7tJqk'nP*<.9Qkqoo[Zqtt7d2Q))gi+YK_%91Ri$Y.`0iSc %/sITK3Ap)L&ftZM)72.ts0ZB**n[(G>Sbb]LT6]#LIFBI2E$`W?DPSrE5%I0N7ZI$(/6?,F!<h+ie5u<9]s4WN;4PfPs@:D^.D"T %cIk.t%p9_!ea,jI\;%Z&^0pdR.p&K'mSiS1JfpZ.q6s&b@c\Yglp.c`nm!E=[iCm(J2X's"<=bdOI^aY\BfZ6N.mnT_bV;BU\G'X %D_U^L$e[8rIBJXu\bGRZ`P/;5\Tc_Zri&&.I-e:Sa!XS4etbCD#L4_e`c:nUT_hAlR73iYYKFSAnFsLOs*qE3>UqT@<Q;ClBPk&L %p"dXQHSDV/h0If]Y->.C*k7@2&MJJfXctCmc:>=VDbrE?fpf(AjT']5X1";:5,Q9lqOYM2Uu>E+GJ3,Qouqu5+L%LMe("([1Dq"k %\lI=Oj"/XO%LgAuo!haM<jLKP!3RYrL/opQ$p>`&CX@GA2(G7;[4<)K$@`k!PJ)"31XUW^2B9u-(/s9B7Sun&H]hk(3QVe&LUnt( %jiAedppZHQ(Wcb>f[rVf3jdPT@?trU3KS:,J=WO.7+jP8?cTJ*0mndd$C>#j\Q(89/&==r`q7nT,AZ^\e7e.PW+<)+W8I;5Y]hVq %Xnc;/ZcQBWZkpc[:A1+9#!@dqi9\.$hdf3>bML5r*Y9ap4UNKU-<=e"js4:$,WA+F@69C1q'Rt`?hjP$mRs>[ocmFBPZHl+8[b1U %`&VTK_rb4U\`Z2S4,eV&r/1bIcULj@Fcj!3NPdckc_R("q[:,rT---I`ns,IP$-:5553:r(1.\n@K/XW>Bihb(-s7qE\KOk/#9I9 %YYu\Vq`KWaiHh!,Dudd/R(kokX-8?PP2CQbj^?Td8p'//)rMVe&%WB'X0<3L8!a(1EP;"GgHk>R'QV[r3c)GU*L+"=I$[i1X"@G$ %H'HA#3\Ou;gF3aBGAPC1HGU8PmOH@4^h_u%Y4\KJ8b5.a^*StHV3q7"gof<6<E^@'1MkaK/,UuE5Dnp);0=BJ)Ie^eZ@'a%@U4/H %PPDB@ra_F--du(I9u[^m)X+4P;->E6W\Tb%&4^5#C)UVUO:qQTNM^.EXn9K0qDTs(R6/a[*of&rh5STAG*ZWIP[YrMLNoco4"/ng %>:78DJFh3./j#.P66r-oE#]&Gq,&ogf=Ui0QW9Vj[VVdXQ/!hqe]P9^'5o_NGR4iZ,8Z_`Pl1-1lX2ha1b8Agcni7>*G($h(LL/o %K9Mlk;E:I-Y>W6uZV\&!/XVUSZ/],r7XB;p9>e*XF/*"%1W:fESWUWodko1!'f-0"HfHt>q2h(F2Eh_PX>1.QQ;_]Zi16\)_)/ii %$a0$%mg8M"Zqq3>Pb]'elVZhnP1(/SC66M:ig7f=Huc5rqUe_!\4L?Gf!FpkBp<?F[E!3$Y@k3QdRpS^*[`j@@GLTo6IVZR+[9r> %Ec005CkKhl:mIhb[#M-a&hCGtO"Ju3A9/f24E?:L2\>7`.cE?bX3G[fnpsX]Appll;j3-$_a;1.AZXTkZB%h%<bH3q\W2-F=V!tV %8d/@=9WE2#5&uOdql0EqCp[*:_d]p]V])<>:lE-DjRkh#QL8H;-.dI`Ag>Ec>_VCkak*O_NFLXW.^sF6=LILId5FXOV:Tm"f8d.< %1?UZ(SW0]#cE1-<dW!G\ddLA#Z_;d,IA,:_Vqj"@_nj2K3PbIR99TM/3pCfpq[<pg&1<LNX''r:BG"u>:$Ra.=(?-'AG;HKgf%s+ %kr!fjpM>abS&CS)amJ63^TAP$`[:?fLW2?1DfZr&40tpr,cdYBHAKd!e8fF^#S-ZWWDYuV1HM3eCCbgcIIYH-ajR6DLpKW_o`7#2 %5ofCCr">lOc<HNL1UZ&!o"3Qn_V\7LCGJ%_-O&Bh.@IH)Y<=tJ00ZU."G&P3akSO2E]8PZ%<EEOTtONgC@fVAhY[!Fr:b2I:r&#` %>5f5SS'j+DoUTPs3_3NDMrWi5>RVpNY+HbSM:YtD1?tq'Vu*C\jL=uRJ,/s/h>8:;J)'j?q/>_ohVGknoD%/?h7ghNn"+Itr=1b^ %>om=e\U12\hHh7pl0$7U=*Lk*gu%!q*cGE!Is6,4O71r\^V7>Xd]2[es%lqT8sNWKmIKu$S**lA+25G'qiAqT<_(m$Ep'X-o/gj# %]=a?)G?r\0g@UAHs$l:dl0>p\FWS*jh;sjMI?M0;?/;D^pIV7Q?E1`+Wpa0Bh<"N;p\!othq^G&^8;4nh-I`=HsaU9GP?Iq.,Ngo %_S'NIIsQToJ+rC%LYHHLi.pbSWPudBj6Jqc':,6cjuVepp#W6P++ATdoA0000&JhL^:ns(IK&i7bb5MjnbDbEp"d*DLZ@K_DsqW% %I_VpP5MX#'qs`b<IB-oI5MeP05.k5=ml'k*rTX.N[s-?PS&[U<I^jh'lMWl[=G9s/f?sWcrS:ZXq>0>/O-b(jn`p,IJNjci]m4aI %:CV'>Dss<3EOXElmQE/ph8@^Rqn$e([;UYR]DMIa5618`5MWua]0+/D*0f+Jm<JF0)L6^);nBVgi&;un68<\!?_gKsf#jiYop^G\ %!s5GmX#U.BqWZbt>?TA6qr]>u.<A+P2h0lUG*h+#+b5h?B]R>YBUl!P+:qlF`b0e4I=#$CaBtn2]C2BK^EjNG>ol$>4a*G.65dg) %\YGh[f2DV6Sm6bN/,`X$I4:Gqm.rNJ^Q]XdO;`W4]D7*WoGT7Qp?e?mY-fh!_sOL;d/3F*<4dRt$m@/R*5/u^rr(l$\'OLbmVh!t %,<gL$]_h<^X'9>Jqu)Y\i`lE@S):u/s)@_5rBJ_kE[)`cWT3$>-X;?#X8Ou)$)Lrsq8Z/(H7=PgS)Ec8?YN':cC4-Ms8;lapHSXr %\,52*B4]cpSGX[aIeRdLDsup`]R9>G/Wp%E+$52Y\6OUGiS?($&79U%T#"LHfC.SOhS4O2mC/E=mg$R[o(%S!Vq:BE&_Fdk*oB84 %h;c)\b:at*^:W4ik-A5)PClC!F%M_-5>["4crlT\H#n30mWS']TS,lFotTo9^Ur740VS&#Om4l4s7l)]Vu(BbjaDZ,&X7]2./\tl %O37]Ns7c\FakqJgs.4]9qramO5Q(BJgS`lb**tl.l#-OOmCVi]=80X&DuY!aAb'ss/ZA;#DuT]1at@Shr:%0;mI0eq\2EihrKi$1 %<t^29=:<i\YM[*?GPC?^^4(e5&teo"cgTb?^]48]ds[eEpf!`\(3:qis"_UhMAn[,q'_WeNhdE@,9<B5rSg;?g)hAeIf(MdIXOj] %Kf/Ci=6BcIo6VKLIf#)?:A;6DGHF#X[J(K!-$/dL[h"H:]99??H!]=aIJkBn&.bE$mH3ikVrrgFD-VC7r:di#V]WKAee6Crqu:s= %r56Rd`\N[pHqbTtr7oZoo^Dsc0&D*VrTt,>4Pb5=T=F%80-K<PgW/(34dXbQ+b#5r8Y1nc8]keG$cIKIqYopO4sC[#rp$ccq<oJm %8T"E@s#2LnmU#@38%np/\*\'*pd3Z7f46uCf,^:;7t-RhI_)E.'to\W<DMO,-$i"+/bBDBo(7O?51=;aMjrba%DAoga6Vb#^CKlc %oZHfhF%h^&$bZVV4M>\`A*2BbS8NQ]k_3p_]]RhrmcKC5#C7,6AU5YO7=Hi\$N0JmEr;C%2'Ig-?UoQbO$!1_s/u->i)e<-k#]u4 %eCUFuTJ*K%LY%RDk3b,"YH*l"G5mQKSYnRp7\8]k\!U+>\`?,lU1%sG<MqU;\[^Wl+O;s3<,sGKNF(#n!<9<o%b"iM\:[#!_m2AB %6TRaZe)>77OPCE(:KJ4CjstZ;YJSh1($V!dnl<4]n.gr7K[So2M<?hHgc^2knD\TE1&Q_ZElC#L+g_g_$'d:kee=d/njj.=V'ru5 %=,bfO=ufbP>"brqitW%c>3^g.4u"L:,S!Kj=HXW#*24RQ-.!?>$T&&k"3lDj5_G^uct(faGm[;XFbOdpqU0kHmYP9Arek]tSp*!L %*qsADDXp`A<@1Y5nl2Ig@Hs<Fj@H'+\kP-\3Qqla>)=f,1*>X/?;klNBl9-(STEWk\%&rsgt%+i+p,QjaHNOYrTp*L55<)eT7$@O %+8cl&b7.n@'W*Ph(OQKs$'AOCjA<]:>j[?SDO<FZbI#K`mNskRa!E<\<9T3?lA!ps\=)=r?1d>,/ht?[M54U;#HW0_h@YA[)1b_T %3T\[:)D3Tjb,(_ekURYd&I6e^%J)$14cSZ8_?K0Bn_+9lO>)JMnPu9:8K#Ho`I)dF,^naMS!^Em%ZV,nG!t5\E6pSC*-@eJp=f[J %q\?H4;#Cpk:/hb8#N^U362c@1:.8cGZr8S*E]GT?!k8:/E+Fh<ScDiB0>JI`%H@rf#<2iK_HaBVnSlCIEb&VmG+"cS4Yr)&9k7r] %S5WO]>ZLd6@F7GQ\q<+S\Km-p=_\7!7@%W(:rZDQ<&Z?@Ks?TER(7Ak8!hA)4bNDYp0oB'<A$'C1\O_d@]E8$EPorY^hP'uJdAFr %Al]47#M6$\$HrIjEo449T306'_I'QMcT@HT$d3M1mYN7`%?'EP$g#;n33^Jp=f*5H6.`J;#?nB+Wu#Ir"0JSu'qTS*s!(tBRb%%[ %"?*!98@0"cDB.'N6nfYge(:t`#GSb&oG<?""-KH*,+SuM7p:mfU58saB&4,R8']<L7/q>"#[98YHqf98+R74i9p,3#&;N:*[>?S` %Uh.4di]7X)B4B+V//j=I*AQrg,IAP,mB;?JOcY]^_rJ%AnsCZYT4hr!6m(#KV$CIp9RIdN(^(HkNWdEkbBG3M\gC$5&3o7sadPaU %-]m\7,_L'"fT?I,R`M&g4X9Z],dmc201TJf,!%[r0jYMd*/H=*$+rf\09?0U,RB8(:Jf3\@)RAE&sAWE,UX$q;A<1Hs0l<"aN_[T %@3K,(AKb\TdR)NBZk[j:'%^Zs86qFk.X?5<ptf!/gP]DO_"A1i-@nSiRfjdCn.%Rq&],lLWt8k\I']!PB-m%b&ATWA7JL2IjAibV %X3Ag<Dai67SGfWQTZWo!Fjuc11M1C+`:>JSI,Pm;E8js[QUJIeP2Gd5o8`&804#1G=#r*2gb<#a19R!*oYt<qG0[scr*#Ik5VISa %pJ&sV*%%5?Qu0Jqf1\RT,7ma]@KJP9?Hn1\.`b<1!>^%f8eLZWM<m]*,pkJ\>@E+T9QH9;LiLA/kEsI?-G[0Si5Aga"ap+PcKlEi %pJX%m40;<#b7@4h[EMUL\J)6iQ>fh#=!_K,4&($ir%n`FeQN\:b&VU%U/ZfFLf4na,#TF3c3[[*jm!:*f.3,hKiN&#)(STCm$LZk %$eq)9oY_sJa=@.W"n*2,q?&8HbT]$O(liDJ"F^ZZ'5?lfY_pe^lnblW@jC#'b]Ym,Y1Nk;Yh[7Arh]I#,AG3hgg6\gI.qZ^f=ZB' %mBu8pI-<H9`ZKER79\tD7$_PJ8"31N`6VfZ^A-hX5@;+#0(8iVq8J\YM>24cWQ=73XZoiTHI*bOZB+F*\>4&SrJfN%LU55QUl.3d %gnoGl=1"a%\A`oS(W7Y/n&O[A[#XiWJ"A;a%YXd#01&?Rho1ANE"Dg;PeA;`&1,`eg2d'([CEfIY.;*qkIp;ehqd,En#q5Rk>21> %h5^VBXpdMg?d5L`RST+b:Md1l2gf'Jh6Cr0_`Y7_I`6L*;(Q[%otSED@#n'8&\HAJ7]^&2m"Z$YLtsNfd:*Y=!n$!<O^0@C4`K=F %_[[<$+<P<q&Vhlp2R#OOB1RU_M>a&6O!LEdAO,$AS0+TP(K'<i8@'CI_!NJme(8tE!9-]IiGA.;/Do::i5<+P_eAXjd,NlhOMfD@ %[iXtP9#:P6UgRF(5=1XQ5ThN.Bl5FudtGH3E^=1D7S-\(k"(mbJYbTT(TB51k5::q$=LFn5EL"TX:e^;F$E9tS;I+(LF$1:r(GZ, %b`?3e/RS_WJZQ)09VTg=3qFT*$AF:IOWRih3OMoNIcOO.TLI>taR15FmVK4N5;lbB.kH1Aq=BB^a4lB]fDG$DBO<mT5j(b=j'[TQ %qidXuD?'Fj(#!FN=5.J35[LG(`/$)C@cp-B@#<p%?[S(d!_:>/*K/F8!t('ZlC_R>KmiC-1,cJ*EaVISJ_h@>iD2"G7I"p#@E4FA %C2r.TD@T'R(O/bB49g=1*#B&LW'oLY5<]_a/nY=YVb@+l=?C1IN_3!;o5FWlMdn\-H)iU5H%k4b%'S<sP.YrV=3;FeZIbeaY4U7f %@rCp]Pk^HTCmmG4gm5[eL8=rej@-sb&u&""T/5fs_P*"m#=5M7'8WDa4-#FoaAp)Y7a[3=)mL<D2?Gbq1r;BB5aS+X3\U:&TA8DG %l/P49h+qkN54i"ljQF1a`(R9Ss2!u6FR82):A3DLNu^5t?_8++.Q2KTl)D&"(8/>H9jKTON1tDqV.l-l-<!X=G*5j4F!k9g`2\pT %WLR6N^7"VYX2HS.&&"u`pKF>h8!CY:Ij'C+*?[`M`[oJ4=[Sfo%*?)iLhDWhNhO`6k\O\Q1!!KbSAOK^9CEtc8p"4R^tTuN*eM0C %!p1VEN<$.k^cb:SButfZj>ra7]+<T"!f,&#"X34CcbIH'G=*3/[kP6A7*k0`?#k<Xr:GRNUO=?_?^))LR6?'hXV>-O!?Bn3DD+8! %"*d&'/K_ilb?W,m]U3b.oT1%ja&+k&U?Ar'rfXj/Q-M!PM'lWRo9/<=1<-40O[U,KAH1455@'P$FK+acVGkFfKEk6#1o;Z'P=\H, %eCit;X"JR>"tX:6Gm9,LEGA8$2NTP#$?Kj:^Sq"TZ_YKA90*KIZl1(M?<>s`jeujIbc#6E'%p:00cDOb`_\[2VUS:qg!&TL`[#$$ %R%(dj[W8d?r?aPabg,!]'<9.(2XY&i+,EsFb(b51.BtX8G@tdEQ.=S+X_WQ31fh^lh,R,@3*<2oRG*VLhF&C/dpeQGl`F)iphDgr %(%2U\DRFrpQKNalU%lI3r],]WR^6Re?M$:ba&HEBJ*jh$r@l.`/Dmf4aS\^:]/->G3AY^AH%3WohK@u?k]It2C*eaL3rS5EC2Vbu %EN?M+esgPmj6ah_e@T>3rDYlH',KE>2J]X:D:5Nq]&"FlNM0cBJ#>"a2M1eeppkt&FW>L)"/.q.%(\;<GFo4pMM]k&<p,Vq\s/)t %PhK_K.+Un8oUJ&bPtsSUPI?1Tg"!K4-W^_"Ba^?!oh%IC[9FCDD`2\rk,oW8N,6NBL=aAeG2f>[o((UMp?`SJj+3Q&kdEXP26t'6 %!Af0/\er77U*PILeNB=e@FOT/&*MLl)=0OU#GWRc>\6&Rc@N+CP/LCEB.W9`e.kV[D<%VB%l'8>]9%a508SmTF8)H;?=5u&G;8uD %=8uj^\`^JUR;LltONdXI]-Vj?J::r*c`s/CkP&oOh>Q7.X8CXQIjWWipe#dNJ),kZ5B?ql;qpdphNn"`>9uEqmXIaG\+_C&[8J9F %r0:Ca9!%34ojbr8.74"VZ$st1UisaX&*FOEs8DPYfDDJd4l2$qLT_9O!APU?,DG2*I3Wt8Mf7Hf)O=p*rR6i*ocNDX^Ja#tp0n!U %r?)&Ng:ue@J,10N*]e[^-/.V_2cMVodhc`[he[U*aWh>fV<j_`'Gc^KfnVSP$(JVXk$#Mu"Cq0*6e'ih0<J:t0-[^q\d=,e,5YMT %1G9P4kK?]aOT+D%hTm!%XigEeN`(U+DEeYCX&2ad-i0IITB89Ik@HPVk'F8B'sd=4&bf!/GcWT[AND2VMRiSWBKbK3(H3I+Mg?Y% %F91qSb*F;]`uZs9eg"UC(Tn/mX"eH@9FH;;bEb>$\gT!:BW7bMBGkEV3/HuHO`f.iXiIfZB^\(9&jJe27PB1Xp!/2lb'6g(UmJf3 %2<pW:YR4&"i$'&TCoE]Y_BS'R.dKQ)MWp&MUTQ#B7u\;WBJ>>.bA9n!e6#j<Z;AbW/oH:Y>J2(48hiIAN+C42Di^9,F&ACjMq4ZW %ClJ:.[3%TJS`dN8.-[LYcq7+nFB$bLBliO+:1nU-+jMg&/R17&<]4)P2j85LS&\,6I0q9*h0kZ\c\\O$0KCBWrj68::EcR,b;fnj %6YKZQcfL,0l"S-#W^k8U--l#K3A#AKR;!83[#EM_O3ji%T?CBG4Mrr;'Z5\BWLqA"aZFfo.9[S#EMSpe$Cqc&>>]E1piZ6";RH(; %0m\,5p!_7KN4cu3aH"Z<Z&>%,gsU\>VNc^G$Y]O$[<#)>S<52J\I(J_J%H@MN"#Brf%3$*/0[MV6LD!57`ACjS<4s:Z<Q+P.D-'2 %.uqPAZG.MpA8;@-M"m(6E#'C6M,VEFLB9$n=gR^!GReL1Ie\T!mKLoA/^fnXq">,G5(#]ip#CGD^fukP.$WB@M_=j[1O<HQcNDfh %Gs0emCte,@HLRH9e7iG3((mbf0r'a904t%Lk;,`58';bpEr(k54Js`A*hHIV0IbTGVpu<:O(BeD3-/k4SeK.WV"XF0)t@uoZ60+! %G#gj(LFbf:AdU1X`(K69/@dL@7Qc(>'K_)/c_=5WhN&A^1$Mcnk(BO\fABB#e:'UE1s%b;o.bT=4eFt*NqIQG%2bTE+aj7VpA+O) %rRZPuO\\j)0DjFbY`3Ph4:Nu3E(2+0O>)_4&iU[,PSh9;f8$NQ3`b%>L)WdfrGU!RM6]=::j<cWKGp4CM*@S53/;&8`Auo5Fk7-G %kkaI;=/_r,'2;lm!\FIgE=l=eTGEqK:C8@,O\7i-IkcXVA6(MjQY)Cc9=UA<<;-&;1l)9tcW!M$]=^Z`ac`0nhjLEUYsReWpiM'` %R+@-2`%a)Dn/$OVZl2Y#a$QB(cPLJ*ZBics:<5hahWeS5"0.sH'OhX<[La*+nUug"(7jXnW-^r@#4u`77'MgMjAar^C-+'V2H>ol %O=pHqWKX/L%Zj!B(6?&u`LLc`PIlX(<LPY&$><.;7OLXC?T,60;/#V.i8k%;0*VR0,&E#<,0mES/lM7k9=$S(J/d'V2#`YOjmUNH %AalRNQCj+uGp;n-(uj?!A1-Z:TO1,_$q.*MmgG3r"QO2C=A%:[JmSb?KeO6\A7NcG^mQCK!/\roF/L>FZ:nAn0;t5D'6pfmP7"uL %5A@f)'Z(MdU(q+/Mo:+]0i'0\gH]3*5piE0pX[a)8Dl[&m2/LLQUDNPb@2+16s*jg7/S_fSL'HcRG]_.LF34=,RmD&*misnD$aK5 %D2u\LWtWAAa7b?<4pYR.Vu_Z5W*5X"2XoiXL4,q6PH.fQM5U^+/iYFe6W'hJqTPT4%k9MQ-#u>VE^lYT@`1`t'I;s0%KrU7_Cb$b %k:Og!:ke2FM260rKfj-FZ64B\R'p:_nO[6NJatq&"Z,;0RJ6lC3>6:gF:$6`aSru&-D+g4DRi;uQifbCbG96o#05YtZ"@TLd[R') %]tapm"&nc`aqUYD67?4`U=[@7Vp7UYi/NnA`CXiAq*J=;Fbh4dnJ_hAXmA_EK-X)UY+Lq=aH6lB8M;Dr%$G-M0J5MnY:_-GMmP*U %:)I0!QT(Qoa[9#c'/>SdSOtWYP:eU.'mgQJG_DLm'9WsGGW7LMPDL;H.-MrkU>KX<:/!l="s8eeAIif:SE0#LFoII\%TEb66["M+ %'"T(Q_Ep#q.[!f??kI*>*06@;#sSg"(C?GhK!o"';ZW`J":mkTLs6Z?9F#=VaSII5k:0)P@_9fNJ!bWE@pL@:4\>(AG<?;V5^Z`S %'2N%=&rt8j,!4GAUjtT_;QWOV1jdY@JQ?;b)OqJH4@s1rXN\KdnaKNa99j2Bi#%t\_aKEa\s>c$1bRGI#(;Yn%>ni9,p!)s8,jjS %OpTntc%4!k/V7Za<h]g=.(X(\;L8R^Lj4e7..`"V'`hX=.27ut_O]VP1jKa73U2QTWjW$T)q)Tu)s-Gr4B7.J,>=LSR^l'#8fsac %4jjo(CpJ,69oYU*;gD+lPmlX2OW6%]OY6G2:E:7>Tm@tn+W2P/Vl535`Z^?gGssKG0]Pk6'j<`&\O9FXOST>1"%f"3<s?T=2T@AU %;Y(fs9",@g0MKiG,8m0EH;9I8<65bNJgAU8lf=bn"XXj+Z/C'4&><$J"j+X'%jYn[R6i_AZR^Rs/t3/5&rP4&Usa')8YhDgI4X)m %0n*6SkQ.lN8?Fd@-Cr#M4rQe*TPEs#;<"ZJHr8(JlJnRjge79BeHYYf.85AIaCqf3`%p2%QP<h*J&i]:CrDqMnRMnM#r9%nVagB\ %B5Ku@\Ub@K/3T*Z*%K$lM$#Ym%i%)U^G,iR.iLpVRK+])!DHno@&lGhiP`=:.%,t25[]DF$RK)1).(7O,]39e7Zr\564in@mkYC& %@*KL>QI`O\0/EcKef<5A1&uAHK^/\sYn\Wpb@V,5Yrq2Q&c%jl!lJcYRO`n,UbK^n#IG=A;@cqm@:?-n@!'_*KnV+:Co/%GKj6ss %78;Anpn+?!#cQZu"bAg+'Q3T"F.H@MZEi"Z)?AD'8'SD?>F+V^>#YQQ,&p]S`+C3EhjOHoJ?%Q.F[eCt_N\_2HuBoE$l`X6KPJ`X %l7>b>d;1eBa6Q=&M"JAG$#,.UK_?jp:nbrt$&BF[OZ8iT_i%+ZR!R7O."k/)p.Wsa$Bm#P"OVs?eT`Ab'WnP6)N5#0(9gAbZDI(6 %FlE"gI5V7#U:oIf28#KEB*3i(O[+(U.>H3bCIk,&af];be5.$0@QL-kOFUUtKhM"a_O,nW.I3u<&9pO(cfub'P^3(<=C:&sAHNbR %*n`J9(O0XJ[3i08(K`0R?POR2(')J6S5Y0/7uLq:00DF#,;W'Mc`.28+;t\q@WG*'1_;+:aSoJ:<JSK/R35DSKY2D*9T++Tq[=e^ %@.lho?qTMVl0*f("kFb1nq[*`&62PbYilJtaA8NuWA^p=@&L-<(,YK1*'2TFFn5g&#Wg2U\7/l0j#M!TQ\6J\9Yp`#F]pT%-L,tZ %fgG@lb9F'hQOZP0?;R"se/M.:+aQprBl2em!F9Bi[-!KU%GU>"AFIG2AF<?O8g*OHnmdSPV\EP.H:V64/mnbp4l@*J8:I6AcF*_8 %F4-ajHGm\NWoXGf_m3-`4sjpn#b1*9Q/L.$A>)9L$-ik^o*UFkoZca1'/O/9:_-Hh9edJJZSE7rQHa8KQ]5DB&.h)H&-9"XbmXk& %8?3&+>][0<lFgG6Zma8LXC4rCd[en?LgL!%.Vgp[8O;pifL7LN>6/0:=a1\/:#[=D#SQ9afIs%ZcVWU);GYlpcf,s3kn0`V-73`2 %;-8N3CbQYo=\j=GKe-53oVA-^nPHi(FF@'#i"6H$i0M22$mqheWCRK(aYP]Z88dqLa`N5,g]3iK2.Z$`JYtj<_Ru&I3g6@-aD?^$ %Uq1#eQ8`4'#qfVFq83&5e1)1i&=lR[R/#37AMZ<&Pt&@$)8]KZEcf@W#!smJk*ZU@=s7i8i[jk6moZ7k$V(>)[AH*WSiLk[[hU$5 %Gr6-H_ADt0@!O1]bQ2T7;(YWml,QqZ'4fR;kQDf514oXZ^dq+ZaITluUc[5bJ.se._1;V8.mt#0cnS9]+Cd]Ja:+dSR1-$'2FWTb %)3seo;tWZnPfus!b\A'_6:_Tt(IBO\2Tu0HMlD9fF)g?uNK@n>L>8mR-:0RW!8iH8'hC1q8\bJ#!XS-lrsgHHYVWg`63R%pc=pR] %cF"/geIiZ07`mQA$6Yp%KpoQ4:8g\k&3bjjAWUs@gpjpP.sPAo&PeT=\T5&*TdDlrX=;47Qk\4!oLiV`;ImZGKqqt!q*^k>;NYZJ %-,dY&rLB#_'X_+4T2j'e6RfY_gs\ho`s%pbK#Vb(i1>h_<J3"<Y*iDrR]!RukiFW%<<ghRP:g%7ha]%DZ\H%_-TIL2#ZTj3EJfR? %>apF)XuDae3#:ftAitEF-9*`+`.lCe9PA/O#nmk0X'A'T,2D$$#VRYO]V(3#+f9uLQI@[:Psm3J?:keI5-Ycn<[/mZ$D8"C8omSk %DF?qHC88=8k"+R3])YcD=sPaVI1An&8koP0b6?:!>%JQ!>Y$P[N'2_q<:uATZ+r[qTAIdtnt4QE^m$g'a+[:ejr#4LQ@W*+]U0[r %#3b"0#3o5CJUeBAZ"N_tGQa1'*-Od#[YE7&7`VfRn?SK<)-a,Jj8cbblMb?c=r<,qC(;]PpF-:VqUW.f3F1"Y<%eAsZ3qG90a8T8 %2iM_nQH$*(C'2f*7>)>8&]2UBfmM7?[t+UNJ!E`]!=m@o9X58>g<,MRo5%_tG#5tYA3(:UgZB-l&VPJ9OTdh6+<1OXGjA$q(YPcQ %[hZld%+r.#Bl9Z,rU.ar4f"M2T%+a`Qcf^k(_RO5.(*;p`0?NJp<.K\W+VE0-Y0T.-4[9e#3LSfn8fC#L(+Ji;V`Q-^gu;@_nsG0 %`c*4>%MC\=6u]GiMRr.q)G^'P&E8AL0o"TsIL",kqO:^1)H'nM4]t&2&Vlri=T?N%lsQ%!hmeD?-c4"O]W3cL&TMmY[qE%/F-J8* %ga,#I7L'dH't.4Z"K4`Ad_m2rfcaph0h<i._GtVA*lqT`aeX+lrJIYqbi2r[@9B12fUn,FlOQmYSKEjqX!`PEW.7G7deGc=HCm3n %;4T!GUV,[?`jBU$>U7(+!BK4Wo!3f1Z'f!s%e2PSo(,;PZdKC/I$"3oT=pC1ciAh3r^Tr<]8"5]K5HH^5cD=5c6h;f?KEq)IBV$. %%YBUV1MLC)C$>/)&MrcG9e^A9^fbE*L1<ig?0npgU-g[26]`EE(JYrckIk*]B)5Z+n?RjT;!XP6"GJ_c[t2Q7%$8W9r"1$,(8m!- %q#s*+WpYmbTTa94(;JPp#]p&m(KC2jfi]"0DSRJ@W8$;Wc_DBN\-RZIKR)ni\3uWOi"]g9fY#k?5p<;@M@^7K+I&m<_$1q_'Pn2= %S(%H24/nmircVo&.>$SZ:*W0HqrD9B'\eMM4Xm%c*"ZI/=H187>r5bEBcJ$<U9e0gGQ94ZSU*^I-q"=@1*N+.K&/a%Qrf3/LE_9i %Pf?PD+]nbG+bk?\RL,J&[PJeq3hFuqaM(g?1G8]s,9_<')p"QH#<]M(EE@h8&Fu?&Doh&Fjj1a^ClhE+c:p2$@,uT36D93hcUR8q %d<AQPQk4if25C`[n:!Yk*6Ij=)RK])&O6*1n42D5W::c<"D)IJb5cl"Zp=,Me>"?(!LEs4Z9V=DXEpUX6tX#t,Ao$%aSI$2[bMK3 %K_DZn'ifUtSQufea;jJA3<:WJ=Vd^bY_:9.B2?P&T+qJ5RId^7D;tR]lEZqQp*HXW9l*5eAnqjOi8c@-C>0lmZ*>[/;a$iGa.Tkd %9=?ied++PjAt<Ksb\I&!&2f.k"?FnhLiZVa"<:g-/'Q9'?\@lHj!tj1$S`_b?(<GHT.mUo?nu<_BhT>r+_A(!AJ$pNHfd.RdNYQ1 %5bM9!$/\5?fRGR2=67Es$6UA<O_!Q/CG+o!R_He]47oaWF$/1)V2)-\Gd3O!(HFO0i$!LI#O.2T#ol^(;+ZBhLjGLB9CO-f@d1j9 %jt^a+_!TE)[tAW;,9Y6oJ>2Ys0F(9?$ghTn:6Tu6HAB+!5@KTi,aUSD+^P7+Si,`F#33[WpOk+-k_+o%Oa7oPecV.V!Z.noS5#Vb %bBksn+U_.4`o<]:Adh?NiM_8gQRp16*0LTNN4#Q$Lh+&Bgn>(k*Z)/OiKge&c&#VhKn:QnM)[EHL<L)Uoi5=8_*[DN,m;&u$O7h? %B&;;AB+P-6'0'*2,DWBh$psSLL$C6a6.59o7TAi@,>ZrUQo)F1N$p7aZXk6*+QC"aGtMe-FDQf>hsY>!:QX*CD<rb/37pUL*`Q"[ %M&7E4D!HPCK5f:)*0A:--C$JoB4=oiaDJQ=.)YR%7T^6,EnJeq&r+H0Ti"(OMfLQ&]iLs:LrlJSIS(<WF<Yr=c&79D`?;5u?R&ZF %&g"kGo+7-386.CPH))-?in9PcV$Gmuj-1V#drD1<Bgi4lZ4^5<E%taWW;qsIWsOY6&7/$4&_l[V41$RMe4\prSm)tD@%W!k!*]r3 %P>`odZ.`BFcD*gcTujGT\qW[>qMAd6@]pbU;onsB/Q1q"(L1sb2#54tFE.`[e<3$:kl<L)o%[f*Y(1ceas.g#Ap-p$.l9kk5.d*o %8qNU464o;n)53i2M(_eFq4JeoO/@R=8deGCJd3L]1cN/U&ItV(O[q?Q5b8AW3M;"a^\A*NjFpK7bl^CN"87&`1A^qRL'IJ^1P)fZ %`/`N4D91]*9tDKN91V#^ndTjhELh'iNWg&LqLh5gU"bOD)6$5tPXF"ql^U<J3&u!5-QPN\-&9jmOEJ'aWuAQ+i0h5FW1m#G+fscs %d\HZ__dtilHAE![1&5e1kHYWg*0taD+U%X"s)81%D\<WEjN_9YDP;B]"BaU&,MQr=i$2\n\Q&bS5,`"^p*"fiD/<Db0mn4_int83 %r'`u;@h^#V+U#h8N'Ekij0LfL"*b78PL!I!FX2G=g<4U?2WBiAd`:o5NB"+nq4J>?)$t^JT/YR<obkXB^n5qYI6=-@h3&Ccb`cNl %Rts7kkVaT49[X=JL7%rcqqYaYIg+M<98o^;nIuQd6N!m.'fe$:6Oh<bi]lp)HZ,$\JWMU4M^7m;FZXdZCpNRIg!PT%ll=$5ZaU1# %&^[+h)9[;t&b[4QQ-j:k;)5c2CW,ee0tZ:Z>`_F1m*j6uKXo;e7t]h-&mb<mjc&4*g4Cp(H]Dnj"6mMbaQV"2G`BSki4Ri-Qm=2- %YRb\4#b^kq!Z%9CMM$V5P_bT]Y_4ej!q(agT<G^9+P.L2hFIWg1.l1*^boM&eXHkQGoReAm=Z32T-4\"X4P0cQo*j*1DM&)Gi8m3 %!NteC=I@?;m]?Z&$eU%Kc%S_aj`L3JY\k9eL7*+gI3'pDX?6`eH]qkAbtEm:+=e2)=;K_Ii;4I,"pm$s;0-)Z3ef$n6k3f<f+UF_ %c5-dtRedPB240&?I9)pH#XKS1(`[#oN)OJ]EtVkMW7T-Q$mHm2kQ*`%6_6-0i,%n:Kc(]h.FrK.J6kn[L`@0o4,!C/@Y0;9iH%o' %;&<@WSA`=5Bp4tmfI`L/3A.>,!cc:O*&of]d2;NF%.>f__BFm_R<$,&D\"4O-5\"IZ\'_="=.q3R40`"%Ug?/jG_C;$3t6N8e;S# %*^nRFL>ZE6&eFQ$Ks_qEJgQq\`(ilXf-G>r)1m=#Ou>3p30asCG&I[lMl%75R4p'<O[I&"<`U,qRNI/'A%&K7aeGQKISi%5U?6$l %/%pTsbQuOQl%/4\=N7l7RUfnk(4]XrN+#A:bW/LC6>!jkqV.0&:B/Zd0d@[rdi02-O3`NW03C>g80VDO>r1]t;..;7eGT?6&`[7\ %I'*a-Yq%PG[4jPTI("m)JT^\>bsJWD"7/'pMalHMJX\]9T^EU=Tr^`5c'mucJDGCb7>j+Sh1E2(bI1Q8]Bj@g.mUU%A/e(K$F$pB %m=Z3>eP*2\3hK!jPA#*6!4h,ah!7-)\\?I7g?LQsd]Dh@=LUrM)&-qO5k;I&<jG4LFm`)\,3T(TD23Z:V])_L6%I1HWED"Z5bBP6 %OS"jU-j^IHc`-&qZ66q#$<9qM#&sLZG2'&38<R(5#QZ4=bps[Y-gmuGi%pQI)1^`e(8Nf"J2g0GY?ZYKf`H]q%!!?_T0l_l5HXho %\(WB(@t-K4Z`fe*P5Eq7X>.K=@hg6[MmqI4^?^reNVDhe?dJTle'sBu%:C%NAE30I7aMR,+*^Fb[SrlH_kNSO+oI#L2s?d#SjJ(, %+Sc"*dC%=Eooo($gpXLK7a?i#3i.f-GQ^/A27:=efdf4<0jUl-%W$K#7^g:+OX*!0Q>1N-?FGIJV*p=GY'H.?1RHW%6l$GS$c;<; %[S9)[!q3?+2\M6`"'H*\+jn]Gs&,0$@":qbV:K25-OCm)"ORR%1BE;NaWe&tne*p10=crGVW_.m^GUtHR0QNoARMV@H83+"=X'PA %7TFXl,=8Jc]d5biM#@c"LK*EK`[#Le#2oq0n$PN68;[J\nGtRAn!Z\qVpIsMkmC"#=@d14(YtZSYtHR"([P]c)Ib-TWuZF7V.ME? %5eN<iBZ)loeX<Z%CV\8Zk6DYbV4'?_%#.:.'r/gD<e$?4Qs>q&0fOfp>6JJGlL8jGaBN8MAI\^>*J9/)a9Q@A/b?CRa^[n5g.2s" %1No`qC(A-"NYa?4,!59j3EsH8iX#XAEPX02/]GO$EcGjkCg]4BVno?aXHERL.&(G!+rS/i1'4KuGa]CEJklj+NOXf/"9_C"Dqg\W %`*n_GEJD\HWGnBi5U.DI@(G`A(gafKHmjV,1:ieF$]BXVO53C2P`I)Z,kl-)jF*i2e767.k!:OE\OiV=liARP3I@"XLb*o\*04?j %(A0uC"O[p<F%fX[i<NM89=HFXkajr%b*:WuKH?'gY<>Y&+W!;cD=*IB`n)0k[e:]MjeEN4nRht_LsD*m@uHB]!,t)_+(U:j]Kf_B %NQcNLI+oZ,qOT9&P2$^h`n99<]d";&WA%R8M`:!D>Pp>i03rsqI`Ap`0X\lTon4/UBo?o!>@D9)O'G,L%jA!V*^*Q]*%/S"<f`G= %;.b`i#+G9l'!GW-JV9f0>7r4BLm02iHf,06C@ElnmFP1IGjT.gP!l7?F#4p@=O%m=]&tYW,bKrE#RQo)RKYpGG&&6B\KM"EC:75> %OZP[E&O\@"^kj.rES+R(K35boKTh*]$ittgO]Ea3FihqumdS;?3u>>Vil.r_973(M2=a^\+$37ecB-e\EhEKC:+W@[EculQ*V`/l %5r:&l/Hs9_HlYY!N0X[8p]+r$?%upW$9'LN:`R\d!ZqfXbWnWqk&mU.h>m**eIPDrAnZ93M!45s$e`%;jJe_nbT^nPD#9F;;2#9B %TJPc"Kn_,SE=Rk)5e'KH\8Zc;Cff7SaMG]dUKk.Z347?kbtJR+W]9NJk.,'<br>dg]7f9'(b]1n!,[Vli$/%W)Z4%RlC4>qm3X*g %,FQn@&fN6`/^.j"V]$_JE<$ZOb:N`jn-1+MY*6ip#])iZ;ehhK;n-Nr(-uo`"[6&O9XFjmUbG4W(k,OO]U\YI*cK%'G*0_nol?@Q %h=F`)g=2UIdu+GhBdrsBFp"V-mZ3**DC(*EC,-"0Fu*Ju&:=j?:GGJt<+F,X!jDhj2%tf?SAYPRE\^<\UL^^WrJnf#ZBnGlT/'#Z %f2&bA=1QRG;3D_WbD^/Z:(gLg\sqi)K+J("SEGbm4ubX1`X4:G+uo8?ej3p]2>#]b4AO'ciY!W^qg,uSYfDa?i%.(tJON.QTA*'J %)n93,,%0s#;Q-!*1a*JeA3KEH_3i^@@T[.Eq8e/s"%#R7>ktB%4*6AAocOFnF:aDaE?c&nO='<QBa,71]q0.i`eip)kX*9GqR"_' %Md84pV3W"0BUBfojL][VB*@G;B&[X)0++V)4D8AT!XU5+P&@tLJ].ib"C:7B2tIeA;J3#`W[r_eO?t`FB6^g4,XGK>KiBD[i@NO% %QMnm]A&[!@(1"/cZTBYR^^a:ZM1BA\)B*5C@*+b7"+$%uZ"s5i7$pn\IdkT(Ui_FR29dD'ZGT7gm-USQOg5*ROXrLs3\7(Q%!lHk %mYZ:\,-h>T\hMm/(_&BY"kALc%>1*,3LY4BEDSC!,Ti=Jbe^N!/T<fCTjT-Y;eZOq^LIH"Me*.[`G(GSJdK6n6OBCL5hsC*UuuBC %b@N*$%9oaom,A[J*LN3I(lEIqHBfS&SA"GP'Tcj:iO">XW0:2'2FQ8m9g38D\8R`B?Ij!#G0XV#e7[3d0.h#dl8`nWM:aGK=?5'; %$@r?W#WAS`E!RbrWDf'0G+ikT8a/u=Gr5_e]k3VP5[E@*S_eJ*^(f=q\QtcEg5Ms>1U1d0-lr*D0E<[)[t`n](5=.To+`_2B*1BB %I,GAlCc>;/^.-db=75S+am<1_4ucG<]*AQj!Hpt!S3f(hQ/t$2d?uRh#B7Lm^`>+8l&-'R/:##cPSKq;=G^;O^DOf^>Tu^t^*ME% %OH>,"YZYI"#/!=M5h)#*/q_i9X/1Ccj01!u"*&$a"&&n;Ln,7]H3OgH]f=+f$6"`C5`.)3Em/nuO&fa'^o"+lP:IJV8c]b@W/F*- %4;;rc!/+sZbsM=YhB>Z0:mi.94#RLU@Sq0SF^i#_0b0OtnG4C)?"mF4ZEZ&nf4TYYYl9U=<:Ruo+*49i'b$_FqM8*4\YL]-75MA" %4o+DL[tC#IM;r\SnF_qm5!8&lG'F_sbdaBuch/l459TKE!?N*`)MrUJ\V@1Q1TYSa'^fO$O*j6oekERtOltaUIt#r_*06lJ.T"aD %]T`tjh1Z0-hl1=Xo^ESbn:lY6kC<74hct)8eCi)@1]ps&<YAH=X&rd+6",Sl^=Xo$oSJY,9sJ"[-@pG%+r+AriYGd#CuOop]I'U` %-oo08\]+_F,LWhV^BP)16-Io(5id/F`K)g[0HG+7YdtiR(<Z_[0\%ZYVBglu:)hg/)4W\+5WNu-8WhF.7`eNqfs7&_2rH%+H9`0+ %PL.DhL:/OLWl\9Dc4Ja@^bnA1[M`J+6G;r48i]sH^gt4aRk?Sf?nrkS*btCof'2:^7KS7Z@)2=!lB+eDYPq7::;YpsErcUA_0/6J %**+ul(UaASYSK]U(GQ`3">fJl6.;ODDE=BA]:]\17rcJgr%>[bd21L8Xo$;*>i+IT![-Z:ORRq?Cj/&Gfo9C]>0hfbmM__lCLt.u %`t:d^Xqh=M_CDT@4!_gdG#ig2!q4G*rU[Se3MNC*79qZQC(3p,KO01Fr\ncn6;]b.MqjICPIl/\/UPKMH+,NhC)a[+>tkg`VL#e1 %glYGn?J+hLJnD@Zl,M4XFPc7Ic+;.@U@hX7'esa5YDJs>d]T5[^j5J0Zd.SEqM95D'C`FV+/r%Zh]=Q038oX2:3AG#J]0A7BiRJi %O=A*g12gB/$"*=^H<'*'&qEKc.L;b<e@@rY-4DXO=`G:H>1>1t[K.q&Wks+9jkS!g@(mb9.e+CQ#Ao=i%\/ob2]q#B1RmH`SE/0d %^5+JM,ZL-e813L\%OPQU",d[(RNWL?h@b@OR-Ocib5&Y_D2286QEYOHf?#^eAfX"qWXq[6?I&4H6<q`$=UdaR+isBZJ>[0TH'FeY %jd_;j7nId1&Vd<J%`B-gSEY7jlqQ%MS6\4BN"[Y'M1pk1/B8a>(\*fkmg`G8\c7[McLS2P'rfD`PHV7J&YQIXO"_cMV8iVI\6-gX %Z?np]mXYV5o\sTEn@Ap):E8=jI>/fWg6Ap>-50(_THhT34,NE6KcF\.e<;1M+l:OH]:c\P5Ifd`p1Y9\j$taYaEab`(]eq;!?_Q< %UD4Boi,5uEjd`0"N%]*("IuTKEu^OlGdZ`[d`30Um[W;7Tnog-oiJE;`-471hDb%<9?SqPZ;mpp)tXhf$uJM#mp"51F'<?l2<B.n %"fE[3*IK(okLLa88g7=N*NPMI:+j^$oc0.HlqboL:UrbS.=19=Z!Ir3n_n#j[2PASo!K@?UKd3+k6BFW1`);X.ZuQt\SE6XlSI3T %KQ[F-Qjhh:oPt7g^^a,k,A";U!3[Rh9jQV\<tPEMAD'je,sX#P!:VH==EoRdPm.O+ZWtX"AL[_R0DmZYMF_'5V'Sr`jaRQIdKNjB %s&4E5@L^Rbp?-8q>)gII8ID`Z[[=W/+-$VXs'`WC"n.`Vi>0rOZ[AiU)qTEc3(O2OLWn'b`qY]aA.$k89[<#OM`/`>.gC+_ZC3g\ %fcPjuX%ZR`]U\fjIMIe!lX^GM8ihFG<J+omh]E.m`d7su6p;$@biZe!'OM"1gHbnf#9KKMjC0_o_R6L*rXH9dY$'\R8'"iVZ=[$n %GV:UbbDVMGGp^p^XOg:=jnPoIN2,/PW%e9445<=\U1D]Wa^nVnYoZ`?7gJgh#h%_:O6q68YIB7[bfr#B`b4l;k*\,7:?Or,4&UoH %ec(Nk]k5GrfG]WMJaq`b`d%n$9L=(ZHLiuQc^^\f9be+REkn9m(-?sJbe;LNpnch`[kTF]qnM;7U13;NQ^LQ;`:PCgK[X'VqUG5@ %(T3`O_6jZNEO[Ab0aDCWfkSfO)qf1$(1LW<F)K)SnDZj47L]MSok>9!Q+4ofoL18#^8h_eH3B^@2<>"eod!a7.CBTtYn0cGp[KGG %hg*n@CH$Yc!IBpPKi5V-d^MCjklX/6D5gYhFq)gAXa@`<(5cb11eQ'V`;Q"<DX9gaC4_B(>/W>9Z[o/9\#i@_FcgcMRX#B9(EjH^ %lSY`-@o\5l=mP0G;4h(.gWi_TmE$H3\QG^EA7!(nY\Wp_@%:GCKPB(_e#dKk<A#aIr)q#V?^.23T's^9^('X^EEfAQW?TE=4X3@) %/86H2S]DB]<t0SM-GEKeL(ba&EO_,QA$FIA;&2/?1XQGl@,K,=mK32!(baM'Zef+)QgW6,;ir"E,<!C*r61De*#i]I1F%,lWc/#< %%5X`;%@T8cN+7n+nD29t::NKM"_U10?`4suP8+)4f98+i6ZG+,56aEW9!UX+P:ZRu@1=`3cK]J0$cs??"J-[9--'o8*IWr;Z,%%+ %<]0<K_potc=(?Yt"9RMk#MO;*.M8*m<(GO\W'V%"h=nBl?u2,bW*,+:H'T_tfH$gO^^^cH[ZsJnH4B@kL,"Gk55?$(N0L!6nFFL' %5"Sp@%a^m3jEKgn\hE1KDGK4feNB8e3X+Cn:4R2?1ho32)(bfY%=KV57RrB.U95OZiep6@<TY'g=1tIQ2D^j!84flr=Mo:<Xp]Q@ %ncC&UDJM`V([aDXRu8<^8Y.ZX2qjNX%PoWm[h5W/3_<@(T0QY]e`A'V_kjNiHqo^Eo'sogrHd#o>W5[S2qT-OU$VkI]'0Z!dFHuH %f9!\5,]MNAf/`$^\jSq%+Q@D],W"VmiIWnQX(:A+2VaO+eeY\'E7QHs-'W#P+$57T,a+@n%]Yi]&4W*7?C7&e;i/Uf`\,N3$JhLZ %>3$GU>Q\t`oe@Xc*onRf^k9)5WK3!"s'l4sh65Th*9$!IR2G,*RJ;NFae:kN#au)=O343QQY2HZgkfc.4Ts_XXK"`Dq"UM*V[<[m %5X'<s>5$YgL_h_NdlVY2'UJEnLckC)E!3/:p(Y4/"ECr7l92;UmssTZ"M7'9dRss>*nC-@E1ga-MS]3Mj?l\TEK1^q.`M2\O$rN8 %8N0>):H)EIb8`P'P0P!Db3$c^i&S:-3;(5Q&E_=li^$5Of+-W%$D'c=Q:/up>,^3H^'/nAB$fJ%/i-r38khi%K^<`^GaOh#D^SY7 %bmfVc6^O;O;\@FRN4EDL2_fUIC^=Ccdk1SI:<E^)0-N)%&$*"h&^UeM+HFO`)@C7LIG13=J$n<X1U>]`lE!&:j%.n&Q4Zaf^@`+? %,K2Q=SW22,lV><?,eiQKBWT+Xe9k@5KuJ+f!E0F7*%-Opp,d[k:F1oXf4o,JkXX#I>/\f(DPV\3j![PZMU"S(P][LJ1CE%5BVYsl %;t#&!MKja*?K><bZ+8lIb-p2ME5'/\G9XT=PuS?C6)mYd.*2Tr+))]@fdL\Y<b(K)"cIpK%%7$<Me#Cr[>]qoBO3V^)5?WL7g6g, %*M%1")]#-tflT!.UlB+,'3jjXmlg&-ddPm\An,uS\s'cIM(d%V"9i@N?:e5<:NLLo\hCWXL>.+NGQ#gf'4`h4SZqB(N8nRj/*$BX %a0HUrl,L!=ZoV\=bBBCoKr(V.[BOBt_taG@(8G1CLPno)#@]rJkO0lrA<'^2YPRbK3$u/BN30D>7p:n9\oDO=Xj5QhfT*i^B[R.O %KEc'@o.igP*J<sAQbKdQ#MXIpKoK='d!'W`I15.L)_9r/eiprcS1omHF4%:2rnPO4*eP-J)gjHi,d-Q&=2ljBbq[J['N&cXKC,GK %oCl<qkqI1$Fk1sLj(KA^j#L9bBc>$sn(NNZ;X:hm+)X.Mb9Ecqj=Y_kc*8c,8:Lof'2^Co$-G4#SHX];<im$9I=uS[D'NV<Co-if %<o]un*1KU%1\S(ia8&bH!Q2[J[[sm#GmcQ?!f)]*<H`\XXaOjXi+:]HcFT'F*,T1s]G@o9Zl1;$j2bK,:0@0$[c?k@EtkOG>L0I2 %f4%V6&%Yf"b(n?GkFs`-f(#e)r&B_FOYU4#g.,>+e#d8R9<0lB&[p``_`fXd<T3;eG`Kisie.X"+$U('mCTB;q5r1MpG%W%D59ko %l`PZGeMqF`8*8grG[hieFrXi77D`Xh2nH,&8SATb"[rB]dL&3X97F):K_'JFj`Ydd5/K:>[]qTb\_9P[NK^toCbAb$=nT%9a-#Nj %/g?*=Ba`W2nnN-H3^4@nW6I)sj)"t'\62Yed+-kB1Q5qj\8]h`U>!pKX[]VuCF6,dCG"k$QL/AZn3l[T\Shr@<`g`mM*K+a^e(]$ %L6k)-/\g_oO/#i6.J,N$lc62!o.(OHSGW^OXe2g<NId\ofmJ0Rc>8<>F;Bbp6uo^rn\>HVfLOErQrs_kAWA[&Y26UjED1.N9-p1[ %qJr&[h)M:WXk$.7^=I7(>>];b=?7>UQ18<PIJh6^'B6(<jnH=lGk`BUZ)]\S0ot@.)_"_]>5LjkEB4tCk@/ShWXlQZVjC]ekUA`P %/q,]1*&3Wnr0T*D7>cQ]-!..Pl6-S2oR]^WAJP0Xp#3nf>TKZd6Y\1<*gY&!hl>AI`A:<X@49!Y[-*EC3@$M(Y%t8`a]C?Qj:4PZ %iR^6f@2*V-'eR(8>Pjf.;<Da1SVPbJoWTCUSc`/gTTe_nVd11D!_VOAg=S4Or-c!lg)I3JA>cHYM47i20UB,p@+?N<dJC\uTD_m_ %rKYZ)k0rUsHV'^3lj:Dcb.:nC[8N2;e"d!SB6%W_`Eu8+<17.WlYZM;a0_/?<+JVebAG7@j-Vm:>&W9i[>)"r^uSr@;B#s'\A5$- %jO$"$0LLE4atB\@B>H:`Y1C%V@6A=,$TZ/Pob?$<`F1m"Q.:b]NoG4EGqt)R3kdDT98]j*1>h"A2Nq^.@#klM!hMq:e_&F+Fu5.j %m:r?=\+N_Oj-=&c+_!9%>WW;InV"rr&d<4.V>=0O=t'!]eNPNNTI)@G*W<GK@6MjSk\I:^EoVDqXqo0->>K-"T'OCsZa*b`duiOJ %a7g/0PnuU=I2U?hYFs09"_@p\?GTlb*ibd@E?oC#bBTV("`G?ZJX]`fp=#:%r,s?ZmR8aoc$H>c@9(ATIC%`-a1GEO`&Zd]5mq!J %:U"s.CTY/Sj'^H^$99c5ob5oOKmkkL;Q[=-]32RpBs^LFNRFP^>oDOAKL646Z*7-JV0Y!V.[Wm%I&tW?8,(h`D6/]"(TVtKeMsCb %;s0ldh-@LO2*?"qm@:"W3_,np'F+W;G/1OB6-9_qOrDTP8"uE+5.+EppQNVEXI0blFT?/@EBRLl8$b3u[9!7em:^NCT#U1r(L-;8 %3A?D5l4Ou`a>"duk8IWNGrAa/YI3V-(sSLPTk7A/5KeA[AK4G,A@9!OlaHSq*DMpR:=N$;VkUahSZSWo'Usk%^Qa0g\jWZ$g2rS! %nZ6"J<6^TM[$t%jA@)<i/jc+/?YeIphMu6_EpNgO=;C*-r(u@<BAlUZ_VLMpneH&Ejk'J+EAVI^YTk6;"5C/e&K9<HPR.e8X0q@D %Cr[3-Gqq%Y=l4XqfZd>LIoIubWL2;kXRE,X6Y`0/0E##(9$40i>l.CA\rP<DhfV+dVp;gGZ@],,A2?iiB74ql&bfYpaZ@bXE'0Tn %/72QRR[IDrCjP;8d3`$rj>9s(UPtt4DA8Xse<niNbaVJ^/Tt1Mm1m#q%4!U5FfmelbA7jU[YpI)-J<-NqADfPB!kIPEj_OH*\@hr %l("i@>PGIYXkOq]r[-HWGuteBh'%u;F\]Lg'/e!>$Zs-6e]<tmP-+TNX3n:W/^1e%Q>43Q*,Xq0X)i$`<rK+.lN/3Ok'[6*(0LW* %p5l1T!tVa:h?"h*%m=%qACX$a7aWPde,gcHLDrbJ"!BW8X0Lqufo3fF.Tp7G>m.Ja@s\6cgiE<`,Er%5GPSr+!?@F994)>u,E:_s %)_'6tA*q1;`p!PkFY6]BYPQ>pEL;24FUEJtP?pZ+Q15HHW+U0k\-7#L4LM>@IjJt,Yo:#F?M0H$EO\^nj2W%f5/M')0T75tBm&!T %CrXm$HLWtJ@VifnQ::R(I-5I3-U'ni3=Cl3pK,d6T?EpN_RbpbNl6ol)&&t+[pGBN84u11cDK1GFKucUFK=QBkACs40,/1<.B2[/ %<#I\(pZ-36M)0D0XIku*>kKn4UKKB%e:""@O'@[r#Q*hW\lu.`k3ZipEFsS\2uBj5@qX=n@3D6H^U.C?@F/)<U34>aP;&#mNG9?c %HaT2c)Fp6cfiVn9lE!$L[NjIJg77*GGBa@>>[8jK)Ieg>EcDjO>Zg',Z,Q!IaX_Kd'!A&MlE0rP<b#=V>.Q]&n%*P/+^I<CSQ`-S %YIdt*fa,73".$/I)pDp^$MfeXC_mrJ4GKB&eO*PA+=*koLUC<2h+o(^ZY!5dM8ZfoYT>CgUY20K>-!+pG-l117!ZB:1ACZ=[</]; %Tu:U>:f+W?P#^bTHBK9:)sV:P)Mb\c[BsfXBj^IDb]t1,VH0bZ9il*YWs#o)P07.R<EI8N)EMO.*Tj3E[O76LCoH%\9j4Z!5P&VH %D,q&?2VQ_X?B<Z+=k]CIQ<X*iL<Y6DR_4Dt*a<Y8bEcmA7#Z(-L?d\8Ac9;O5%P<r[8('$OiMIKNKm)8NV65HELbHSQ-H/+1\O\S %j,!T9gYGNc"Lg/V?%^oj&2\J_gKo(G\:Eg*LK;I!qXEN)g.'5Z,sl>gEA^MX"!fpo<bLbDCr]Cs5n5<gh-m0]`h<^+2B\?Z)DgZE %R!go_+,&7r)>ip`382Bp,aHIIQri=lh)I;/WtSN^K^C`m[rE@[m)jR5.?4GOZtoi/G`6M^TM3P/O(B7im)jR5[?%U3V[H)G\QGE4 %l6Ca#5frO:a%$ZO9SZZI)%)Rr20BiZnI\i;!=)1R0A">XZfui$^8J,nPj+KVm3A_<lLqpGFLkXC2]JtNrMm%=qnmZ\b\3%X99/$? %>toX!G,$R16Y[XNlGJVABH&J.P??7g?]F(N5*<C_3b'7\4-!og&#Sh`?\[D&^aB6[@=q^T'k+IYhc]UCIalft=nf0U\[sVg>O>p, %NAD+*aBZ*RS%kb8:"sZP:RsV'@c@W65HN"PpE;tNi!*P-3&/l.X+9Z]FE6PFX0_)%)+W+E[>^0:[pJ4I895`Lc:7-<FXM/jP,>rc %ZuX!k\dOi$WeJ+[c<3VSOcs>gQ#NP>.W>F76(b^7f,D8h=(>sF=r9S$qpnJF&!jfClBJB9>PGIYCpTDBO#L6\,s\sN>7&:q27VPM %;V_E<CMinc7N8cK/G$IGZei3JX,RLTPL\r14`2S<UWKB1CcQbUkcR`/lW*"!2?<.Leo\^Q2GiM_f37jRN2'N3/(Baqf$CWCD6QEE %::4,-pCk$2$.*F`Gi.tS[6i^.d_0a@47?L8+5\H^fpBG(VOq9RCF4bOG.=WGYT>BTUWK$@Xg%4@Ce$9G=L*[&#BX#qPJq)<C1q:l %_'HP"!qTsIe>TcUrCl6bek?G<9%Vcm=c_.3En38$>4]=tGrs`h8m=mqH:.AC\s.+e6]">;^,lbDJnkq78mWs/.'_<K@FJ:[NG0t[ %.A')uqC7sh90[$Z>?>b!f,DrGQXW1hgl`Vf1<E1ni!R)@Hk99>U#1-j_h'^G-`fB9j%.n&Q:YCLm3Sr*C.U3u2RUi1P@ZfgYI;Gf %9CMIVRCVQ#q_b9ef(a4QR*?O:mcoaZUi@Ak@qFYh>9EHOSDM5o\QGE8l6C5fiAK/tH=4Zo5'SZ#H?McMrtG(!2n4iEJ$4.O=`6Up %lE'k"`mH\F-Kf<K&&0%'&*(`9XA3*pOgjB?eqkaPV(RSOQ*Es?4BHe4&Mqn1:1`]7(p"m:k\?Z"e]0G*UM[)kheO<Z2,<=be[`%J %@io\P%`;G5n5A'dlAB,)a7^Ak+#@/:`a:lb=B!O]ND0r^.,%(IZ>T0]54U[*mRGTL8<%oN_n6ij+T>engjO2;[K#Caq"h&GGOOsk %+6ECMh03cY[H(Ed^\Pe-j6ab?lb/VNkJ,iD.GGN\O<I-o;:k8\3#+UB\`eP>Oh^ktIJd.rr6%:jJ%Pa@^J+OV>lIO6"$Q)F@<:Ym %2f(?pT/(o;qG,N;k.b;[H%3^pI#5VF^:7_iO/e^4_QLDiO[tj8.-$us/CuMji=UPF`Yj!AHT(SSIf3!CpR@]on\,SGC;GO:ls;1= %b"m-Nf[o+Q52m0en;W$J@Lm+7UVg7loCGgp;u>iRE8_b=E'Y.QMG*'8'c-/"DRT).>%D][[b[0bh>bY?d&^"1i>4;\cbeiML]C(4 %o2Ppri3@pqVp6^q4LfJGZB2EW7Kg4.9pQjp]@B]goMTTQ!_DI6#jPK^1ibXh8X&&\9c=NelgV!:lEI/Z<Nr1S$s2"Z;7XUdcSh^; %fpo-\2s#Srg>j<(0pDJcI""[#9\JCUD`jnO+'Lb_2pGV-+J47AQDo;baG*.cLlPr)[W,kcMt5&m!'?cc[L\>,"uI/kct2SQH-Bmk %71lTF'^aR;aJOWLB$Yn1aZ-o4T[%[^q`:d5?bia,#D4+-r/u%e-5KrQ7!iCJ?;L.Tb2dTIhj,2$f'9/m0PIMIVj_e0?GGcqE<TN) %k:lRmL>1Hkf_Y]gp/R2_h\9)A<&$uCG%e<MmDh2\\XW/ophb$^^R3,k(-[3`j6+O?+BO#iK(_d&5#5B,JFMfZTRPE_Ve)6;ErDe\ %M+9u]/@B2USQp@Vn8(gg'^kI,KA)B3`,dm!JI'uj*e#i-q^d-o//(:Y?L:#H9\-[K)sOT7"2ctJJP<>>h#`HL]1"sWG+]VM2.]ML %ldVD-`amY"Gn:LIoG^_%Mel/>[[ZjA%b-n/r*h#I=nqntP!HN`m6FtROLn:-l*.PtPmHYV5M@\M<MJr"d_,p&VNs)V_R),,$s-I" %<jCH=f`otNRo:uucOiI4gqtdWEhA'3T4JZAf;fo_s,$PQ5AXlJedg3CR//\"<Xe2[XVh#`fn!<NAlW\\*7QOBb*Zp--+18T6Z6sY %;4Yof>$TnOMV<VBLPK6PX?HlA5M$Cp2<P@m:"$LH)e#tY"*N/[f/2253`RBeDUQ5:CSmCTD6gK([AmVo".#qD%a?o1r>8$]G>hi& %J_fVk1+)`uq#"8_O=)9)>koBVK%<`/oQf.'JJfrG%@bC0S)'f;-+g"CF<CKqVNs)VJX"I0W_o'Ei#,*h%F6r2rKp);G>hi&JK5@# %1+)`uq#%\m5^dGrI@<jZf+/hRYdFQ(?j*dVlAV#hR*hY#H6Z7E9K:=MSX"OX/'-i![@uY!TNCs=>?P-/bp^8,\k[Hd!9u*VIM!7j %/3Npe+J>l"I@<jbf+/gOYVlCM@/8K7bu2r7,4hMQ\.=*Hj3!hA84mN!.@+^9_'+,A#d-Ne;72sjBq+PElK_LMs8Rq((*4P^?eV"= %HK`Qc/Mar59!C"f,jSM>LsJF^1A;s60LjL25l)$^+!RX!JQii7?2X?Lh9-fW6qJ;]22&7DMRST`#:SoiAQ6;X&"\)$:#TlMRKM-j %^:N0%W1#"BYdPu>?sg@:an<I#:r+n8(`V#>l^[7lAQ1>j:NAV&I3202>#Y=`HC\0U.<tp%9t:B"7FDNLDlLNQQadG6FnNN9HQ6Rr %79/W]N&-mU79-?GGJ+?^OkDREK@:A;WYSkp/"m=RXiU:48f?Jk"1GdiAT/W)prNu\eurX!,74tT-JV'1>EH)u^tRDmM`kiRh;haR %"`-(TkQQt^R7+#tEu:G)qULW.7pY!,qnAaYEtp[Bh%6e.>]k,\]F(1S;?%UWKK7n^XL>\^"ATsn%T(`[IM=aWGaNe2q`^IaZ)75; %l30rUBAro,S+>a*ATBr<eL'sA_!*.T#AjA(7tIH),hE.Q9B[^AXD&?<S\V4&2%RL2.K9O%U[6eE*/jYfU\S62LI'jcq-N*2P6mc) %I.-rG!iLbQdL^UnK?$ikc<@4=3'L:!FMLr#,7O^PQ])rhokPHLNl&-@*nXdc2h=nUh9lC@hkj9/1_IA$p8+(:RUa$=ROrT+YgD`P %*lLtL#HVc=Z.'Y)TaA.WQ>4%gNTb4NCF!uC]d<KB<_s$0%6mB\Pr^s:lli`SeaE)4K]kC37$8=RBV,NlP^A6t*`!d6Ct&=h(/P6L %Fg7dA8fS_u^?.^$fkbHY@,e*eZo<o433oF3B'lCV)>JIWZq]-PrM_eJr_*fbs4dKmiBlM<I,^G6%*S)gmX@c/;W$A!rN8:UChOf" %.$Jhh=nQ8B9^9<McN'MeXN]"<`H\;O>XHNb>@TAtMW;h0X((J6/ehN6Z7`Umf&bVFrOhQ1?#JQOjWnt968gNhLId(<pefZ>bj.iF %RH^*;]+BD3S")d-kF*fD%>gR+L/jf:VSN')c"85Bl\Cc:X[%L>$MF2],NB9Zl,(c6a5^EhJ"o.Y"W.bV,Z_V;6DjT%11Q`MeBaDd %kMq'qVg8&c;22==gRUXKB$snnerqk*NAVe9(c!QX^O9po*apiB-O]E##CT4ULBM]Mq+@0_.-r,gVs6g-TDK?.9^osmEZ0gSZ>ga1 %i#J9A3H!fS/D.@7c-&pAMM-bGFsgrj!\P)-l<=LLFa9kJ"-iT\nb-k4Q7^4$fGE%%e;F@9i&]$X`I9"hHEaqK$PZ-n0FWLpA5b=i %>=PY4K`9ga,0#G_2-93O<VmaTNQ.rTb*=cdO`;DX-aVI9P;7Ycb"UWC,H_?;riiV^Gs2c=q;[5Bp5T3rgRoWQ\1DJY:C?!q#h].< %iRdg(83':_Pn^82l1]8G19SIS6)eP(1F1bON?dr(D-'7]AXto0d6&#L_Q)u*H62S)S.5tsEDXAG5K+d-.iV,f;b7R%HV'D_Mr>*< %Hb3()ChK@Bq9D05p@CPUTfl*LH'&S0M'$V647KW[pZ#Yj+5Z1keg[k1<H=Lb-&eSSKR_h1aF='.7ilg^N+ARIBg#8PiGZ26+'@'M %Tn0mn5NGPoq^65&#Cj=GpHI1j]@qpr'*eSQs##:OU2<-nnJb%X_;W/C1!S0fn@./PSJ]c/%!A0OJ,(e9gYfT%G,ohd./;\kg!j52 %@K4<a_T>Y]=2%5NLKA'A"A1g\KHu4Y-Q?D7fF#sFc@#==5EFoO]I.%+mW%;pT#^N!2q6aID-ei_DA+79fOmYpZHn.njah#6j^D#X %QgQO>rc"@pM,U!*WfMB$m<u-QXYO`OreG[QSiB\iOu)X3LLkaZUJ$&Vs7D04SJVR_B`G2m#MV1B8_=g*J%Mg=^[Z9m0U;q^a1VBE %F:<>I[PRS$qZ:X7%Y&i"]d[N?lY;SmE:C&L/C8)SrO:O5+1]f]]Qg%WJ,:q9g\;gM)R\C\U[/=A8[=^+.5*?8V!hbGHbVctc%>cT %D!D*-jJ6/.;gA<:o)MQko(G@%)pdW[E),0=jKNZ[_;0Hb>+>!/3Ph]g[5i6D'?;Arg8E%Ym0e7ZkhG93s5e*:>Xo95?Uq#2Mfr:Y %dpVVBh,j1EPgTBX?T7D[ceua\Nnb,2DZ;<gI:&f!kYJNID9Zu0/,/m0TC3Z.*gjs(H\/]p`+d75\EA&RNQ@jf"+4Wjn*odaSV>Om %hnQdpjM5ce.6[s@hNCNKNg9,0YAd/%6m[^Mdi"N1rX3RD5QBK9-_9Mpdn(R->A&?@(A)DsHJ>I,J*pI#qZj_jQTPnLXokh&k9!#& %C#@M#i[[/l&bgBkdr*E+VRZWEV^K`&^KfYmq[V?=4$)F]/4'TZd6VFBLPN"6+p5n@n5?gO0p(:+[H&Xp:+cg<kq>4`Bn<H,J(TKr %ZI'XC/+;+t^7eGr1s]h5'[rrs?d-E2IXf)p^APsJBCYfjdo"7OaPnStj)#7e)chlLD;unois$3[6"JtiMNO<HY//Un*Wb+3]\&E4 %gePXj&DqEA[rd=f:@XqDnL\Oram*kD'`R'2KDco$3V#s)+j^@Rps8?t$lk6^-\KFT,&gH*hc&OLV8jSKSV(7%,qq&>@EaZJ9`$K@ %:60#G*sS);`7Y"qm$<<WKQN<N%eAgF@d>u&h1JUQOr1b(H@U^mK;T6MJ]Fl?B5g_+c_/S]/q*/JO`)[t-O'$'7Ij[2lq-J*8]S<H %s1U2VI4X<Z)SUY]X(^t$Eo3$,O&G.&dclD0ISa<])*[?CD$U)Yqp":PFa%HHrsCTOTV*7?rX_;B`63Mrol[1+A)*UKWVHG8U!L?, %S#K1Kd#hh!@%8?%O=BJHl'[FN*<Se9>/!aP5gT%2,A.X=q/Y\9'3sG/KGl'WT8,_dr_4hjq\F&Kke4_gORHBhrdI$AkF1G[Vba\q %4IZ(*QuZ=+E`i3d=T!PKrHj%O^&%-#qX(N`os";cYkn+nIWY8;oBNg&lIWr=fB:\&kLK$VeaJ:DDhlk]LXj06pYDl7&$%o*X$7)p %57X`Dn*`bJIm1(84KSNAXT!HNrHV^tWPnPTGf#=/S64*opY:,f:Oug_/?V/-ZNI0J=BteQMlR'uf+.067&pP.pH4NZ@r_=[j2uqF %SS7i7jRO6pXrb)X4)hP?XWG"-%rX]pCd:'u5WrpK4`%pI^Q3EGHsh$W^sYubI,K)?%HrQVk_BU\LCIpP%Cl0,_i1`>(gT3W[1fY` %(u7\@?lh46*]@CG2IIL_i83?)YH'$Wf+*2q7&q\AGFpq,dl?hX)r:[,4-7I5f8Yj^\oHYNq_qe]3mbltf0'Z*a*:lOn@F),CF<:I %n@J;tY8[^Q\'HcNeit67i83?%o=Ar"Fo+\p@0>e'"7H,9Ph3;FYNlG-G+uAHYIe^<5AWSLCd:'u5W`et]tYZOFlU:'p5b6O#)pG( %h#$ssYA4ALf+38r6u*$6GM`D`9]O(W*r+!:#G%7/]gmOo)2eFWVPMn+DHbbNaBu\%HK:FHiCiS1V0_u94acMN,JQ&G?^dlGNRO66 %iCindf>7!M^.9?uUm#=^!.Z^o9cXfUUT=qM?WK6;YFj+?3<&_=3XE578W5_Y]?,R%ZoLpsCC9`[TI6l7A2E`HFO3&jLK].lToS<0 %SlE@dK&*#R3mL+[^WKA_Hlf?;^86n9kJ?$Po.t>EIXQ%BGK\B_>jM"74HR9gLY<8Tq,Io@5+L8DWIQ@sfu\-<T@mR0g:LX"5IB=r %QVLSYPFZ2J[_HXcIa%BIgjVo038%l7H@.ca^MLi4K>;qVa7D#KOM5:4fM?Db<DIEnSD8#hoI".i8Jg8[mOoOH?.%G'm^K"LPNC_u %\F(a=Q]9SB=Z`20D[D=L7Jj()Vj%#$7XS;+p61DQ57.Mug:,SN#;Ld)P@&KXpYj]PE*XqQ&\k/K4U;G1Cqt8V@6_L;@r%tCTCfs` %3q=CKr3?A#J_N]-*r^S0o/,Nl#5-L/Zf(?8TYD?cUP$#E.&nuIL6^Qr5+dhoe8q5K.W8E"[SN.*-h?48q=u8sr/q!VOad'r4+*he %J#&]$Z4t$*')8[hVtE)%=ErjfoG8KjV*&\4JWp]"ns0G@+#]u92W7'ILRi_6:n%uB;\&\DU?0;T]P3GNVsPpgXZ4`!Bn)^<73gu( %KDP1W*(]J$6#W1Ig0oX1@5CZcG1`IsX@qrb62e#*-X&TJd$mLhG1rU<fSgKGSMo]r;nQ5%_85s$DHl$f4j\B$_S*]3hR7j1SA(1_ %+3K?lh0XNYE8-`UktCF9V0;X^]uOb<[kD&IY240o:@!,mP99[8S4c)b\b+cM$.i"NQ?!ELeVD:\p>>[#/;&;AY8[rLneL&sog%PU %?Om#@m4eou!V=B])$F@#6"ZQ*Gcg4lk#hB\P4&Q1Bqd&c1-KU"$KUY[r<YoZ]Z9Z.">OJe88+8UoE2r3b?TPsqFP89LGnKc"S?a5 %Q[e1UI,.!HD8a;,-pZJk=(hQY^!1DmO)t->@sm%*[6cCRdN\u'm'Eh`I3AEqO(s5a;Yka;28RapmqmGWrMMWYrUo1^b"j<g1?R2: %n7^=$8mtF?4FH)Whk#RI=O5lRs#I.E)Sen!F7t$m1Aq)3BATD#?6.Ym]_c<_6Mk.4)t;HA55b;l+SRclX1>\5O7L!/I?Y8kpq\iK %pC8R5CRD)6FO/lnrr'P9UiDksq<;@hCE619Ec:!u_BIss+&:foU\n%#mJS8ZDf[#eB`ifl4o)Ddmumi%JYJR;TcQ712gkZ$3g/?n %D)T]La^jE.E:7Z=hrAX#;=AA_F"P+Mq!Upp,CQ*)%k](jpX)ob)sur8ELV=Q.?'5g+4oT)L4d?W_d=K\jK2"Ef0<Q1rnbc3\%)t? %Yjal]Nq[bt7j"2snTs#)*2-+c//BE;P345(Zb/6fJRPB[(ti!^hT3J,cDKFP4H9&R@=DTMa\m4.BCZ3P?&Oo$nfY=gs6dkF(B0W$ %L4A+"(=N,-o$YI/3,rj:EJ2*i'>&bShW@#IqcrPeb@442E[U<#fjtrU!QlY\L$-QArk"(!f0,\p/=t\PQp>,q%pR@ArFo5d2>hul %E^)<`L.q<bU3D($+"bpNAL<6&$fDp"GTRn"OR1=V9+\Q:PX+(e\bA!X6bH.RK7_7pi?KF;cesB#^Y\_#C"R$T+SLNP20o+DQP4>B %N]P7p%:kO/Nq_SKhoBqEoFFJ>cc=CLZMkP3>j0EX]*kQ"Kqr^H*sCJhSCd0R^:3W@fh$OV)X\%WFhDeHmnN5f]MIX!ZH:Q][)ejk %3bZUoR5o^2-[Hd#-CJhB.<SbmL\5oeGDZVb@0^N*eq0N>l]aX5qe^/)`VtBAo!.rLI[G:U`+:>f);sNh7+U]G)n7GL[5l>5pGTWg %G1rP.It&BpiC82[qRHO*Aum(;IJj%]0(M1L'i4tj2op1;pK^B7bp<RfkHb<]e-=f?++.Yon(c[Qa*OB(%k]4o\b!1hLc#!PGb<pU %'Nt3je'd%+YRc/%dTMC<[kRo<4bSUi+91_BKSP9]J9Z,pPJhZ97!#=8%,o;8Z_'hXPEMq<0Dkm]cp$=,"tjZKW1?>;HQ.hqmiD:P %S#9]OVXd"bkP7)dQgN]pia'R_?;lU;-Vc15Do4b`dZ/(c]a_^MhPn9!\W?Ej"!<VK^5#e`jZ$Tq6^uJikL07GL2Y(BqSST3mmFgu %ETmQ1mj*lT[=La;c4.9B\I\?sSW=(?#>RjY0mcAHO62YUZYp"/`+DrJi<PCDEbj,DX%q!r5rcE_fHodk:B/#PD4HBHs*t7Ed0Ji` %^31C8%@[oKSD@*Ng1P\L`(mg?-TU;FB"+/A[:T(j:P1f8R,-8r?bX;Q[/$DEaA!9g?=nHlQ[=Bm3/J:B2En.#IXaBHD=$Y$&)j5^ %a+(^\cc?%$=(G[LO')%l_ZOA#imY]W:Cl<qNK7]cEh;@6H^d_dH#%KhD&u3YB(7TFpX.O/cbn&gCdd>jm.nS]mqk%Oc0TR_5.;<> %am,u;]!lr%V2tY/SF*Ou5@eF;%m8+V6tYNsKcFs%e\.(UBQnIQ36f.]m[&<:MsbG"6hP/0lfTBV9CC/joIDu7J'cQLZe4*@s23.K %+#h:?p<ssU_[lP.It986Hf>#honLrhQCIiT-$jL"Dn4Q9_[lb7g%j_>llS%o4Yh]3V3?6HR>6+@gE1THs1#'$\"A[e^CN<f5O+8U %GGfn#<Se\N>Aj"MSbQR2YPb/mYTLDjLV<Rns724S7Xt="m,7ets83\C*T'">5Hld/](aORlu/EZ?d5SG!UIOFYaUbGnKYcmO-nhu %BC*I6oV;E?&,Ub24Z5O11iElkr4%63=7j+Br3,,2r.'D!,OB_`^5r%J5@R7>?F'P$5O-&_QlG5#G4%k$kKO%!TD2c>mXHfAj[X,- %hncQ-qt^n;jc:@tp8;g.q@@p_5O@8'Slb?,f&^a5n`f`H`ej`Gr*^\O?[P6Rg$O51nVqt8TXDOV&$CTsp],epaoAuE]C/mppVurn %,k*BefrsDQqLC$X#P>9LBg1OsqM89mHcl'.J];5=&5^%1'e2"-FlX]PL+Vu#$90R^luou>R1`/F9J7a(`fg;!V!=4p),$pQHA %G<L*3Vt_2Yo8Utg.Y%IOJ,.uNpRcp70>ID%^\mMl^O.cA-62FQnEDV++8M73s70g;s5SV/YO';.O-D+#8AFs756'm?s1eNA:Oi<7 %OC*+T0%/OL07AfW;j5gRe8(2)ed_Q*qokd2k='fEUir`?HejdMa"H3kHQU$",eb;h-_a.2FIt*5e)JmV<I+oPXaIhR=3&pqjA9u< %666JlXCM@9(Lk%;<M)b1pYUe'%(*YO-C\N+1b79drU]1]T2M*$4u?olc_VfcIP+V4)LgPGK86mP-4l*&M2r>FqFQ^e^]2d?s5D<( %jl\l+bCBEFhuE\*I/[J*d[pg#o]WFUk4?@fc[WH"^d!>JP<\rN5Q1E@5JI-IJ,@.@9@MdGrh$BKs6K?-*C]fR%5g>jgiAcaS0WZ_ %"6=5D6(=BL9Gt3SBi9bS>;D"S,F;9SG"j4Tc;(R&/XTc+lhB"c5;g^;Y(Bb#42$XR='V6mdqCie=mMh"FcEo,Bk+b-EL[kbT"T^m %>/2U99))J0Y_JZOBkU_SeKHZQf>dpiWr(X*DM6IT<W=do&)?3nqS4$D)L8@Cg.g@3\NZX8rq&Usl'3:WjdC;Goj/h\A5-_tk2[hX %F1euddP`q"6>@Kf$!>jGW:JTtB)hnOb19*9cjLXJ2kK6<:3eBmlrgqRD"_EWq3jB`=iYo:9_8;UWF^q+;LY4?5:+&UZ/oZK(hUT" %`M<`Q6ka9n=Gdf9(Lh8BA)FGuHjHmhO>!W9:&/KkjVIEh<pW;t$Qbkka@bdK<fblEG*)(O1bRk>X7Q)Z;tFF_*6H>b2rZ%UODT:+ %FU7lK?<(2FU@9rRS:l-X4mYtNgS3am,6jW!7o_?oT/GiOLq/i:8%7#2C]N)I`Q+p-Uggr!"mKJQ=OrdshtB(<\,aSdrNd*P;M7#p %?OANa'!Wo1Vm1mIr>>Ik$F=IPf+V3`/K2/<9c)XC6?K8b\ie+9]617@-sV;C1\@^g:D#-IkPZJ7%t1)3ViV+-Ze5#3Q:k7JF\-(` %jShoDek6NejR&\I)R5@sGg3CXqg-BmY1XM"7pF%"*5l%.Di"p?Eu<;\fA.Gi?E2U2@VLB4EIFpX!!#Fl6sEq;XYL7N+E4bFNU@f4 %n@NK9A*fS#8KGa-F5!k$-YKlJQ6J89`@<d%5hB-f3MC<5jA[Vf*nU9jh+Knc[LQ=pgW6?aXKP7S7P)*63.,[`bc]6MAZn++[`*;5 %G@pX@FQ9N&?EhsGM4*Ee3J(4Y=N2h63Hp@FPe7+R.O!tX5BFE(*TY^6+4oFPAEEdLM#i#T+#%"b9c5\VeAj=6j/G!L?('HD_-Lt> %%sfg8jVKr/L;T3J(hd,Wo&]6J`7B0.9<"roY^Q=L*uSpnG7_ALFRaZ7@c8%3$(NgfQW!"CDfrL*]qTB-0nVH$_-DW^/F26R!At@q %26M'608Xc@A"eI@C?D`5:5G%5PK3=(IIIT!7@_YWd]gdQ,%"djf:XCL+SUQ:k.*t.rSYh4jp5E@(M_AOk1/+mRrfrLJ2*%4%@!Iq %\R9(Hll9d,P8pC#8Y&(Q67$EZ[K^SaD<Tnm>!_LhE2M4np($4m#M4$0gXW_oQ7G"0p0F1i8qPJLnShb8.i3!gpI9O?"P";=M1j#s %c$ha/D]aSha)DN;%$K%f%-r(s`EpgHGFfUEF=CQ5qli`GYFVC70a$O:MlbB307sjXWgt/<;n?tAonr^,%VCNe;oCYNL6Q1>ng(L! %?<hDYcO^=6Ec2p`Dmc;+FWK/DRQPR%kH'eTYttBDpQW+86*(d^<HeX%c+Zchh>s5G94kF:E%Q"&)UmHB,Z[*FW[QNGjZITqHa)$m %!C^g)[(bT;&61]B]\UrN7391u*,Aa/KkXg1Z#m;'fJnJ@ganRjVGL6*&7V:2Z0P56rYr583V%<INg5bUjCE2H</-<uo.3ZZ9@dQ8 %<S$L*[N0[o$qkCm8t6T"KUcY)=Es4B_9sl_%'#dL(U&`<fq1LBeb%MWS)6Ghof0!2=+DfJEL1K9YK(IF\huA)&pi9mM,2f2/(7Ee %kA"?:"EgteVLl8^E7h>R`]bDpG7VpbE;eUj2\4p<aM)Z,YC>fQ?(u4X9qfKsl+)PVLn2P<G&;hJppEi4T!Nl#"4PQd`H>YmEAW$; %b-d.MJ9[UdQl8R39J)>ZJP=\(>dFaV[bJdQNUKiOA_F_bnR([V:22.^V#IIED:]lAYlcHAB"QEn_\EM0P;@.brK9!lM3?PH.)]g' %d$/d3&P<bF(@NtOS%=CX+&=WVa+p0.b5OAQ(N$hq[8C;DHG">%]c5WoCu88^_N[#9In9=OPea>t1%BUueu=p"['43f=jMIS7PL\h %7#Ao(pengiWH3!E*Z\6OZIbqpGk=6-7V+@h;/I#u8!SLRHr4I7mC1WbS!nW$8+d21cInD&&_2i=K,5n-2BBH`%@+7UW9%;0(r_F> %=lH.&CSZWM#-G7!2/RW7`qT$"I7haD89&M@)P=Zf]^.W_O=N^e\Z<[`gM7*fiUrV9/LW>P`0sTgP2tEnRL_JU[!>$S.1r1Ef1Y>R %>;0:H74o8Z7#5[3lQ--u0MM;TLtC?j"(ei2(#Y!4j]:>kbGj6qBW7ZR1^gB%.X%p!HGGOAPuNQN-ju3S#4'e(8>>2cI0h@A4.)d? %`Z%A><&'e?gOpu40$gO=As\U,@%df4;^4fV2Ir/Y>0f%dQlbq>PQDq/LPV;9'*[tul%Q.[V<ZNiESYp<?Hf,W7[NF1RZNYF#aS=> %%19;./=+daZk!!cPDLRk,T[CC6qTYj9OL?6F<O&QVi#pl#r<bbX0)j&QU&hGp8."_<k+G<JkRmh3f(5KETqFn&tSLrff4.O-C6(; %*JiufVWFoo>184?L-h-Vjl]EX[=,+-2b%a+m;ZI127Ni+c/g-R:4'\h7&<'4\gTBVl3PYU'rWVc=%l"W)0Tk]BEl<2(K?2SKd+4Y %qA@F'0eB1(,FG>r8R!o+ISoDUjm$RD\^l>#].pP:d(uAk0*OMfL`jR00JlF4GR"eh064qA)+4t.WR!0#PP@0g^U<DKPY-YQSQXRf %*iUus\JLHh&YBDN`OUeAnsp`P7R:8&Zps\8XmFr<D%77p-micmhOoR<hcXm,S-dkbCgsN;CUq#*\A>:e=qnC=eUbnYQZs&rZ("2D %ms[-0NUSt`]Kl4c$W@mHVPtaC=0r@jNRN;g@Qf5MoO+i$HuaC!Y?bq_/U#.f0&;G3Z:^'T[$P2ij!BYOU<>:9RIGQ<dfo@N-\ %rXZd@`s:MqGItLP`t(8FX,.s)_*u-29+8E"M7j0aI<hW3/VMs=fWI`%rt8XUP]lk(mHKeAK@u3QH!4N?:*W,>%5k3.pEHX1b9Yc< %DhAU2O!$'Mk`C^+fl'cHK+`h4E3H^XFq?>#!P.ldR?Dce^'l=*D(%fn-l6m3b[,?L;7J3)Ml[NX39&-''hd.Q3`<8@6sS+_8R3[S %cYT4hp4c`e,L"JpCG,mn]KS8E7L,7s<4q+V3BNKI3/WX#:foB@8%#uLl.BeQ\iMWd>Sk<KeS3::qiY3rZ>q6$;h0`Ccd=7:']h@[ %)8@7;N0.iZ=D9f?f3m*+Z+iHb_NRgnlCbTpEf"J`!]M<f0g6ZiQrom?+%1Z<p3]G+$(dE?H7<me*dpa6^a#61A8<u5?"B-/jcIu* %7e0s</DK,qA"1<iJ2XkCV+8V7q]We?V:T/\!FaQeJ-[;jLm+`1g8<ePU>#sJGbDSY,D2jcOj_b-iref4d6Fnb!VK@DYn<tD>mo?M %h74<&+[/:hCU''G2L"GaR6)jYDrXQW-_3=Z1##1n</Ed?$eE[g:m7N)dJWajj>^:^TGhgGNggO798Pfo3+,fdnr23S<Kg`CZ&f43 %FB]3e5B].e,Z1Bp,N^_o?b0X&Kq>sHF#[TpVH(E!VOrK6HfB]I'Gq6#)PR%cj5O_j.(6#+%#PMjFM<%gT9bTZQ]IPrHh5E>H-8m, %H07YggMX\WidE&$$Ng[[XU*#TG>cN8ej3k['DkCu>>h85fPZD18)5G'e#on999W-I90]o+8]\diqXB#?RQ/>1`Zm9B'[\_e%!3)N %RiI=PPm_(Uk?UK8afr5(7)Y"^mg]3?/U@Ze"LGOW]3[`D(9/VnY,6r=lJVu!^2IjkC!T`84o6702NgR!^WdI9Mb6P<g;TmdJ:`%% %O,gF:fK"W%e\,f1p.a*$<[anUgI-Tc0#A,T^52pSMLc[BfTK:[Gs-GW#URs0NBEF9%P#[6[UG0,%tFnbR9sRZKO-s!LaP6ofJU0$ %2$]49^s4h7UZnc*Chh;pnq1(='@!]H7*m'T\FQt9L%B26.jhP0d5n.1NX'h&L't-mkf(ZSD.F:0ic-?cS`p$l`."HbH0AZYi*0IF %Vhnj![IAG`gOt8qd7hI2R1cdt`=6o*nIhVPCfE,tD;.+n->s9sp@d"PirCd;/FFa06%TtaFC]Z#]Yd0uk14t^RA*&ZSCU,=O<_8i %&P'-4Me3V!MVhdH0&#$;HYIli;,`p%KERq^FrJGqjBFWpXQS=r34KM<r<?pOp'+eMZC4dr"EOo!;=(pIi*_/BDHfFAco/+Mc,RUA %AH]t?RC)$gSQN4s&r@.%&T-'TC.'K@6HnehKV#i/ck<4K[YU:Ap:T%la]d5Fa!$?>r(;!d&7<pHpYt8Uf'm$\(Qh*?>p&tB\iprL %A2k/H^@=AZI+m&7/G)\L@)cF<@F!2sDAPrLO^[O:,tkhP+'J3:j?4q&Rc@)#3qAlOH+O>C#qYrd\Is3bcb'\fnH@1u>*!]@*P>BZ %hq.Uo(r+C+g_ZTq^M))e=buCmpEY=)O'nj4kKf:>A<X7jp8\RmX9L?97BU/.R>W`LCcjjiO0@UYGp'[h3mb*XZTI3->t"J%`5LI. %)k7,M$3M(/egd)Vl(eEq$>Tq?9&0M(qX;$bSI>hIZ5pM;aH/?\)9%PjYg86k'"mu\<#X?l\G-+qOR:bZ5G1dFR`'2_.k&&k$NO3& %+sW8npbE_+L[RLZ3gns?g&c<u2-9.'3Xi`iVe"4SK((65p6[j@?c$[b3pRQ4Q*pLCW,B&XLh/D:CX?Nh]05.gBrK;9f&]i0^n\bK %akD-<As9IV2tM82'h7L=>*9d&V:86"p`"TSS$>9#&V;9MWu$j::183hU;@mYl[hZ^CB\A/G,^M=Kj?dCNXd:3n?"=9$5%=g*f_m< %LV+r9N"*\)G5?&XdHnC&_$XcEE!>)"NJk&jrNR$A0+C%REen[Cg,eeYmt>qn7UJ(a3igJ4pur95gab]0ou\,FH=6).dn/;L+LtcG %`hcuL0h`H]='N`1Fe4-I*YRsblh-EgMoKSS9I#S0pco1(X?OrQg-[C(q@U:[F5r"\I*pfEMl?C*^(j@u^5/a_%%p.]Lij9-lODJO %^8UK:.b11FR!59-#S1)<)rb\SQdU#E+b)?=ocpcq)0*8*7tH/$7BD_k,/`'.TSis/\:\BM^.C-2rC(-")X=,/\f<>3D"N-QGUVQ+ %ViRf6s*7<@o26WH`6p!h.A#BOBN,WKc_K[H1d?\B+*)Q7(2KcU)qGb[IhN3D#>XHa(V)t\:iXoHXC;mM5iVj!_M06=nZ^$#n;O=1 %&KTpB,!CPCd3!ai.RPVaA03'V:eTlY<2;Djfh+.7eK236^J9iN-H)u([Kq'dB6kkLdXTkIiej^fc48:@i==l#kNNU&Ms!(M1jQf/ %p(Ci)S`e0?8Y/GfLH_+\h<*<#-`^dj&e]9CH,ikKChl>6\!GFPC!qSm+QG<$\q_?[_5Qg@`n%R6mUj>XQ-k%E:121m'g!3_Y(<l# %b\cXrMNn&V^E5Q=5QnqiVj7PSP6'b2NhS76:7S[od/,JgC(];Ej[8BbU.p`*#]^(U/E0T[_;T)8CMp@VX,SE;T3LUQAQH&RO>ec5 %[N`#M\<B@<Q8*?A90qtS%)F5@Gi``IXne,CNf1qo\>h^:M>mo<b`O*!MSAr(ep'm,Qsn$'U@T#2M0ST_HKF=igPSBE%<6+)aX,K6 %kc0V5YJqpg;0imbh&b$7-E/X3?URusKV@s*bSF3;(Er;Q+H&aG9;kKA9'^[Fr'c#(%;dt%m@EPYrLl\AW"Eb5&q(H&;3G'Ee&4UO %WocEaB#oD#P-!UQ"[(7Po-1Ts>2*G2D@m%9ioD7p=?6VP9tIn5q(`2/@VV&;Rm1W:(;u#(A!m\>>QMuHd3KQ&er3dI:U14-U_<9F %C=kpZ;TTarB7H@s_,cJOSgt5sP]J.Z^54^gX9X"@rJ6lm77J<@UGBBd.Q7,"1!'2'frnjfSj%j#=fk[2+[O\=a"ql/6FpYqgiYET %022$MW3e4P#dFf<\`V>e2OB)XWPOZTCk__-s8D?Ai<9qS`,Dj9]N:8#K)&GG>9S(k-YDrl$Sdbie>7uqNULa*^^ftg_/0=l/,n?H %[22]l-S/q*3;kAK[0K*1'kgT6N2'6BZ$30<87e?9M52D#PXb@>FV1,=%n,+:PGUkRf?4Gcc!*)]l=Pr/].#Mq=qqAoC,;Z&:Z&uA %C'c!n.a-YJQ>d4"f4[7IRNto[%KVGqO`ZoknOIL?9pr8Qbk[]PE"07!MGF]OnJ<np53$CNkJZ:K&iS;[c(<&=;Y>@o;pain.(MMD %A.D/Z*pTkA2Ff<a!*Z0,[B(4\Oh'E8Z_D^d+hsa--`T:<-NS9Sll`li^g/"O,)o6B*Be-HQ&[q`]_5M5=C6pldWei+7B^Hl>u,E0 %^EpD3MUHpX?U8?2PcgeQB9bM;@4&u.BLQF?7YiOHd%f>$a@EQ#&"!E-I'-mDCD1+^qH5`2%.>["MsOWNW(=W5V7V<lI(;>`e1q"l %#F>>_$4UK>QcFV/SVt#O>f["n,GJIC60ag;KDL:8ro8S)!)=X>)FT\&Xt&:]H6&;f7:ksL0!23,5d#]@Wj9fmfjYO]o7fhR'=d=n %nh6mH[K$Ur%J37m=<4GT3"%Za%9H>[]-,>gXWo7\5_D7baNU+7";)qemZK@O/>*BMU';Q.h]u]eQNg-);Kcpn/VLtN<d&OqgmEqu %!pF*TW$9]Q:C@\oTDoluK6:As;6E$L3,Ks$+T/0EDsY(l.uf")4:G$alGN/DT7VMnE[+TA\*+0%;eD"E^:`*H11E['](:@s+r.Hj %i%Ym"MarTu#aI@_r6,T2GTHn(i7'oFEOXq6j?+W4/oFBYU?pL:[71s'k$!/q\R0e>n_j/OjfYLLJZ6PGn,dVfPDsl=9XIC5@ni\# %rJpin^HT86[D`R0R-*'bJkX7:a<@+cU6#VGZnj11<Y*S06>Z;[WFl,%r&MhW!_@r_$RCPBP+3D=!./i^p5gc+kMSc'#.#<YL'UQX %S7HhC7)V/+&[@MF"'AdEi/D?S=54EN?:)ZF<?aS6StM>'T.9!9N#,S0?Ku(9AhFfB;E^dIKl?>6EElU<am;P9s.D$j/'6YmKR@hQ %7uTBnSIcaRF7>]p!t70"1L,a$Z^<Fo5EFa'&$<d,A#0bJ*#d[]+ZF`bde$e/@O>IoNRc1j8UR#"qo)b"lZK0IDSG94\L[bm(35'K %HN>#1Al##+G',Oe\&=cj"81G&*P$a@FZG5On%=5\j(-I_7tPE/-6XQq2[=]_i)?O!S:cUqMMnC,.>%pK3kYuQ2a+\jZl?g&/')i! %GN,2B&]^UZ+iT7\mm-fn%[(h]DJku2oB0G-*/LSe;j-/H0d)4nA.+4q;`h(+-2XV`NbnJ/<Ui(c'[ZtS5XfKn1B55On"7=TXcq,u %&TEQ%j&]-`51S-!_?pRMDQT)SnA(842<Z_L]/HNHdG-$9O.bd_`4i,ME9@R,]u=G5$7I";AWl\)5#GE3g+qqm!#R9A9N)jk5G;q" %$&6Db5?@\lp3[iLY_I>eR4&(Me.US?9$Em3@\H6u@:8&1C<U?Aa^9ZoXDRKLr&HbEQt).tZPOp4-;$,eOB7T\?kNMLqEjNW\Pb)< %&TR>pfY^>7R"=d5A=;.;URN3)+jVCkW^RH%'X4j\7i1$<@8WB--@H<VKG7faXY@7]nC)1fqWN)l6Lri2&!`>D9%0<kW6*UH^6/M9 %KtP^*8NV5MPFZI:U!aS&N\t_(:6b>.a`!/(BaN>n%Iadjfa@C],u;[-dF:9!'j?bT"LGUA1HpZl,m;n6'3YuckZkF480Z$gCcGl$ %]Z/<f&C>t[OdI<@&QT&.<Z?b9e.si6k*_FD,*Gm5)^?cn=@CXh_?r^G%r2OjbZZS9n:g5R>coPd2':Ie#fdD:8JYc&ME<@_m'e,Z %[TXpeqi*%W3VeD"3heITGF!I+DMRSf6HnOqQ!pS36H4I8oBT])R>1S^Cm4<R:,HE/>NE+WYD0CgcVb0,&p`i,#=ScZPeN_R[ttHC %4t21.H6mjb"Jlq7Kk/ggZ:PTsU_PE/>5R+BReLWO=OSYte]DAMF5@=^)`/BL0t1fTA%r^P,g=MS.:q+;SP5dhoIM5-HG,f>/&YaS %'j?d-BeRe,(NJp9@/q9M[^0J,V<Fq_:*,h?WS*&k3;]Hf/&^k]D/l8KfE2ZCeEhQL%%.a/S^,+Yp-kaID%e%91:gRbK\9j3:/cW< %q:6<9"WCtDq=o5-db46P&:sLHo&Sh!HW8G28B\`OKYKfW"a2RT!`:#m[U]m6kDsTsQ#FhGI_b9;r'I^.Op`.1>=-OC5/%'pI]=G9 %KfAYi>Q(#S2JFkoE'S*A67*%K;Wp`J<@!qZ>7;`_U(VtEELkMn+=,'7I+%9KcpKcrSd2KjT8,Mga2`cUKmUUEPDdJ0K@>?a=Xn/N %NW9@4[YlY%F]]ffH"CAJ?Wu3q5l6WE9$s?"Jji$F))u;DAQTAULdL`m6`CZT4UN,D'Z45jZN%oRm\%Kh0G\$fkCM#K0MRTF#&T#m %!6^EME.il"#],JF2_g;:>/%m.[%+?u\KR:h3`ou@onrJ'ek7?4XB_8ja-X/UGXe#*#JHj`gApnQ&6L\"9@_5\'iS656H2q,PXIbE %)FcAhlONY\WBo,Y&q^AeASISQLQEoTe)rd9iQ3ra^S`e2Xsi7;!IiT4!F^M7jR:X]@SL.#entdhUNhkRDs]7"#i6Tir_"c(8?h-E %Q5m;pfh&cg%d$<gNXPpif`\(!5"AuYJDJKU%p8O=cjFD]oO&[CFR)\lfeJr,NskA8Tu&4RK=q<&*=o*.bQ4\"Fb?#<Y#LVCRF=Lp %4Br*G#T?U7fVEli1HJ(8Djl[PTNLJl70g_o=s$8M8;^l=bW][ZgG0ms)?^"K^9Bm6+sPgl5K:ZFn3>60qX&SL>Y9<n1;gYEI6E91 %36^08'6kEI+->Jb6JXs3?:fmnX*^qH!+R55TR3bR-uN_b#*STn*R%agP!TI#'EV8?EE\TQ:mE+];e,[:K?.9`k(bgq5sNTb%!ZrM %.g3b+"0Whk$d__'h`r_?g3n^0]Y).hL>*As"Z1`HaBoe)qE0A5^?Ue\3m]FflL7\f=Do"\#"$ZKh^9+!r.WDaX.C!n+[_kgf`:UL %p(.SkcoZd8f`CKqe'VUb@qLp$-m+&:hIa!h(+^Fm4/PM1+Dh8B\ctGus2MQ^%\F-Yos)j&*B\e#o@?.^%F=pV86\9RT!gG2Of-p6 %PJI6S9DBf[iosQR@#5)O5*i?gY5-'r"4g-8@,DQP-1S,-$H1Ya.h8gT]ULS<(;Tcm@DI/O+^S7e5^!a[Q3.f`5V*.[C_aZZ%+6YV %pJ><nm]T-dQ*bXQi9F]<*hEWo?-.?]@F=`cY14n)P=(^PJ4(U,SpU"&Z\N8m*D74u\YrKNPp&iXE"eQj!QCl#8*hAo*?HZ4hu\Xe %6$D58?45=5YXQk=lYMK\mi2/t(o`\,?k\5R[$a3N(r<Z4QA34q_=#E(*M@\%\:]V,@ml".@tc)3b13TN@*-4H\"jBk0_&(nJI6f% %_#kS'^1S)OaQP,Y?VB\5TP9RXJtsg>beUaRO@m@'UUa8rnmW/*Z7((t3\^2`S1W&=icWANH+;lmRA&6d_UYV/;AL0!T/+%381W4m %4$Z'G>B)M8ap\m3_2JY;UC]%OM%jtXW\`Ek\U3ggo%T:^`NY<ALb`]1(1VbZR#T&nLpR\D=UiIco8Q<&1)\HY="J2V\k'9sr.<G% %MX>#WOfhCK5b[JX&"`6V&BU%^5ml*O&dX?u_-"+K^(r&*>hML+A?^c=;%Y!\p,X?-i@oNg-?`$"b/9reL;i#:310T/0B3+\G45PB %jKp1DD;(XI<hS*d*dUNSb+b$,.J2BZls$P(beHb<'QCL>+*N_Sh*U-U@rrMl7"dmM]h<0T*h3O]i1j`*aO$"c2beW>Sh%bma,5)% %&qSrjLi!0OHcj5pAo)cK;^r9UVq[B.ail)/[oZV33#BgV-02R:$kQI],?f1,'0_[e^WG#b-Ir47=bR,6OY(GMMsC5rQX%f%ll]8j %=lLQ*@Kaep&X&;Y(im(:L)nLZpiT]U'f-ECin7n+>Wo;T>L4ZXd&:^6*2qu0DRRE:"A%q<o.l$hkM+sWbPD9M#iHL5%5,.FAFPKH %`BK^=5d&=.TSAe7:>%PVi^&0A$TuZHIRYt+_`fkcr9_E&XYtOb"^,_UFNL+W)]-H0/0#mE"q5S!&idtC0&?9e@)9!#)CORqZ#=dS %qLt*AVdAFPHNtFR[3]]01;,tA'H.&Qkb&uNbGAX<0-G&gVi`>iqm5l20de8A:Hq51X_OdI9&SA/`">Q+%F%*<)`W2EZ8>gbT$sJ. %<b6k>h.N)k:8URUA6sg(F%P^AF3dg2!>uXlj[`u>8q"%rq7!s4;tFlRlSLpV"/[=gA<44^%84rE6'=Z_(m,\LafKRMQ_B$^ei7s) %NFq=i`]@e7;"$(+=;j(iHaE+aQ\f,_U(,\0N:@;<-*lDe3oU<)K(2U\mCCUXObIK"%P<_Q<X2=Y'*g(i`6FG@Jn\X_>eZkBMctBD %_4EP'T6"1",*P*O=>bm>XeqF<L,irX&Ws*l+I##T"lRM%;QgpVP(#DoWG0"O&0NjGZJ#T$0"<%FGYa=(*\*1eeo-'`l-<*i9@]C; %a;mY3JZi?E!4Rof0c*U25J+$%[BmP>dV4NU0]`&4VWDJaI5JGhdIBhtq<GA?8EmNK%?iYkl.$Fu0.ICPE^Qi/ImO;N,#=/Nm-t*, %EEh)4S7^RpXp^GK,S2;D\TZ:7K4Y_r6Qb/=nTq^DXS?*c>Qi9JT+HE'?5"TL6jk-U\eHf?1?arpH-:4NZFPK(4,+*Z2@b0TG+c([ %f!bE_klQkD[\q=n;Ms,J=t(nI5\BTFErct]a<B(GTW)fo)RC"](^*:2M7CG_*?Ht_Wed$k"s::=^q,)`AgsF+4":63Kd$5N+TL9i %/E;2d[!#4f9P20>M@Pq7efdcpVCB;iQY%AEY+8CkHJ>NRSZ=O%;GmGkiW'luOS_1H8$rZh!-&Y_]NU,ZWWaiqX-NE(&s-)"J\j@e %e%)9'_r-rZeL7:X2\pCIEDIbIE#KlY#H!c=oE$KrZGoM]N60u)`,H#+(6?+2aWo6b>cA.QZ$rJ0P*u7%j!$-".6&lY@eek:']NHi %*K?p^di14rF5qKV_Jo6s>0*2^;r,lfH*$Er_Fl"R6$l$sI&)B;D#(U_Rj)AckNO#SS3ZZs4si1X!e2n,:Fr>i+Dmg/-24N5N7#Li %*]-U5#U#ie:VThqd=i)O)5'Hq.rImNTmMYOgtZ6F\C1JZ1a_sT!cJhbISqE"FW`D0g]L`,UaVJ2(JTHI7&"#Cn/p.fb%mb<KJ+I/ %_<4-N]h)Ob$&p\cRCWPXh8D97H(biX*f*NQ;96mthNEqF_CSO*eBm'XCFkmeNm)TJQ$.Ni,!E>V%(=EG.Q%mi_LD(]"1>MnmbnbZ %5Z^*n54<:1+MYQ\=j%^9>(%AI7PjXI.1AK`^O_JrQ!(3kd:oQMcm]]Q/L"B*F\%H]V/BhYQc+)#(F/'/[&8BC\I]Y,-soco[LCOr %V!Q]P\Ou8/86ZJe*XOP\N/?s+4(+FcG1@p-5KLnn`L&2UN:/nka8e]N(>s)KQ2X9LE!YS22knpY$ESP.;#CU;8gR*kjM+&d,V>t+ %@^_&rhg6\7Ks78flcX*!9B&pQi)-h$=F!a1-D0.DO!DTZY*7sUD3GS.la4a"pj`\YS_%*b0!f*[qRh?k9JB!c&gBXEol_L#F#S?S %Ysug9>*`7"T4f@"=_sD..>\.ccqM.]6D_pZWHPhX'F7B]4bnq8b&H)a@d"`$gacr8Lu]LhR59Q@m%NKrU!eJsY]e#6MJb7bTqmfP %7f\s.HE7%ZE5fL]gs_TLJA0qK##lNnKi[sWX!pJneZHS`_/$+qF+U+icWRa-m3e#2)GtU9+hS3a(Cbn7]inut*DjioK2lO<SgZC2 %]i%$c/$Vc`VKE^&m,D_2\455?8+dTmLec-F@r;&$<s3i9D7/r%*#5k^</7p>QVD!VeB4).`'e;NUK8obF`frRH!G?GK`sV/o$GqP %K`dG.b25-J\O,):KjF:Yp!D7U)\Yr>ZOX:!l6u?9@WD:@!QD\bEm;'/fEW0caFo%H"#TAO;7bF)9]$92/=!JM>EJ+_q[!"d*3L^j %Jdak&(Y8qir7OoA>6@\4<<HU%C4lcjUZ)3)IP2BudR\/ll:D['C%.jqccUO:X$@RXO;W>U<N#+'GY,+:>\TfkK1rIOKC#]DlP;8P %<ge6d'2[UZ,MWC[/j-luqgf3WU4FAG&01Ir#6kcC8fJG^AL13soiE4N!T-&k3E&<]P_cipk$X<,XlIV8pj`Kg9>BD0=,4(OEj`34 %9$#8I;!>-OoktZiBil@,TEenZ\i+W:(suKV6]@%/(?^X/"kc^+7/:/2aNoBH+<eo:CNGi)P!)@;7'c5C=c&6DC,9A+[4<:8hmR!M %Sp&c.p%ENFoVX2$8T!eXQs>rm$AmSU)8WTenPUtf(6LN-!T/N[fOT8A$#LDj`O,A$Yi0%f__"l>'ubjY4!T'?!Oo%-@-M//-ij2U %R`.%WatEdgn9P1-==,`dl5n\Y:WW)%';H+\<aO;e4qSq^.9hY"!X)i$a7J"J&H\P$5,eZ@7U\P%U;l+,B?/Q9rF6Rad.9"p$q_-K %?hdGA.'VJ)`S6RnYh^].'^H1d3IU"rY40ZR$jQr96!FeF6jLu3/fa#!0aNbVkg_ZrUQeSC5l!.CTpr,VG4nsa]#Q6CP?qCtTdON0 %7WTbg0m-\h%ZE-(S[cDVN\FWsec#QO?M4<(!sY??$i;e*5g;+nXaVLW%1fMhXqKF++#$)u2%)4U)i-4*L2^i^"H%i=Q1DW%QO;do %U\DC95lF/"^21J;kjt1HAn9i@Y[<>)Kk?f?Lk:GMq6k#Tl/FN8l[mka`IRBu+2LAM_"RD8_'si#O=jL6\ki$P=6OJI%T(L`&4/"V %<9AEaf%&"T>3j:QqV60.$ujEI4o3PV"&u/5AI$0ZOIc@l&)1D.5h!Q+;kJDmr`h<#`p//%or-D5J7uR,_pb.9)AY,B*KO)e`(YjW %DF%jSe8tL(_uiRKiZ^9bjIrQHXAR`N)bMI+]'%=ZE->4`p91'I6Q-&;NSA9T'_u3U_3:s_B\tsC\l_jq&Q^!,XcDtA)<B2`B/p6- %OuK_i6m8M.N0YU(ZH4VJ]R\<B.s/&-%9Qg;,:X:qVU//8hs(?MD?M97AP>c'o)d0R)_CJI<3Ph/oOo1Tpp_MZBe.HpTAosi!,.13 %\;4n.M[5$^<o(d><%?5k>#VA3ok+Mo>Q@I?V9,R,Mb9;`?$*'X3!"\X8MuH"nj)b9YDbTmG;h5!N;'K%GZ\5uF]JCbetp(V@pGDc %=9HNsk[4)L:b#qA(8o6l'N)0(^:!Y>*h2-YJ7Z\.fXoHm9Y:[5gJXG<8AV4Q&Z4/i':]o"k=OW!S;%G!8`>fK'Oi05$MDe\i='E\ %l9Vs0&?Waels\\p7QOd"GA">S8FM'8:R.e0/OD[)4XI9^,P%#ha?40)FmMIU=q^-o1.41*,_LFoA7g0&duIg;68j9uF.6JVZ^>Bg %2CLs\."JsS!'?k)0?LRFAsB9sk2i;U%N:D+U$D*Qh\e[S.rd>"ZrR,i?hX_W.:ts^lHO3o(Le`W>i=\S!ee+'Za9N^H<tuFr^8BP %Y]I`hB=??^R9649&O@m7OrP$_'2Bn7I,sVCcDO$bkO!/k5S10`?2@%-Y(spYd2E0!6K:_LdM9(TM;&T(Ye.-5A>p6I&U[M%,K@<\ %Fnb:h-'Rd!HmgQ$EeHVs;ZbNljTU>a>pYP.\VQJT1MqGQ>t0C"D"^)^X;O<q/N:_+7%%141*LujUU3*Ig`J%F5]3)omD3s$PC'^' %)$4lcEF8POW%2Db?_]2@LdWY"Tpa5*i?`jONBWU:\0UDo=7TO2$fPWi08;qY6b+)PSM/5*KK*#j2s@,N%tYB1X]<*@-2Z8:(P\tj %dP27HF4%$)0ma9P@CfoJ]n2&b!>F,dj*/JK#D`M%IWhr10rZ)]!e2'f\2>)6[m^eN;YT`QlA>,t!t8n&.j)CMMCCqCmQ3O3N.*sJ %QP#Gl>V7-g:Q-'W1;!`"4.q\(*SG=U(jgG-3A%(0SB6"Ebi%t=/!MZhV#9TT0g\8P=Z5_'(QsW$KmKr0AX)rk`-j^YP3KO!ETs9O %a:]!N5S&m5OmLT.P8)Y(BpGZY%_*cjF_"-6_R%G)EJ,oH7$n+?VmT.q:/h^!46j_`$Ck!u?<0%5jH_Q.92(nX.'bmFam!VB-Oq8& %Hq&l=Om[.^<+RRdl"$,N!tPjFVQFLd-ul:T+AQNPV\;8S8gO"i))4*?&gVVkin&G<8l>iC&S(HIi4s"TJ;iR7rCMYE,$N1Q)J(Sa %GKR]JZ(<eP_T1sqR:?"I(kEDbMT%Q:N$npr[LnO]=]@`Enns;tEU!K9:p_DrLekCX$:cae5b7(rL1J*:-J+kLMaFOn2`9%A"_?P/ %p-QkkLeFaAJM^ub?kq?HPOoIX@745`(WK8C:gP0-#BWp@4inb-(EGkgB/RraZe^*MRocc:Sms&eFOp%\#oc9GK#n)WhAH>RorsC' %E6I6UB/4ZmQ_6f3o5I=Ec8>+npIH<-[sL/>PK+5GqW@YVs,P(C*t'2Q(=+/K2A?\1.?pD2J,nY7SRPbg_VPS<$uIfBgi%Ij)n?JG %e`HOkKAD*+j(C03.;=;L:57BO;9!P?3Z=>r-2L/(:M4g,r]lH[ncbqe,[4dPgV+<tV,6@u1ms8:Z#+4D)Y23l=`l-\D2LV`]_feT %bgt8JPKS:cMDZi"H-tp>U1lA'JYPc]hGKZeWc8])D">qN#KXnfpiG")bH!I@GF9X:eDiun'V2\&BW:K\o(9`/k&dLWd0,7m$![k& %q'.9Ar?]Y1:F?%C;mU63`5/fdQ$Rj3a&^<>.2A:a4F'^7C(_n(8q^-E3oP.dX__.qI(@B,J.D30MD@UnP)sH%edh:T;K/m$4$moY %!%grs,G=2,T^\_S*;/AiV_Zi"C3sd.9K,nni7g="/_lQ-JAe8aVcBri'&d&q4J9N3aE%Qj%O)fFY<4C8R'+Wjq2D7EP_,5INV8fN %VNs^&Tre#)^p4V:]1b\*1"C=0,:?JPAZFhE6F'W-kH$^:,!\He\lrEO(eM1pK*>C8bXK$Z(_0fD9]\&ISqEZDJC!Eo.hjh80ebCf %`.(RC0H.RFEaTMDKnZ%I#Q^Ob1jR+T,YP[AcKr"(dP)0A`%P%sJMN;R*0-O#r>co#($aA[n2.Qoe#;^OXE]>#+!%[^Njf2Rp#psM %E]\4Mj0FX0rBO\.ZJ6';.c(SeZHNkaGehhoj&*gQ-*lXd639j&CV5oqaEP40I>M)Umnt1ALa;OM(>%p]!CMdgMWt`5#S>,#HCi%p %V$WR+ccI_op3R"*7u$TW>WpP*a=^mteJ)IFcH[uF1IW,8nfBq7RJ=4I-n0J)@?csc9:g&th30O*fWgT&jY%aOFG_&Bcb\,io"AFN %_6f:5(P7U!>'i]MV2WKU!P!:.&OC)aD*C!9LTE#11@V3F^>('sT\SYPD&oCdY0!FWKI%1,1chCkp5F#4(Aas63r:rhJ\[Nb4cT0D %82qX!S]1pG8p^s21_Zd6"*0P>K/"WS6%Ua*L`^=*=FmYiiB-FYNeZQ"jK)sTI'K1M4?([R@nA^JEP]O;l0F'?a7MO:4Qq00a;7c` %JsO&C*a"bdf;m1<`0ZRsekqtDmJOeD!(Iuo>IkAuQn$9E-tZ=h3X3!,ggL/1V3=@`3bCQ,X!4<3-!;Qlch(p/#8#2(a(s?d<7*,4 %8lj)HCn)IsF7Wfnn:_l>1c;b_UuGu@BMB`c)K+*^ODTN_+'6XAlZMHF"kS\?=1Ai%.N&tP0":oS,%]Xbi"pGRPsq*#A8e^]Wd.NJ %nm_;+N.4K.5qJrm%GW`"<Jp1##qXUQo4f$`/f0&-e3u0\Rm[^fH8_q/2m$i<Zme'HTsRuo^24_'%#\2)HA8T2%Q]e5<HT;*B1"ZI %!o$ab+e7e?PWPZ=_uc;#H_a4)ZEF.Fb="'H$\-L6g5)O\+po3/YSb.r459UC^]hjp0Mub1^+Hoc7QpeV)]9g?]m.@08HI''"b[/Q %`b+O@2=RaYQM90AkQQb.!838$>MKqX*$p@L5a!(K_e,0DikX,2?L_b7.SM'ENHL+"ghn+jKG86tV8XXJRF?t7]s&(o_LADZ46Bog %bJpN4$Bt3&YRPdE*;rSD=d>DZOYQ2H]5<qT0NQ?&`?g@oR&6q-J>=]%9,2rdXj)`#l]Y-O;U&,/dE<;rOK4?\QBYHq/;@pOW&ZFi %UkPQ/_qA!b%%]nb?OeJ'd1MNe-PMgKd)Z'4\$As?aPE3dMc?OE(4Q&62VQ%g[,4J\e)V=-N]rB"2B#k.BnP6'r6Ij%CeG0(Seh=d %3hYsC[stV-LCcNV*NPohi8qQa("YcM<MtlbeJ=@Ec4?F/2$NOEd1$^NCXN7C'%=jV!0$EWXNa*oPNU6744u&NBo"S&?g9'jNC+@: %.HPL4T?(u6O!13'3.,["DFsZKIId`@og/_2QN/WY3C>L,"><-1V@/B'"UjTE.!>oL%@ju]jKZOOZ&RDoJkM$\,km2u>1tU,f<:BZ %$lGP*r1QmZLk(jQhj&>Hoq_-'FZ*h'g3'l48sP'Sb<M8K/_j$-9gChKmq;BU-ca?Pg%j1$mU`T7.4Q;BO<*4.\u.#nKu/ir>_j`G %DfROk_2+%A$#2L"!XK!NN)dPLHeG@3Tq>9h(_-oRTt-45RSV-gB^TXDVU7"Ug<.ml(R5MU2"d:S)gkDTGo'%A,oE*LN4<+O8-r0^ %&)(>H#3RLc+2'0"glXO]hj17[\bRh:DZ%bN\P6bhYMR*;7b\6bcUW9VR80^Y7Rl+%[\XH[9*n:iZi\fi2_K*2k!7ES'f_(=rK%SO %JieNkbd8+QfsW]IG<n8T4cJI@7C.Z"dU(I/XHsDDD&i`mb0.>GY^\a21NJ-&H:0QQ+ub-QQF()'mQ^b?cAW*Br<ILrl;IMBB1!"2 %d0FX2c/lIhI0mQrg858$W!m.0Vlc2_b[<+/,7\(4lumseHas^HqCUHc-0QA/;!>"3PUce'7?XEb;*BT*D"(n#NlucL]:TQo*OC)P %nd7E2DTL/KR<[SO5ikbd5j'rGeEYS@%/h?B:trqWj^FG/RjkqKac!Ve_()_LC\$sFRCsZ&@a5ZHC=)@9f>F$48Xl'NS__GeO?hTk %<PMSU_nBeQLDa<P8V.GG\5<+Q_B^$n_XB"+>_n5;Gk)r3W*n*\-U;f!>HXY3#@?&AKF"DWVMXSrI3JMfQSMr\Q9LWs)fW<4\>M&5 %fi(_Hr#M49T-nkd^r]e\/-RP=\j/([Tt,KH+$ua8[GMTT&#)7ANd2CC6,K>h<Xqc*[94`tZdT$G'cg8``/BJ0?`\cVB)quiZrfu$ %@<pDo;+S:>_o8@@-+Y-GD_5Z,O^#FHYJa-`XUYQE3<b8r(Pt6$[ua<1]9sn]nZA(_W..Ll`J\W1J>g[%(oa%\fdK6V%k!QEZ.On" %Tuo>YK#G],Vte+LF#-!1=bk6O7CSj"h$Bor6gcqIs.2l\BQS-TAqG(1c@2OB.^4QEeQH=#JaN^qmOSWs:]\K-I`UtdQ:G?l/0[d_ %.olTnL<Os4*rN)%Y^:@8'GrLE@C*Ei&s!R6BKbdk]VEN%7!BNN6=_Rjpk`?6=T3;#Rgo_M$RS8sNi/GF+>F@hC0FGfF<AMV\!YuH %'FZ,VMa>KPB*s!:`o8Da_4`8LG0ao*2($!PWD(,_V+TE_"3.S[7B1qFn(<fR1C:uri4E+H+qi.g^f$+>fI+j5(u@l4*LUf^]bg9R %J=O+n!JNYh!TR[c3[-g[K,<7iqMZ+h(Qa65!CWIl'J6c%)m2E+Y7F]FG/TfL"*u%dF4Q/+WJZ_8/qjT0bcUO-ZEeqB-i:+<MZ'6! %HZH!ri<XYE5cR<>UWnGF1X2dp.t5if[]nCpAh`&\`M\H[Sg2(Sb@K204r%C[E&aJDg1Hg9\*sK%1+ui"FQX2&mIXe+f\sU)pKL/j %X@GUYeF55oYRXHN9,@<h>E^K2&KFpX>Ne@ajQ3fOg$jIBb'N]FA>$\f9OqUW@Rsf[?p:s[d=BXKl\c:l`h\$sNJN:1gYg^.MJd.8 %V=&5J#9VZ;;d-iFHHKmkY[k:RQJj@4"ZKYpi48pp.Nt+ib#?Gp7I_?9AI0DA5lm`3>iLQ!M6bWo\/AT\l;&:Cnk53qQ`_L1_1?q/ %XGb1CKhsb:QU360!34*<GSWW($gYl5&VVgr.SrD^_"t=%/PnK2G/3K'Mu"35Y;_4%S*4)a)(NOVm@;]2$Aj`+&7A]Q-LcVl98RsS %"VN=BW5ptUQ_55Zjl58>kknZTNAb"pQc*aWDNdRc&A_A\eYn%<??qGAn\>C'im')?d1*:gm!Z1N9Ng&'>7FL?Pk>N:h5&!OeP6@M %)(dDK`t!E&`rNMl2(5Z4)R("&5hirs0f?Brf@r?Qb/PS=2\T_#"@.X&3a4K]0-0/4]\!*nBnO82="?9MC&D>T1Cf>01):6HNU[+t %.oLDW&YfiK;S%d&g!@TUe8#T_<sFS9eZqW=Pi84TmIQN,?b60N\"<TCmNjU2grc?,qV\0r]P$VO8Yo=4@LP4Rp):Au[F!!LC@I>V %21unAPW(j1CJ"<HH=.40<L;g^+AYOtk3T++f;+J\(WN5'Wi.q:Qlr&M>n6eli6jKNib`&fD%2"#W7Y$eD/&KDOCU5[M5XOr/j!0q %,'EdX"),[(-**KIITbLN-?[j#>d7I1lb;j(B8!*_Faqi'\iRnRFLR2/[CE!Fq"nF!9<EPdin?L[Ub\_CqQn42a^\o%Qo[?7[VdC; %C>Y3$o]aibFgWQ>I^:_5P'\H/Z<q@#eWG\A+uN3%^Yi&.259Bh'Qjt/:U127M%@m'W`e)D$:DV/"3P_hh^6;,40\&\[<o11CA@<c %S0!Q>E#p5*YtkjaH^.cR8G;')7]Ub\Bt3.[Qr_JXNe"_`l?)?!0br^Ph9o/-4OUQiX`?'e+gjT-*P+p)XMkMJ,(!Pdi6UE*=%aS; %="IOq3f"iC;;<kPOuo89C[9F7A.Deg>6bRNWfF53*T2BJNsBNZd`3UFpFJnj`Y/_,gTh&L'Sf_+C!.T)pSc449O'1EE*Di1&.t`G %3i2IL(Q=*1!P"p`3YMMJb(_R&)H%d-.*D+4[d:s6X1qH4Cb_7Ya`=KpiESEdRsD%Ui4/mjRM>1bbF)dh9qhb]S:tkA[Sh.H8*=-q %'p?AJi\inr#U.4=_&t5+Hn<[VhM0d*W^1fe2EeCJd^a\OkV'!+9&$3`BY-g+Co"2/P?$1>o[)YjU@>1=0^/n!d0#V4Of`p+*'3Rk %MsRg9@bG!*;sO_l39]<;SMtLeKS&R,MQ0jXKO>F5.cboo()3LL/XT:%@u^kpr#Q%kJhr:C[oM6]VhNpTk,s);!^#tt?<8aE!#33U %f2G=<"erhjmI%#KAokmU[8M+@$/j8*8AK-]Qj4pQOBoaTbaHnCgVUN^+,rf\d'm[d>4LtV#b[q7a?Be+?e)%\kQK4l++7.pBI5aQ %J4t`?FTam6"&H=qf\;[8=?"EoWoui"TZs@;cp1Vi()g%,g;418.d:p^"!0[8+bdZ9*nnt^C7MVI15rKM_Y#h,doVo>,@#D9+>,8$ %8KXP$B_*3Y)'`@Qk,+:+_$[Io?ujMO-j%Kk<PNCJf'ZN@'W[sZ)[La&M@`cWl3brEI([^0D,P>KB)mK6**GRE7_!JK>iJkn@2l86 %.M4:k[KT-9A^H+f1Lio4V\7rH#`C_`g98!1Tr_?Wp_7g16+9-Z6*hh^HlqlY?-C"Pf?=<]*XsW-fFA_7q(".gaXZ+%)6JPT\mV;L %8:XZJZ"c12,HCOODQNecQ*k=,^Ij=8`Rs;YhGSb'a]s6E90U#DZtp[JpCnF8:bJTslT#rm=C>Ju;K+0L)Sl=hOe0S\Gi`-/O@uhU %Bd7O2mHAm9R:oIg0dsRW]7McGHji;5"BNPs)<V06Y5$c\:;eV[f$/pPf4%0(q%D]SLWKs0CI19<[7@Ic]M]o(.&Cd%&1U5*6H"L7 %[uc7T2qTj2(?Aj+YB...Wrgl#ATco;*N4S[iahKZai;6U^Cf8eUbuKdZ+8q5r/AgUi)3!XZX"8e+QQc;pRg`G2$'M\]En?t&U2Ga %rJ&$<"=U$X61/G4@an![k_dt[5W2#bBUrY!OJ=i_`9qkfd<Qnq]VfI?7\i7gHLSE7Fe4juJ4E#2_O[B'8U\.&\YInR,AP95LXnb7 %E6;Q@:V7:'Pm82!TFV9)_cHFic%pBk0PD\?@d8V;iuY5:H#fthT?pYbJ`7Dor48LFir.#XM#&N.JJ=L`jYMP873t-h3$q6V;5\XN %Zj=NCN`=Xb4%5Xc3ZZ%ALaFY]`'@K2NLI#5c%XmTSC0.^?smho5OlGqD;TB&G[&qgK/V17j\l^8kEasW+)>2.%W&jZIo=nWBQ^AY %3P=(,8H+kj6$M[LjMV[Ii;Ti<eC3oe--^ETaWmcr1hS5<SD%#.7e`gpGq"q@2NPUr^tN-9Y,%qO+hZd\1pa+P9G<0UHcEfo\)(K1 %$45>-m'Z3,.+:Kfq"pG8bt*1QbH<m"J,a'[5hc`P)Qr^J=*t">is"`*@]>#]Dp(*rgp>CoKKWCC6&Y/2QkgfU`&4]LnibFLH-F.i %DS^uZ)ZTqa>&ZFsFH^qW*Z@&`#0dWkSXH(R,t'^'V[$La[/^sa0[u_'>KF#s:CgC'do=/=FfA\Z9\):'`#&"*SZru-8Z?a9DF\0< %\S2QUJ"GD@I3oCmh-K%COGdV:VZ]?u^>@RGhJriE'_4M7P`%8QVYC3JR<%AVX-Mt>1ekt6C,H,g"$-&>D:7!g"o4VS9_FK%V+l-E %%Q?[KKo53$EMH^*!2W"/Ic%U!or;/7>(d9QmU25sq9_G/=KNXNM[eeKW$VhBWQC[<Ck/TDaB(#XMODo\8.baX7]Xc.&fEoK@Yj!l %5S/$ABG;8@Ci^Fakh9LXSLuBW33U_pNbKZ8DEJDV4B+Fk!L`G,e!&;#-llF^70Q7-ekA'Pj_:lKQ,iangs<RKd8qnhm3"[*e45WA %!:EokUpM[<Wl449Md>J*7I$C2N:dZVa[F'&(rr\rE$B_3W#X<<+@LE>p@@Jia"Y1,#f?8:jm]jtI<jO:jnI:eq1;pQRP8d8]WnDC %Y@824$bH65VUrBm[gHk[KqH"CK/dSi`2BiPB\M^[<6[&$cV3-AFh=Jai9fU#>S_!2Z$qDHg+Zr$YaIF0]"Bm;)GrP&n&E54e_k^i %VM30KOSqIS*+,Za0*YO_'%`,4lhB^ekN**^K6>TKP#\M4??63Kcu)uFf%Us9)dUd#=[e.E4ahFSNTeo!&Qo,^#NQ$]a\8R;A='0] %P.YCtdc"9JP/Q1K?+lVB7AY8!d)+ZupQ1Ns0l1p]?S.aHi7iZ.r;9d_8^-RiQ:q-Jo%Gk;70sRJfk\dN_KD99&1$>PTi$mjb=AB9 %`UWgi?NZ4Ys'.UI>&b*e]=fo%+>]O_],auThHP0(!s4^N_aa:CYaH.Tp0D4+en$;Ld*!YDc$Om#LWXcs;+t#Vf<Ai,6=p\SlCQR4 %JWOP[(p0^\i.^c^4ME@uV"),L2!qQBeST__6N`Nl6!lp6%jm%rhVH_QS39PB&lr$[^hpnb#s>+['oT/+Ss-(5:Of#_8\sM$3hZ&\ %>+Jk%Nn!'@4ahWeAkjo5d\k^!PoPQKOj\5c1nfLn)_c`C.?>09>!G_Hc@<Va9CBb:VX\\M'g]E@eTDQJL_obr%/5>b)NT.a[sh]8 %fe*X%:(*'JJ<cT6X9'g2asb@4nRQ>e)U2B(>`0EZZlhfG7GpdWm(qY7?):K(ZseP'InrT4E"@__eXpVhoK5nL/>WJnU&kmp1Ll^< %iTBAe9kc:*]E*;`&riVRH^`.5`.)>5N%5?#@NlJb_(l4%qLO:h4>;^r_kC3F9QM(Y5mD\dLU/`aSH8)@-*+G4.NcQ`'TH*RS=5-G %4G@-TR^(S&S*]2Q<'p;ZjJ>G[Vi"5*W.F.V?1>5=jseX2<G[s;H(2Ug+ngi<hkPeB->,nP^V>In_pVB]k&4[3<G1p!4N#s1k(V!1 %"\N0sQ*QmS?g@nu"Hj'u7R@BGP!!d`EVm2f*>51j3RFM\^4O"^J*84&);`)uBIKfWd\dX2]I_RMAY:$/\qY.6on!^<+ESsE'tPC9 %_8>d`?9)*0hb<Ss55kUT$M8m`Am=Lb+Ya@I_3O.8Lm4#o%tr2-kseE<=tleW7upA$Q>o?sZOUhQC@sPo3!(M#(\[1SDP=YZURR_D %$8U[f2)Z+29bAMiC"5Oc7-_@^Fn`l?;'E0H)`Oue(C+X;7$cD=:duTMP@@LJrfU$4?mSSjPpbJp[iUEP#6JAUNk@9!,2VKL`u811 %Z4rLCXdl%e60p9;SMHErLrfK2VS<"f%]GO"`ter20u?Ru9I1BR)OF1m>_%o!"b/-IdHmf*P<e%m,X1MK;C5r]'?_UOO.^mGM\Z:J %>D\KN&`0JQhFB<\PHP*JAuSu?gQea8#S5"=3sHB6/W!BWYSuo?5`OUN5WD.'*D_=,:s4;o)G47)b8%u>l==^Yn"nI"f2'fOI)UqR %%H-V`Q'fXe5=%KaQ45Eu>J[^SIkorTOmCtE$Ru>e1!TX/2:[o<L1e6Ca5#0*OgZ0sk7u5n)C..?@oB2>r+//m:#7N2k:O(-5q$as %;U-2HltZKBo,3SE%M6Wl&S102=K,$ST]lCPl(TAU8f9nW98KYdV7@B0B&V)W]P&oghVj`(]hjOEXq'<Wl*$D5Po^i<TRHo%],Fuf %T._%`(:0uX,SVu&XNrT[B%IKU$A+dZeg[+GUQ;q#Dl4BQ%?E3=I^gB$H>Wn6gSF'd9J:-%oG-l8NUd'XIAO*Ahco)rL!A'^l%`=W %<:5_&RYB*HR(Ot8]8b%e*u9A$`Is7._pJ>fFL-f&%GK5kiY=)!a<^Ou%dN(A".=%,-5M*5n;(//]k<$g[bUH?ah)u;"sesfD[R@r %q%0#U!-NI!jlZ1=X:d\JUogZ.d6Z2XHArpVT_/qP=O&rg7Urj-=s4*nimhA%R3tE66Yba_[^N7;cofiU&@VYSe@.4*K$sr'f*lZd %$W+`C'a4Ad5kn@)<TQFA4fXoX@YJY:'%5R!/]?j]!t40j7Y@!Q&;?2X>CG%HL&]qa*a9qPMhU>h&C%XDE-V+F!bpo!86VCch6WT* %.I4o1XFoe:5raCTTt+SfENkk]D2-(X5Eh^qUA=f5GIH=aTcQB5&Z.6Ehacj&.kGsloFcRo;cs??(rXI.PS.H'Z:G-qM$(\]0IgIp %\2E+"T]jA,73'L$26@AHJY3nH@!S-E]`a[-U0h<FB<:Ocko3i+(f^cnC%dpX'A3gh]E3bDD=9(g`Su`*IIeQfn84(9W</Sh&fU\0 %,,7D<%VLZp.h+\>c#BGl(]sOHj4Z$S.)%J]N;Gq4>T&TNo8O'e:j;F:@u@i;POD?lH8fgpL'&qTP]Lgd'(J:)'`G9"'9&ur;hlQU %5Om,1$O\jR6jaR80NTbmfpA0h-F]O=>1E3%O6TmaOMlf3Bd.90Ga-i@NbQCU9V+2><B1@jS(pKmLu`#EUu%k8Ff^5^@:jRhUZS\' %?%`kBY,XYU&2#eDMKI%WU%$7<3R",P5^in:1&>HhI.#XKq1LkE?DZ7Pb%KaJ/FR+#%R)hrC\'?#'+,9TL>PEq+Ak'=Qu1r-<n3_^ %ZpJ(OX2=bX3ga?L_H04#W*@9nV0Y"70=%H6hb;X$jGe<?@#En&:5-2#5:5]Km;Te$X"XT?WD![.o+=s5Gd"hAKk3>fOPo9[n)cCd %!&f6qcF2a6]B*9DJ!,B]2M.u=15A?6,=2-YQs%mV_o?S#F#"R8&GnmKdIOOp?rO0l#DP.lRQ7k;3B)^"D67f&*Tg`_O0o,'J:,Em %ec^]W<9d2V'bj`6:_-k:3$LJ#l$)K%)J#+T:sJ(+OEcIMQoIYGLle61\p4YNH^+m6ZnNG-&^tLXNW!T1Q?>JB/K!>s'%KtQ1W:N% %L_bn,`@9;"?n<59ji-U/<X&j4,Iuk<GG4sVM9:^$bHeQ,MG[c"^&BSKZH((g($VCdb/+o??ZJ;!<Yd".P</m+UkUiEC9B*\A*qb, %^DAYiRq,s`0:s:%0mfL\aHVfEe/dF<*h%`pcRTT7i&!7U'/Ph/KoO0LVA-IJ[F$LRL^\0Gk1Y!]/RMLo_:,3ZZ"blN*XJmZ9%gBN %M\K=C:/4;m0(2TE71EK*)F_G0ghIgB#B]BtW<nZf'8\]<%/gI'f#XVVaAVZq7h,O042R8L(6Z>MkH[&Tg!(P%(h=5\ZIT9i-W^$- %KSpB]Xt\4Oa^ULin63p!*TC.J!k?J(QN@7ge^Q;hW+qo_1/d4l]b8P$/kiT:DU@Q5>[19p^k@*C@GN!mk=N0!`o`)G]A.pX"1-[" %=^aoIn7H#+,D:K@ilP*9+[D4B<u/WUDtp4u;X%LV5Ys5L4sLs,Z][rJ[6$&T//P1s8j"jrB[t_naCsure*3(/4Mcs`'mR2_^H$_$ %!c@4R,"j'l+?$\4f+o-dgbMA1@T#+f:V0;nMKR%P\!5du@,fgN-5.poQT^X%;^(uS!&B^I/AcMC@M]0A&Co%CWc0IJDKRY["(shO %I$*ZAk%J^'Lp^Y6Fq-&[5o5VCC*P6pNWipT,>Ab2ej^XhiY@=#)sE=.cKHg7s%;$?B5CBK&-=35Q4"XT+.:&h]VDi*'[5+K$[$c: %3Q4_@;+pc3R+ZFS:.*$:Ndc/LCF;,ZB#USiaXT]f3O>ldOu&)uW4B#uBKa8ll@h28mA\Ddqdhn`dR8+dp"V_NP!q:,1\Q5Y$IN^X %dk@B2D/s4hJ]g&uLt1;/XE*g3fuYFtNua;ok*6oB2[buq%0h.S=PcH-#*T9E_pjs(@jt,6<8KoLaGIN*`@`/o:d)*cS6K:;%7dgJ %Z5*4-"PV?5jg%jGgaDPU'i)B%drjd2"U`[!\4d!]J2!"[G;pr<gtYiNF6o2;m[-$B3J*%&\kc9:D7d9rH>Q3E@gRL'F8)i]!1AFS %YKZ5HSqIr_V3.V5F`rPV)KGrsZgEg//ra_k$*YlK)H:hO[ZW'pc"_NC'!aHhP@o']atmPN'2pa86mn?<,?-d&RT"IDKF#r!#9s+` %Yh?9g_FsS+VV/Em(Vi!;`9;.b7c2RQQdacKC37IMWa`a49HTn94WIsVnn0k#j-A[/lO>:2M$nEB&\WeH>'FgV>kFPms#tb,Q0;rj %9OO^;4c`7Q3W@iAImP_q'J\febX,oYg:lh^"&mR&"1:'$Pn5g0Y%#C=na)4_f8@ego;btKr+Q-X8SAoXQkjX[%ZH7Gh#MpbL()O/ %0orAoQGmS7K!j*r!Ql+Q6sks]Hbh*m;-KPW;4LrYc<f'bZOCTEfV6*<Cir.`((@j@;%87bD#Tb@3Fk0S_EJJujc?pe>GZsT.GhrX %VS-#&-jm(g7-$7&\7Z$pE%1sr<"A_+ob`\9STn@kYJ*!;k7gWd%.@F@QCQ"Uq*M@j^T'c`[Fq<jHdOhEbIMQZLhhd!,^LcI'@N(" %UI64-+rsI4[Ro`/`4?s>\OP:"QD.cmVSjCS_J=uC2/`SIm&T>8X@f-9VY>S`f<gEsQ7H*#/hC/N[h0LkO.:o6\+j9s?A#Ug7#Jr5 %Lju!5(EN8\@;O:0`:FP$B-fscW\kDs.b@6J@ksu#&uhZ-<i<1%hX'1fcNAOa&MquM-rV,UWk3dbgfBQ!0SL*^1@ZW%<]JG=&H#p, %%S8Y9S&n(S]Xppq%\1e]o^t=#Njp!pQ)X[&aXMc_`ZN`G5Vmhe/?V+`:Tg$IpOUW/aQp`E(&\kX7PCHQP1RuPKYh&/kg,g$hAKjn %ll(>JpG^1&:=d8^/omUo%2T5*a91);>QUk:RU<Ukldc;&+3kOOXW>^o9U*C9751Hg)\TT@Obselqd2_=l12N1MjkE=44'-ZqnL"r %8q?8=\`0u)1B\ojV%ei#]VQ(Zoso#/:\7cgA2SpE6"YXpZ:IP31.P_&q%Pt1AVW!iWrl>7)@PC"Gm%@_8IP8h4iroGH6@d$A0]Br %_m@?rFd1?h+r<u*/<2dus!jR_jq\Q,ms+oj**Mk5rbZ16+'j_LcOL4>WX&87'mB\ccDVF\F5J$BGAsTs3")o4'1`m1">AW#;/g&K %>0r;l$j=t8_fddq6Z$K.QP.)ORMcp[iYrTelcf*@)L.'bG:1;7IE()!O+uEUSmB(eJbrKIZKoQd`J.ohkjbTdrJA_dc!^+-4<1t# %+j"E2VVc6)=0P)6OE1#70j#VN^ek4U9=5VW[WA3?p=NW'2jd'rh>=s%).YDK)cpILlk7;?A3W\G%kB8e\d@%%NBJl\GljMh;oc'a %;`BZ,P*/j3b#MglH&\P3c:SS*!7#R5SCqb?$]=U61L<@:Me,NhEoqnFj1LYM'%[uEj4R3*bIJ:*`Dee#_KE[J1+dh"K<*Ee8r\c8 %:3EW)Z1bLbl;mD\RTB,gFPtU1n,M_nOs<[ZWZH4K=OCogNdXN(ZtO>`@#I#M@uKQ7[bZQf+`-Bq:Cds+UO!jZO%S.q?a7`"k":9j %<`'!e,PF[Q^fjQ_YaG;gh/+ga)-H:-\]K#g1Hpk-$YBa)LmQ<*la[ji.'sCo)U9Y;U2BWWGYjPN.;%TbY95X>dLjKqG[B?ekQR@e %_jL_'T>14N$Ik25-W+@>l<#?7Kcai_Fku@XY8]MZ1S<PS(:KVOR,iMolg!@gk",[=M3&NPC@2+t2d*YOflVm,ga\mumqR*t+%=a' %.<u6:Vht?f(9$6=pD02U\)^k)r<b86E0AE6VJ2$H67^#ZLkG-Zaa<P7J?R6U3+HV5j;K^m;J]f22):e75rNn@X"dJ:VS%9bZFjc/ %*2Oo<:N6!tiQ8.p8lK7^b*S2tS9IKHdr;d<V*mjRFYPSFB9a<eN/uQPifgAhmQoD:/nBlpSg?s?h$\>?)>O+aVNi^FZX?L6htrot %LZ#R?.a(blasmf#J*rZX2sf38k*d`d[M6iWd24@6=9)W1,SH!eruCU*3ejJu&07^C+N=B6[X%d7=(:-n-$'s=Jt1)Fg>S`S@I$\D %f+e;Zg^/2:3<m>!enM"@09`FWP#UGkEYdl5<f/#5]Gg0Dc@*J&P^n'DJ2k^,6q#Rb66ER6o;HJ/U6c]O6c-nP_DS)PJPu*>@Ss41 %]oj8J\'k,KD=GCc:n@ls&&+V?McnP`oTq*^mhOn`Lkbm\!V.e[(Y?;$&A;CQnkeEd*S2]bTNt85TXg:7a_++=7bS3Xe`^G\#ktXS %o`_[jgsr''d$fMCfA(Y;R9i=7C\1fIfd]T4E<D]5>NRsYb(hs>^L@0OO%e[Z0d7:E&-67RdOUKh]H8<#1;&:L%.9TWk#21fi3S[p %`0Z$Lo'@BrSd5T*-kQQX8103$`;0MZS0#8_Z=d`dAT6)_PZ;Ck=eGNek$fqp8nDEB7`l*MHC5HZ2VZC2B9GU:8pqKdK@,9LdDoga %+MG[L&AC;hJZc;RZ7qEKj60FD_.2&KCFaF_E&rX%+_CttF,::W2tC\O_9Ds!,V=m`IDrU&8SVI_(Z$muN?jnJWEtK+TTE_jWNT`9 %0`g=t'\%<EO-RM31![5qNsJU.C1=9:%)?4G6,<0!Hl<Rm6LnMu>_ZM8iY"U8O?sKt28KH6</\e%7`/C6d0iQ+Q:5f:68Vc6G0kh& %j%T1iJEq>31#*0bTn'TTl8+6<gMg`!ffn(>@>L(:E7F,1W9>NM"m%'#2Qiio_0L#kq$Q_.SSe^-/ePJKeME@O2B2a_`oIlZU]W9R %Y.ck,EV9&e"Ef#+J$p>I08^'g!.g0G=sL0O%>CKr6>_auNsl?rqusM/^tXi>k*7MENZBfD*c`+fB3*]3epe?\i4..c4&K]Y,#=]" %[9QcuIPq0B!mn;?Y],gXW2ll_Wb5:^C2Cf\S-gDe(91F0)c&GqhoS7@"mcD$lN2[1M)*=lC8d\PF4U$nSl!7Mac:50!I^IUnu&=. %,-NF;(E"lPc$o#gNQ>=h+@833YW>GS3a-8mXqi:8j<31"bcJG:k?\XAi3Nkelrb0Uq"FV$^62iLTf-)bj=0]k5tq'P@B8uXqVnup %H)Wg6o!QrRJ*W*7pp[b29I_f]c0MtMV"n:l5R_L<.l^.oMl0mLffm%UFgNO['kBL+d1]:Y$mrPJR0k,)M7j_mnFB!n((,">p`]nM %?L#q/dt1KXeK3ug'pu0><s@gNiBlha8s]Yi[XTS<deKi==f.h+k]&\&5O<;_@sZNnA=^hun_+5op3@S.=!'*jQ8iR`c''n@H\D^# %:_tB>\PmeMbIJ;/^l_V@#E&/d;M;I=HO5f;C4_8!%+#&rY^e8N7Vt#D;&-X81<6e$.eVM!i^4dbrU'2`I9a;.!t<]"2:\W_b0GX7 %>;0G#H9$2$=gqiFE-RJ_/'74DEBs*#e]&hiE*LH6H,FH9b:&Y3B\+q9F>2CaD$90&f3/$>C:r)ZQ3D^#1;VRC+ZT[JR&%OOW?/;$ %<rFXM?R8pLV-H@j5`P3hLrM>D-8]X]mrjVLhO3.dg7hZf!e.Ea,&JB!_Ft:nI.MZJE+0*3]UQ8EI&;FmGKQ;!$OP*;-YK]AY"@pk %aI83i/HC>S-kfcHD`+A!7JgQXOccr`#.7XDh=7q;6#g"2<n9eGr+<mlXdXJr"?k3!"pJIAQE?TQM#^[0*pf,7prVM,pIc$\%SV;: %[hb&+Jd4:[+83_4p/^D!l_n7Uk`K3$=`Y-FB&0b+@0ftVYH(Bj@mN\.a\/IFDB$&e+TG/>Qee&DOdNAJf7Ko7jlNo0#Tq1K+.HIR %H?M6cl!@f*5etM0gM>3cS$JBFHbOt[18DBXXl/`Q,Zg9ON"-qC68$AV,]j\5Vq`La1N*/o%oVQ9S+fDGT^tk,\cJ'@fN0:[ju/7k %n;-bN%Z>e_eU,6!pZ2+EBo>N1*ZS94<E2*^nqM,5`N-k-<O"Y#\k^1E-]CT&Ytd>q7($PYP:%@RQJuFt21=mqGA#UiV1Zki3*$&W %SWpO4R!55.:Ys%N!Ii?.j($LX!]*un`@K$:(d[+(pE6\0>(KD':0-hmDV.%ShnIo5p';)DH$8pb-Gssb+tJ!+3mMHd2N4mE->965 %=-/hE]hD^K3q?aca3f]I'mJ9PT)2e8A<(Z``1AkFZ+G=-oM[\<DQ@G2TGoL-.kW/=J:.@O='u!^6?=,?J4lp_a4MFQWe0fPicWTE %ReLeCLMcuAZn<\Z$/c/UOM^c>FoV*1j0crR-&ms4))^m553cb!He81+@i[Lb:KerEo8!u@.3KO`dTGk=2KtQ4=6_:t0Jrd6$4+hq %bkj?MC[aFf8r!Dn\c,DW9]d(#(n4!;5H*MX>"P5]*K3dQ!G5@NF[<(XiCS43OkZ^[&X'c7.TYB@#F)aO2`lR%#--RR"(VTN3dReB %#9/@Qj&dhQ>HK&V:5uR'>2AHEgAi#-DVP)?Y&H<qD-[luhqFSqASNb[/*gZ@8B,t)"f6Du^MT7PXGVonD.$&(&DN11W=CM?kVNZ2 %D8oA^#Fn(9].ipt8#FrT*tJBJa$TfCVQ%4KC<=,oc!f#,\l5VF40pTm!-(AjFUtkgc$p7&]DR-Fph^"A-II7sdh8*V.2R>m&Kb=. %=QI!)ZmE)dTi4J-,AkgAi9(ji0*4mmS5k6Faqu*,YkR4sa+:?)HU:HqY)Bs_2+fgVZR]88P,fFOJ*V2\*(OsLO"%iP_SGHb3X@@D %@BCUu!HKCb.Zs(^8>)Qc.U(XtnC<5]\--;-\p5UTNVNu^dMb=V0+"c"@VU,9T)pB=VBB-jH:=XLcX;^/KCM0cJ4#f1m71/??U8"m %joRNj]G!d/1PM.<@U5YFbu;*i9MHH/FQS]&N^Ys[=%aHGa6lB&M$>e],e68q5.1X9LA'n/>Hf\B%H-D,YfDc@A=;!-`=r>)@A)ho %o`9bW3"-X4XhLN^[S.['!P'HDGQG(N)BiXlP(ck<qu[_k/WoM/&AS29f:W&?5Q0KZJ,'Viqo:qur?)(:J,N/ms+`i:e*hd!`'=-s %J,Yel4co^)YCH;Y^OQ3[J,HCtcPQCuqTYr-q+n3os6[RLqW%7@pc7R<rq:hHJ,/!*5Q'CTl/+[kci<P,s7q.uci5CFs%5eaK=:aF %1(D\O;5\Q38GJ]CqQ/[(cP6?.n#jD)O&,KFq"\:Eb6X,,(:LDH-Ia56VJ@%dJi(8t\;s;L*0u:dDI'\=,/nNe[I0+4qWH0L$"5YO %6,f3l!<fK7:U"fMJrhVlO_Fu.A:-C]Jo$&__=YZcdttejSEj_HX;Qr!Mg$a<UnQ*/Oq;[Ekb&I%@gMmVAH4rfL7f?E6Z;1?*_)i( %VrBJS&2(p>B"h]NWP`\c8sA1Yo([mXH2PGD^$B\aa)s$2"FQ"#is:"P`[L9lo9V;>*'P=QKW+:u'.6O'5R]&M$Q.5-N%"Pe:T_gL %1)jNW1r^ffNG1IF%G+QjB2rNG>aKAWMlKPt.\n@':6d!*U80UQ%$e!FemHZ2N#7I/^'\U]=D1\*@SsG8JeJe\P=SjYP`IS_Yg<C+ %;NnQ[!9;0Za2N\M#h?a.TT,l2j%Eb46hB#rUABO0SR@Xh"b3Z6BZq-+/tK"%-*UHT3K:A&m&l%V4D_fIcRl@kOUk2UI,iN&oVbgB %f<[WD;59nC7bUMbaU/\&lIfR5;QYVW[8<'"iJchs:rOsF^9KV]R\B7e.3JH'A^QqrQLDc/W9[^q\bHI]9!XH&Ks,XW@qj=sEA8r+ %@W1Je]Z,VWrgLd61#KqZ_dSX3^`kVKY=1O#AOeR!rWk0ML-nhSc+L9]2-,f0j7_rV1"B3K;/@9qFAP+Ki=5np4B6Al+O/hT`2P18 %cs,_e9Z$'\g``&?Q!YJQGQV3ih@p=eWlOF1[Nc.LZLM][XYgIo<_E',ok+<IC*mT?*cbKrR*^1IKB53#,DOSkr5ustN:6]fArLI< %-cRrkE7*`q>0&2#;ZBXAIHWt5O(Ir&aZW^06:iBX]SnA4OKf4mK6&r3X[/V#d_n&s\lIDq_%XuDZY:EE%:hU4C)l5[@uS5?itjA2 %_Eld'Y/]:sh-"O>enU@!bTNs9)5*ZT$!S&5FYd0l..3*umn[rQTgL^f*Z>"\HtaG2Ro7XLK1B9$m8(+[!;Ir[It9IuXl>Y*lU*u] %,TK8Pg'm18VRF-<]LlIe,:c%IP>1f.">DV],T,$t$M%_I1(=OI9)r8(R+9RIA06@B+r%*AN'N6j\=-!!Z-Q8(>ot\^lNL02nQo6C %2J-2LoI4!ff0B7eb>F7-"J\Q*mN^r*,_"$*.sNYB16mJs$CVC"^>VA1d<U^;n',WAGURp!!arn'`3K#br7#VS9_H5'JSW(MUV%^1 %W_SOp5-$K,MIs9,O>f]mknX7>M2S8:BK1k+PO7RU(Qo:87;ll`WIaK;4r!G(fCf\`TMe8tpH4"JHY:_NDp4[%e7MCo3TRlQ9rr4s %._H)-Lu2,V)dhieXqLH?hQ6b4l1fEbJYT0Nna3cff;hgT%rI)m^HKZ;WJ/]-WGtH1C&nefo3UY[[n_#<X_F\c'?D)IMQSXo,nGFe %*&q37W>a[*$0rGDB=+S:-"7)(2CVkfWt4^><4V_<TG9t-5u?ZG^Bo*L<i)3O]YD>i?%`<j+Sil`%sF=3lf.Tc$WC?F2$(q&cFo$q %%:cZ$(qFclhK?a1e$i)RkJ/?":hm5EU4(U?D$BV,18f"VgUH4LD,"iJ&t_IRc*SL9QbC;SdtB^fQ$&oP5HP:[fbc)qQe;K-CTd]g %cYT,lg&gh8eqmF=nW,Q/#`%PU_O\+*!;I>ZCGF%Ff/:K5n^8ro7)I?+;BiRq$YK-EON+Q8O)U04R5ARXK:$7r=!fWPDf2?+;]+tN %(t)$f`klIKZQS4/=9c0CZr^Qr[P9#6+EXP-mKLIS'DUe88ju7+U219qYi%L',TQ_,Md]KJfL/jA1c$@if6GH!CsAJhZ@etu9qH,t %chHBgCK0_VquS'\,ZY[`9'Q,,SYb./W%KJulrR-tBjMc@9@5R9/'E6Q.Rm?<_oK3/#O@)\[l/ro".lBi+;R!u_*L=qB&aLS>;\IX %4e6n6h.'..3!:C!_sO,($Gsr]@gY>:YTT)_W%mF)P+AfD.(01C#grH5B(R(-rleOj_'dd&oe17kZ"+VR**]ET^fM1g=rad;AVW0e %[Qk].#S#,_I+&kiPuNWn6UsdALd/$So-kIgJ)(O,'e\u7ZULGg#g^A(jC7WA*n8T_!`(E/0IF7('W7hd6GtS&XI'(g-aFdcJgsYj %ioU7c&cH7ARU2KYOOtj5HT":7W0)CVc^*tJmXCNE2:qmT2I2DYp^#CbXCr&md1ZX>P\;YU0nY45T4;=+@i<m=amkE1.E[u7TB(\k %Ni#1.Lur+lmgr7?c-?E430da-hb1E_R_9NLhcj?(KJ#1$7;)op#X):[?P=W>9]CX@:`0r<fp`"[&*BASpF^?2RrR)HP3o_t,*l-o %@I8hBldL3cliX>_12RY58Ue(\3;lra.4%ph_;9!Z$_jaaIUiY@a+VR33hB^^o5&D0oErXHoBX\Ajhn0KgGSXijSa<-1MsYMd^F%, %.rWGE],[D.=XF77iK`>#V]l]\#l+O)aN]BG^?$6J>uI[S\e\MB0O>>rYg$WQpEhS+`fUrq%acb^`HoU-YlmS?3g_g58We3UWfg#a %R3?=PEBb(=@CV[85$IXtjh"W>!NcTpK4[O;S3?q!BCVo4-,E9,@/aK:EtX?W:B"fn^]JLH07?"Am31(V&H.@<'mRhT98atMH`aUh %Q8NR"Nsj9.J\Op1VhfT*k4':1J=BY&h?O'C5b*NoN+R\%3gojcd.(m_(6as2&>*P;osU(E!./;S_R.e1OgR'fWS)")>3ZmHhiLrr %!pJ#(Y1r.liRI"'_Wgn>^ss+.9K$gTE[S]&)\#*VOpsBNna`,KN.s)5e9o%Ub_ime)Ag26DZSZFAUi;CCBc[)?Md^@YT^:T^K%51 %A2Y.;p:,aFV5J.ZigRn4`pdAmb0W6fa43PN32?3=+Eg2P2c$Br2gYLEVW3$2!nO/*+,V0qBg>KR/b<)8(FkKFL97IY(_U3aObk\u %s.Lg;(VU#,+gn28KGB6PQ)Bep!Cm>(m)].I!=R?X0d[RQlL0#fb4Z_gQL@]PE@F6+UB#!)!QL<H,FSd*KI9-)K^`($T-pL8[82t9 %\.V_T9+"X-@\hOo7hnLs==G7..5&5K7?KoN.f'-P+%ZV;jj<k.'l-CT4Xt-u$>9q4BEu!YM@LpHMCihd4BX8QA,WAB$Pc`(l_7A@ %%YA^*n;eIG4?>N>cesfMo0NCl\Ju4m`u-T1'[0#>7efG>LPVb8Q<Z8LEK-`U#RR7<jSNQ+bo,HAeLAV->mA[p@pR@,f8aQ5k\21@ %Xgk5$=l#Kd6f#()8u:ZD9b?ic"XZ2Fp`lu5Xpp]GlM.Vn#%LI^NpT=:c6oBQQh75[J08EFBOj7U^`*nei#p]c=.td3B>OJX_#PBG %a^Frm=i$ropTFGn":1/1'$!s;&]_OmBNW'1J-\dh!FH@GNo6,a.Pr9"Y\D?Zk5h%I3g*EGR=R\V*1+5ZCu`qAP#)UlErl8[IR8dn %#JG<\S(1A3mFN,%Xl]qRR,R3>RA62V=k@Pd6%]ff3bp4g"p@2#,VEBIY+Ro:,YSC+f;]d8CBf"q$Bc&cC:/C6Y$bL"rL`Dq@1pVd %*1:IT^;0fs#&)hqeaFBPREXq)hUl$OL-.j$m3>'S#?i;=LgD#[Trdp3,dco&kJQi@C//qh_mO!tTcef2#%MDe):c=I";"pYTiTP4 %PL(Hk_#SQh0&Hpa!jo!Z:@M7nD;D?P8=I9"XU/BI_%'*sU%'-J*UhtKBXq/rk%.b3&%o7bN#Y]S,SEj#4BoT3ClO<+G#B(tRT4sK %#i<Db-TF%!.,o;>V>q=/;MUDp"b8S!rM2qCT!r[@<`(%:C,**%W&0F=a$Pc^V&;^JDZV&K$&4YidR`?N`%FFD6.Q`B;:%</$%pdP %O>(-no<f=b7cbA[;<?1\WkUnTO@PlRe(aI4lrMh$RnV\=W"]l2i:U+BBWWN;0eS3AbPfJ20K!?N.A12*r]-j3ra8I8adN\n[V8Bm %iD;)HR>et#&Jjic#1p$/Ms94i"Vh&rLtTR\U=E^gWjnC2CP&gPDLBS&GbP`LKu1QNIFC2kXYQ#;-\Z[JjhFMZ&]A9eml#\O'(K48 %FJ])#.7UI2Q+n?R79//7PTDa;@T@Jc75g^?U5.B1ZssqaG9k*GBRN^RBX;k?!j#X.@uY'L(Jnp0k_gIH3E3o^]:-1lm[4M]:'N3u %/8,t;?%>W8K9H-NS>+s/[;bY!SkA#f/CZq-[amhloNgA)+NVW7BNG(<+Z+.n/5E/s?Rl[)N,/6sOlaut1A35Sg?JTi[EGE4H=a3> %J`U#h5d]gF/3SkVJ<7f,5^bI(;.R>.Y-](bRfFVp%ZLNU2aXrJLRCCd;:cdtEC:Y-a/B<B0o:=q8li9ZWd?Q2RuP35-OX?p!LmR' %b+[$$dN5)s<fZ%'0f'sEQ"SAKXtYIEd*gQ/TH%[-I#K]#B`q;$<MbTiR0H;TU.d7!Y'7mbU7fmb"]dAYBeLmP`<lW_"qm>l]??`n %4U1N__`2VMnshN_L-/K+#XU4*.E"ca-)n3RFbb-YTGeX]Q"4p1FGV4$_'C,,e>EgC@alAPSd\RC:/cC)<Dium[abLUV/#t8BTj:T %:Bc4na&8/lV3q'@mHJ@npqjC9G/'ITg"aV1Z;fL>WC<bfqtMiF(KYKd7qV)9b/>b=CL"8)<DAaShi*C*:gShKDT,<#X?A]A]gT\T %dZq58Che'KarRE7qN>19376bW4*Q"+i9f`oI`s$j_@/L5<\HdQ+To5ZY\XGX7`++f)=nCSkUZ?R$_n.\nRK[AOTpE0EFPYBG]=Kr %bYttoY$4A\R=Wes&mllgfpWHe%gi]MHb;:IaCFg_o_r)#d"].H;Gg5dbc4eZ4sWOJ3=Bd>V:Vk3%%rV';[GEg)e!t7i0Cf-+,1_" %"\H5VnGod2R%W@<_bD3q7p?rB^Q1cmP/VX>Zj0Uk@`f+Y%j4lC/Xe%a!r=CP4f\2S_'6(_%PRnBZpYh_#AZWp=C2*ZU;8<X&cd;) %K\)\>@4UA-o.6*mr5)`$FB%AV.hO&.Ca%rWVP$U;>a6[l-4?LIYn!`pI=uUm$C2Y\2n`E'WXJ'0P]:Hg"Z$hU!>%bFeY4C%'2i2r %Qn5mI1;8YX*0k?&TeuP7kgF:dRT`0Q^HXQY2Ya$(n!O+<eQY!q%(8KF#)Sfm1fI5^ZDiD_duVbdp+cV*`\-aP`+138#^%JXKfodB %F&79gP(g&EhRYbj^$GQnAnhb`-PGC5RdgU5'/O1A>_>'SB*t=B)WI23?s9BBX!+UDGt)m.:IJE`))s/XHAZ<b^LU#WKpp^p3)q#t %9Hhi$>`2X]V47(?,ipDjPd%\'R4F+Oqjf#,/B)D#,4QP^EqE:=>f2GMIUEXJD`T8*EkAL*=H[u$O<G`pSO!S!KN%lA='(T>%l>1O %_ktNV/&pXAm497&7:gW(?5?[6hu^i\p!B.`@tk?sQaPu?:f>XP$'?(J;nHTR=%iV-r+K&J@;e<r/,]HK11qX_!(sKFME"UUo+aUq %0H8O'5Y`2GV:)bPhF2[#b+`4#D1-7sqaLgHV<\-8)O['W`S'`)+Yc.cI.Ic04)1Z-U4"iF.,9=kf-[UlV/B%?5YiX=Q0MDDql9U^ %Mmhn-VEm!lS$j%jAh]0\^e;5PdVMf5F(gOp&'kG6$,,#48a%`P'^Eq*8Z40R0g)gRn!9-8#q&s&*C;#XC$/m_Ei79%B7%Pp5%7jG %KQ-gO6u,8J(?Z$Nm=MuNN_>A?F2ndg;?RVp`=BolU1X&0#+G\[)emc[St4CA&[iCB-5]jkSuS0qD,$*QhWd0cd*5;&DY1OINFmeT %cHn4k<"JN,V[t5+a,5Uo\CSXYf?,iBE)7M>``j47F3[%#i>e_RZU9t'[(*$X@7?#I;Na`A=G@$E=s>:FK7GHjeDdjc,G#<,@;DH@ %N?ZDG=:O<HqbRX9!rLe8>T55caHbFTG1M/kNkNSnF[hcd>m;l*e=Iq3D*S=R`5tHQ,-,7M7T?>AO>(6\!n$DL!D60%-t\&tIOSWS %F,pW6N$Bq-[5$XbTS/o_OfBM>!Hl5#1bJ%'T_U-E\r"W-%f1#^HH>&fiS4NoO(+tU.\ajXc!/@T3f\!FpBZfI5tVWM)`m+%5jsMV %;Fc!X@TkUHDWI>$eE2\V:b+_'"31ee+AloNNTk.3J!,@C"Q;Z?(H`(D_,.Ge')E?LUOB:'AM(t))J9iiE`$f1i3O`h$,Lqm6a%cA %Q(3AF^]dc?q),VaJN,"W]bPb96>+08Zj@>_Y"a7k_hO3-M"3f\`XJ2ghFjNB=q7Hboo5%n;.^8L5#$bfO&hfQW!JT046MpD(]Z%I %^or%S/qS4[7FaHj-J6;_V@0/0RVnK2NgC@_Ok//H)JA)d4(+9Y<0H"t;/\Sm*(4q#RUn_)-OOrW'`Jg$pS2t&*(SdKd3k(1_TV$n %af"F)/!VZck>$]T7,`&bd))S80&%A_i)@ak@?jH!1.?5X6bX-a]Q4:N:X__?`KPmr%ktJ_i^pE0eKA9p%UjM:&L%?B8X)agL/htL %L/Ek8A=d8#%;<GFLM$6h1aCA%TWa\QODt:M"W3NF3Q+3RI^KkD6\FmE:BW^X%rW@?k7Jb)=d!ro&RJKP"M$;XK1D/oJI$t(gE%;> %M_Tn*)[_PYPp9m)J7fAQq5I4[1(O-@5t<uc)Y2(N8dfl@5:n0S1+YK@QAhcX7+NP]<OEN,MqBn(Y`@<A#D""6Wfu83E&Q!HP\=3< %=DB+iYK1OYVj^LtAkj0UNQ$4((j^+GQ=[gR_]VKp3CV-Y&U=^e%jb\i^urh48IlU!pQdaf(sJ\D`:FoY'C7<^%PS-,k?b`B?iWr5 %2$#`enAAI9Y6X-XKJ&W]8q:.lBCKkY[%5<AIWDZ6-T_!!#K#gI(a)t&9]/!AT*h7l;H\[J`!$uKlBp:R\$W-9jk.tTRWQ&#kDO:Y %mBR+X!>'AkRji@gGK#hiBeU0hZp'e"A]=`+DkIaHS0PMX!utAK?m7D$)3AeU5l!U5'cKrMLoE%d7VF"=?jB!I8?KileK-L6#i-h4 %_er@C0_Lljd6MDlLrA7ML=`2_F.'$S(b.,TAqT7cT*>UQeMOk`B]Zt(,eAE.7@XAsjWHAU:Z*q)5[`"P[$+Hf8k0I'1L=K]+qC&[ %U)^W7?&?RiiDBlubq`J1CD5E*+A>0K*Cq,J,F!)bR`]C]K@IZWX&Y33c;5Jjb/jY"U,UqRfV4uXWiX%/B`0@S^dEi2HE_hgO%&A, %DZ5?4Eq..b(8b%P_>=T+3irs3=RdA%3KY*7)9oDj\dW)PT_La2(s9JFucB+Q\KSjk6sDWXpH#B^5O[H>"F":3G4B6p]oi'qss %44G[Thb$r?Md1_?%%9N-0EGLm]'D+T((IJNaPOeT"FF+!M`;Rl!SWrabH&aqI);FgORd?h^+hI&$BLJb_0?:>+''!CWID^AOP&2_ %UgAYaje-!A(tTh:d#hf3VZ#N9r\BmX9j>,\AGOZIo;LiC_J$TTj(*[RTj#<%A[JQ@oZb\kY!R_'^<t+2(lQ2u$8@3t\llocSaaYp %X&Yl>7$LPq^B#C,\=GRm0nN:+O9:'>2gDBI#a:5f`bqKf*q0NjKVi&gJkKOjL8G3QEt3&MOVnGMJC.[qM<3@OK6"6R,-L;mBm[;c %%4"0nmbfG'+>)SZh@N4mkn2FtnD0+N2l`TC]NB^ZA4]\S^6u7bm'1r-I&1@kZYpL*&;krLjphV299Be</^I#k"(\H>C5RG:;'W)D %P-WQb!!^4Z9[S==ajEuOJ^oe:l6Z-$h$/49J1sS1MtML8[[X[)pBeaNS+R6ZcCmD`+CX9$HnoT1=<<_)LBf6#5sc6U2%[<)WudL* %[I^>>W4mctTuDn@"q64("\PeoeOW"WM[/!#$,)J"=La0j`>e-3On*YSC;]qOei6fC\:+/3m'hm,R@aPb3qX[+G(7;Np1;)eZQjjl %X^4;'d^>,`Fm4#K"qIYDT+#;nKVDZT5gk%%etJtVEPsK&k^5-FXu#oK5H)f=JNZ,hoWc@qr?VP6HeaIcLAE\"Z"hf$p;$_?cIr\Q %Js2pbMsI"mkQ'IlRYm4J19S)fXsB8XF=?`(1)DSrPj?em)hECg`V:<u/0[J6J3u1G\)R+[hObps']&oCcZ8gEG&g=4%f$_ErGfb- %RVdb*@-UgEi5ImVf7I7j+dq:Ye+glt/HAZaF,Sg-;74hMk*7:9,E=NFX:8Rj(6FOD-ie29-H`OWdT"U9$PLd'VFG"F8J)F:,%QBI %*JINo)*m?L_GjX^_5U?R=1\JlX!6Y@'+@+dKABp[dSL7iN?)X_QNs+^31*@!m^OmBX"moK>+NHW6ZJhJkR&+Q;q\b-HfJNQ+3e$X %f*O%.geWTK.!fajg6BE7"$;JIKjJ;b&-JSJ\MO-r$dIia-6$OjB$r\VCU.A5Z4JN.0%V"V):rK4f%IJ)aVEj^%q(VCU%NDTY_CF4 %`nXC'L.\7sZ-B&>3[_O_fiJB\0*'TKPNdaS>mAq(F":F0i?g%VfG0#)CsdUGlsYERKtNk7WSL``2=#?O_W;2o)('%t^=MWrLAcr_ %,h,@8C64*$>1TGciuS@1i-6abOG(N-7Ir]5:iG!#lrIVH?K"Y+o&<EZ^]VISdm1WWIM,b/3TG`PC[+ZE37loS,)jTn<-@1/ZkJZN %O_"Po]XDq6(E9Rj9/i^4Vq6VT$I_$W?6B9b<HSIab3HB8p0ail0TfiH0&Wf]#W&L#Z0"=;,ZSHD=*5o^1Z_+]d#Pi&g3&7,%2a9P %Jl.ItT!l@N!p(,UdA"m@9-Dl*EF@m!HRE;[<sOSh[h1*_d2$HbN4A7onEICh@_CF$8&P[t"?X"sZ5O>8g0dW^Xd7Z<-5Xq#%d)c7 %8pA9$g,]F'-)@/nI@?OoGW]>]181,3Y?1onlNi8\`OXicQ#&^#qVm[dij05b'Qdo/)>s`kB7X2Y`G$B3$mh6>H_mWqF_t_.ZN&2N %BgCj+`jYtG^FL)LTp?Ht>r#LjU*P=F!*kq&gSR`-<c3UA69c$UFMu?#eVa$pJ.m'%9?/PA*`#c<!]5IApQ+IQ0VGuO/;'oC]"_"5 %$8%t$CBJh<;>o_D<"GdL!3/qTkd6f+%"g+1;Y1+o85<2ebN7Rg>UfR_1#g1bgo;pla9cVTd1*\1!.$OX-XDIa;dM!f!fmnd+?^OS %!*!FK"&G5i@IfYeg9]J8+2G^pnE-;h.9aalV$"<Y<M+V9m2,i2?6h@$F#2k#H\%?f)&DVQe`\A27\D7P0P+iGnGNi>/t.Z%/Fqn. %!\%"TXEPH]bSae':Y$;C5Z,"q=&p@;YR1i9T<d&0h>:X[K?b_J'MX6gQM&/U%(:u*oKJ%;Js8Y'Tt[E?:K_$`ihClu+"2"E'0m.- %*aVr*/ft-FWcoE0*h;ccAP<(mTZQOhT+%rm%D^s0GR$@`E_p7rAFKXePbIEB*u[9[a$.%hl4YH/\O4YN2C-!S0dP?&Ikk]1:L`Ut %)6cZ,7O/6K(ZY+oP@95!T'T:.p:?.CM=]BWPC#nA#Y6G/327T%W)oUna?,jl5f2ls\iVIX`h'kkZ%1C+T!DZ&?3-;QMjXRuEh'i\ %Vd^ER$&mUH8l3mCJjpcG*mqWJ+;>+A<It[AD3#h)kOV*rJ]>Qu^q+KtH&LX@eW.o4X=]X^;kgT:K[(AA/s4>/p]n<4OqjijU`tRL %/[5+\R:J<T$Hr4']rSQV;cH1idS1<(L_X)g63j_S^^RqQYj>s2Ca_R3!:9=!,$'-G4QrX.48P5i\DG4/l#N)q<^[&E!-tSN%;nLs %H3GnJPlZ$)"0PAga9YbOlTma'd#(@3[u-GBf/d;qSMiV@f%H84<\qcE:29K-dl/&4V37!<Yj7S&09)+A(+:1(gk:>Ji$9t_SVEEo %$p[a`hN1)71V=a0$%^i?i=tR=JQFSPnTJj5Il>cB6J)a/8^nM?<2\phQ^96;8-<rZgnE4GY$F=H*V,$<#:h(j*aT;4FdLN:(_F^] %p0198+XG8cKfT2jFFQSfk[Nu&G=fdVQ43'qq!>48&KM84E4Xb@mo79L;4_0T3=O<(=]7Uf;'EH(rn,#HOP"!&U2VRrM`-P.-Y.:W %P'#*W$qZ!6Kkd)RX?8RseX05cXu=`Ap12--*jkCs0FtMSWmM*8A_9!)=+t+kL<7m2Pg/Hs0VYEm6a^Km-TFVp_R?.BYops&9uCPa %i>"9"b%^/<[toC9C+bR_AY@UA3#PO(7`&\n_]p0,N*$^/e@FF#pcniKU+$o`)HB?#"9JD#RVt]*DgFcl?d/j?U@9#i]?9?=2<m)c %/$!,^UH)_U>>gs3(F9;Pft^u$DR2BuZa2!8NHM71J2sp"s$PS,p`W5^.S*Fl-j"-Sh?'96><Ec0M]qF'%2(Mtkq*g9#/%a0fdjhf %_<g/+.N2cW,C@YU2RueLXAbuVJa&5L)0g4G-87^OUG8*IJ8*N53Wbo/"#Mn<pCRQqUdB.LQ!R<o/3H:#0p[Dl7s_Q/N6Vh<!c1., %D%n8$NVe:`#pB.WTon^e*VU\;:=]'H_.lt@W0D9f>,pPJ5\.h735!(<E@,IubO60*$640[?CTF<l8/^T7aE;gn:F/L+2oqu]hf)# %eigSc!#(YeAD.;dB8/..jegU2Zp'sac6,ET(_%UX-&2N>"<aUf!$:-81PrL\,=\Z5PA)nE?SP_/3%Lqf>^E1qRN!*#E1GE&kT.3g %!ln*@!Ck03//u1K$GqeJPJn+\(YCW:kYN5<RpLg6M9gnQ0cQ`QQKU)S1FO-^LAiMVNAlV_UDYd^e6"=jTb2IgTq&um:;r%+ZLra. %FkNamSK9Y7Mce`@EsZO]p]n<g@[.nUQ!0EpO=/hCd`6/n(h&K,pa'L%T18Lu3+iQ\<)L&3BV&hnTLe-7KEs7c"_+b<5aRso"7B.- %j-\6p+QKr4ejm=Y1+LLA@6=EsT8IlW3e<3.0I%k13OT2j$^[^0OU"Ep>":!',ICWi>*dJ7&/!n:Pf_#0E>s_8S9RKER;Z1QnLd-R %A2;Wnir5P)m)#=Y]UC9kI'CO;)ZAG[iNL?BUE^e0d@L^Hf5*SOP7na,eu$>a!EMil;EK/6GL5q''QH)oOs,/H[no-7e8.ld[[PoH %`J+OS3LSl#$u(IEM+Vm!`DMBkMK.`HB@M&<:pj$XX%B'Z[VHUV3qJAFq'4^57`8tr]?RC3@7R7BC-mKT7?'<:fdRhLWJ1Regdlb$ %hg8eZ*;j:/HI@C.*ags2.@HdOQI6nL"&g-/jTK:W`l*DA=<p@S9]CJV5fF4L;&L#tQGUaehD6I7^_6qO(3Q__"Q1OnhOmDUpOof\ %+Ohr@S\Xsf(fIhBBFYJP/]&FA'S%D'D>"[<V/],0im?5/PoZ5'\a^D@Ns8Ei(Zo/VeV7H8l8VE;]kq-:&]<QqgV9KHZO9Y&p&r1[ %k=f)+Tte6@nHd9l"KoOKqAB=-1JC9$@XD3@;.&(^eS3BjM8<i[ScC1'ie/)@U@%8n\IiCULCdQ51_+)j2.gfX]/YZr!qiUI]:=Y; %82P>mDf#P40r<$4d7@.L.>?H/J8m,Rc[F<F/>QcpFRmd->>EB2oh%J$6DUNQNSU7-<T6.MJAA%k]Ee$s!b$_JF)V',@c_LsJ;nSK %p0,E@=\;=!X4p4e$3A.PU/d$h%JIrKoUGm@J&A(i#W`(#5So8$V@dTU+^BD<G><V2"TbhS%5]pKiE2cnApX^qZ(rD&`^hUh;"/Ja %98+6q&h;[;aa_aOF#B)B#2h@kY'?4_EckF*.7L39%lNFM*O_js03C(GO[bFN`#5e\*_o/6A7i>4jIR$I@)Pm&Gl.6?T*^Ph<1NDH %f&e<H!pB>1Q/7#o6Ie%%%G%6fpcRsk,T+XBDZI/C-'rL_6&3p5HX<J("t]d&PT`Mimh,Lc0=sPa,p^[62:bkL1(^=C??X7e&<K7H %74_BnVlH^37F<gp^XdU!Ue4\MKaDsSR5Y/3=r4tlh?.s:HDLlQNO/kGp*bTgTX[fiYZ4p;f@g\&Ja,&,0*Xmfo3NqW[#QBeK">:" %<io,G4Ol]ZE%*-*$>6t@Ta'O?P#]\u%7i9GJbC1OWARSnL@7o_/?]#=CI?%`\i58XneVc!=i'VE/1g%EbEdf%'oS$P:gjK]NN&"i %Oj^`MpE#M8%B4\)U&jGprSJ]8$r!jEDMgor3*B`"`VPVCMsgoU3,:7X29$cdbf,-Xgj4/XaM]26S:NN`M)nD%$3[TSH]Y/WC4MP2 %X/qV(+:s]UW["CcErb0r6L_JI2+Sq[%1KqVW*Lq#"54!&!-Dq-I]3@Dk1];1f-9;`e0tiA27)f8et1)BU.7,3_ZcDFl;46T+[[KK %F?!%kSF&W3TsC*^8hgj2@Si6l.9f#j=K,2MjYI3IU!Cf6YbA!U&l[)5RHWfpWc5OqU5jP!i$EC4GBIA>+3@o4RR"Da0ktSMqY%1u %,F-83(.8EU-4[6*,ti,)52^P]f>`_910qe`f+<-[f)WbW7\?GdY-sh+"`/;=%?8kjnIZ:Xi+/p`>8%"O3L-<_+Nim)[>JH]/ie*u %oFZi,YWW_0jm>?A3OE@/J0Kob4W0e8m-5H,'Y@'l+R&SK]pT+N=doER`eVMq/2Da:pp$K&I"\Bka?6ta4:P"9=CTKIBTi2G]t$=] %rkJ15DsZ0FNJqM&C$(#@jLZ:b841fe0U$PX[2>&;:V(<iQ\<W#*6=tZ4IM9eV[8C*R([8M-Z@hl.E)SHN7$7P)9^k0+K%,Dof2e- %E/;nW+5PBqa>6Yd@;pgaVTRi9^?.B#L^D]90[7%U#nCQ'"@nSQk8Ie=NYJH,Z&"p9jqPobM%JNH&Y=moG'uAp/AaG:qX4;%\fX=S %IEd8XHpQtF!5#']-4S31OOVU>lT&5m"+s[5ZkNge?`P%:8&[`ZWE;Q^+JVW\_a[);eOsg%^:tT5FjSl[:Z*Vb<M)Ic=+)iu[5)rr %NDeh%`2E@JH6Sm9)rq%)%C4g3Sloe8&3:5p^E/:q=n*[&1uiWZ7V_dVKKdL-N]8eeZiD4`1Sejaa%(Um?Z:mAF;XsN^n-b+l-7JK %7]oL*\(j*A3eTu=EQaoo>XrfLQ>\VjJ7K+'RMZQU3/uKSI1#XmBb`.Qg0gIL[!e<4NHdP#C1Xc54E3ZoP3ND`S7:REA2k\pW]f?$ %,[i.Vm-=pjTQWC+hX5&oQdTgUao2;Kh-qnD0gMo8JMUaj,=.fh"_qEX;Sk;Zq;<H+&;Z:.E4c<JZF_A9H's3S"(rU+Z-XB#TGqWF %*G%)5!_sFDpUDE</t->0npn4[bRL;.A:#StgFSLV[M^DM*it/RUSjHIekP]SD,/]nAT7i(%VM%8__3#.3Ck"Ue'PY1\-130qkFem %d$"(3+*ES'9Vs;85%q^b5^:-L9ZCX2E70bkM1Hu[#&X9q%2j$rHi!pe*%]qSO`-HMUu<r:nZ4ok6jP)!K\\X1!9@cFTQk!^8rUr1 %*S[):U**(H8cnOT%s#=iHPe^diW3;:H)Ss61O`GYFG6^_"H%st3I[9%"e2+p64l8-9nnW3Qe%LHU,^D[)9P3dU>./Xp53,*At^`] %KS%.<gRP5c88&oK169#XC`gMeTR`,L/f@\A4-UMX"r=e4pZ*el^a4:\^g/f[do>gm;Q_i"#frBk"qA#`=,q`f9RU)"8$h/J4)cU, %ic>+*.%)tnZPrYu1]U^HUktIL&b?]JlSPZ*m2gA$*Yj_MV*IFg"GAqiS)]-8nHK:5[Vf#-?Jd,T4B'F2!)>Mp!6(UZBF6qSX65SC %6#fH\N;$B'"@3.M5e:E&MhQl:@Oqf$a\nI&HNU?fkXeg3-X%/m?cm[k1PW+Q6jO&EEm!dVd@NIR$Od2AH-Nu7!mh0#56h0B%=k'K %,-]u7nt'/<X!YrCmP\H15n3\k"c/%E<1`KD?p+ZQ?TdHr!sE'%eZE7f_&0C`(k;J`kd=*hW@*[c9>Se^$b!#c>L+s@7=0q0<'KT[ %kdAR90M\5oT:cV\_#W;I2?A@78P8)d$#!U,j6)Q[KMbNQ_1AX`;LX5tol0pG&t9R(BYjH]"/.P42N/G[7`\V[1pXrV2;C1+0L,pe %GiYkb5S0@X;p54nEhFN?^pIgB738q,`Sq?)QDGdJj1K"1U?+/[4<h"="kIUrP7[pP_pAO7F=7eSW)q]5:^s\/Qor7t7Us']()rr> %qc%u$9%-Y>.p8&!(nc'H^aZ02Ase1+!Fr3C.r-L@&U$6KQm2ptp1bE`TJHls;D$@8r"iVVXQO?6]584:5#=$<m7V[]=[-#p5^aE" %"Pc4F.6,;Z&2MXnG-C/od#;U+@@T(QdHh'q"@sgm#sE=Lep*u`?qQ-/">f*MYKNW).as8S^mA=^#*Rp)oFaTK@MMN3AoGSI;@34W %<5rD^r.F>].2uP.NsPo-fNql.Le/@F*taS`>2^5e$0]U'9/J9PT`O4O,h2D(Cj981EG7+PfT*uPb81=S8'P:.!Q(?o*AHI3'&GR" %'b&lrJ=JrgFeC5s;]l^uDCtRVp"tYHEMV^E1,1BM,%-q3'elUsOK)t3?sp[""9I89/>-c!GhZX9P0d\d%&QmRgD(-IeeKISem\]; %G7)IP$lQIs,`Vl8(jmd$;,(.C!I#(Z:Q&>_mfWW79F)sYe,#%`o:$PhWhKVOom;C%""\pk[hXUO'6fWhC\Ct#3)#o002#b)LsUa\ %W#XgpBu0@3BK<u1)%ebumD*NR3K;]_b4EEIAnfuRVMm+K%$jbmMaK&X1)f"'iq8un2.d/obIqL?`R3p,>:k&pF/J9i5u:6AA&,7E %2ec$a@r:djqQ"*+28tEL/&ROA:p7iA->)lGB`MY6#A&/0^,\7+39\,7a%*Bl8B!n!.fek.9O1p.mgfF,!u*Mm;uJ8$TGneu6OP.@ %/>bJC"VEd[Y^q&,<GH-c4q]%&Y_r5n7$lJuO-`4Ii#%Xq\1(3qBco[^K8?\Q8)=(OFje\?$kTJPBAN7WDWh).V%'H0C;%LJBknXi %oSusA:091f+?:48A@m\>/tbAJB[RUL'Y4N^E9pN!&Y9bH*c8sJ&U3W+%g`jcJhecZ6P7b:'*162TQF=,!]#S[nLQkj#b@B)5Y3p[ %.*WDO4l(%l<FDp8ojf!PCoW/AlrZ!eqK&Gu?E[(Q:6_P.cFR554lZjY%+mh'*T030_3<6@EDh_#Af7.q/%\(_&s4ElZ'kZ'7*)VM %Rg=!e#*1PLc0%Y,n5,_8NQ`N@lIZ3Ha]N<V-#`O=7U,?q(n:jTkT1"^fRQq0(-;q$\h,O!_'>Ak71Um+%7?(VYtCZ^Xb\S(du8,j %%Dq[P\Og8G1tr5Fg-c\&=l7dQr#ute94`/GfaoaS=B8<XGC;Y'e*(_4L$D]leSH)<F9u2S9QuL^5,i:4''85F9,gSf2-J-ZJ:5R* %RP=n_Md?Gs1o^Xu'i'!_X=1ND1!.m\*S)cn*X$@SV@Zbrcm'C[Rct1g+5%'GRWQ!&$O.m/=(rICXl2+";'ln]'"_i3/n9Ep$o"N/ %#g.m(]ddY]/K:FLMe2M\-ZN%rZWPm$j[0qQ@d*JR68PP8ket!Q*0#e:[WH<)RKLW@.7u_)3>nJa?*TU$>@=JaXe"(@a<#m(M_IPd %6,e6Lm;#"R4'"/XP=6<Me>G1HDT6a\-W"&_PN@XRJ`^>tO]=bSoMZNE<)=RsMjM<ja`I`1?D2V3B4)Z6NVepINe6@b*5E&-2GE!s %32,]_!MM,o*W^tpKbbqmac87aDITf.PsqE'2LtUXQ<EP%I^9nI=G/C/`B>fmDRI:5(tQ3B+Mts#%07*1Fhe@6#4RA[Y@G#sRKY3% %%o"Q>=c^)J+s+E<n@cCNjBDO*_WoA=M[%$FkKqsDgb=:gV_Fa&qF_D)\XD;gK^2b)NR$6ik-:L4nMkT,ZH_b6knT5_!AD=kQY\?E %<.SX*q?aKD-UL3*MhHD$!,ArEJRX/eT%t(h!6I`3H9PWiYXu1-QJl!;DSjFWieV(jAhQm?A7?:E*RR6/*)6X&=H):*QOJU;P)Ur' %\rJJtB^-C.r>ljCY+p`NIu@JS`9<bont7:N?j,ell9=!am>:U:%Ml2dY&+[2JuJ3ugUdV;m(Gjrd2.Frk>@-k>='T9qkR>d(D6qq %^'Etq#b/P!ISg;W3!.qpHMOPfcGHAC>9\B38A-f6]aR.V*?R@o<PB7P6T@Z2_J7JLCg@C+1lBh[Bb^99$W,9)=!mnb6o&S"OjkS" %p8uB3`RmsAT<[lmN5$^#dc=j?4OfrVTNZ"A%X33N9[pI(!iCLN(3FC!.LZWS$p!o*hplaTFK(gr;_(7$aKn1kWFoYK:lMC;>fF:` %ha3+;Bk8.?*ORlN_`$^l>6p19iO38@j'"G\eVLG$gi057D%EBtD<eMHCQh$93+Xd//fj!;R@9VEP#51G%2/'IEai,TTJVQe[j]1h %Ar$a>0t%\*[8AF)F+pcU5_*YZ$er9!;q["L;iIRu2',P1%uWlERWWVF,$^L:egi:R%^(ciKOK>`\N=.sYGP!a3N8oFa63-?qWN(N %&ZDrePT9<4f+@H,'EcW,a?uo\LXrC<6\Wnf&JuUJ#&lSSD,E0(\[`bh8O;r?<6_'mlhU`$!+ouN?C`p'7WjTuK-qW*rJFR+@=VfE %IJ+G?jm1')ND!.s'mfr(hc"_`?Q7jGa6iei2]j/F\@#$&eC9>oFtOk=V^b/^EbnX"=Gmn/[Ie19*hiTG\M$O_OGH!N1?mtZV<:gU %dC@6uASWX1YU1-+amPXRD^S)2Z-@MMXr38tkVl<pT-I,Cd%Vk"dq@r6(=%\DHPtkie./`+l<Xa+JYd)(NJ`M9[Z#4MJ+W.t@;3i< %`Yj=jl?d2$!TR#;#ukt`7K(]C/n0%(=&nge$V!(ZP-(CVLh7;DQ67qO7@WB&El!V%d-Za:JtLI"HPp\bb5;FaLObPBd9X9Mc;/Kr %+\:FHKMH*/@S+mTM2RNK:,W/u1r/_jr>5NN0#cIBW;0qGVFYZUC2hfqJ&5+-#V+D3XH\!SX#F"6_uiJQ(d0a7o\W[g7f6QWalHls %<-3%F92f,`EdP3?rka2g;jCN$[VgY2jT`\EB@IN.$5.M$&f?N.j;A99Y3N);5nYIl(9;s,NIGI'2[c`&@sf\!%]T!KnADrWmQ_l+ %l%]l;.^L-L@PSn3UHralesuR_XQ(_F26`N>k((AVR_F<^UpS698+qT3F,_s'Cen't[mj8M>BU(<L^r5dZsM!R4jB/\75u-(Irk*X %#/[ikBfIAB#J6eR3NZXpgH$p8A["L'CWfEMaHV0IRr_tB(D$b.)P3`HZNUfMLW6aNc<I5r&]]LJ"1fIe%pJ@GMbOW9:lCuQ0EC;j %MD_4]P[GI9?<.s'"(fVUd'2X4$jL5TRqI>?4TAHpBB>CUF]VE>FWqjabY/-$J/Xq9Hur)"nV'h)A=;mV"6C_$kXCj_NYZk?eJY/T %2DFP@M[mk>l3.-gqPU">>rJN5(,ub29*XoXBs7r66.%r?eF&QX"fJrbB.mq58Zc3T3O`PPU%dl'fYM[)OW/8h2IA*CXX9/u*%uDN %7AN%Z:oFjrXt8:"KIIi!^m94VVKh<PA`p/O3\;(>[o[=<RG7LqEdt<\d.G;oAE%R8<J61/D(M(e.PJf7?A!?+;<=K7:P0t2b!\d# %_t;'P(Mg6CEu?!4#t5*&FbE>2!7OmS4fQgi;N<nHPrY_0@t=ZjQptqbL*%ojb,[eC3]_+m5fI>3d_.=8?0b#,Ao/Ngj[VZd"2lXU %$:"uAN\l!fnt)#g,:kbLc]d"Loqn!toX\M:E/JnsoLg'nZVg6o@LBF<Q+4$C84IBo8QNOX%AV$^2#'k/m'6s3%P`[.YRG8ijRQtd %O+WaNnu!rA@<7RZ-\qe_/J@$j+Z+t5-Cr5[.:QV4C!\pU/u,a2T+2)3r$iVi_[dIqV+)uf/.taqTQhhD_(.H&S#dD(D(DG"?,^P6 %Ch5>WIN8ldMI7$=cu+l(;+o9D(/-Ei9g;Z180ds)RO!;142C@J2-E2B(d>>W:31I]UhR"@BF8lc2/b4/p8\JFlY1jCrEJeiMabt% %fBYDAZn!sN?1naI"pGZMOZY#ZYJ/iEnTd`u,]A*7Yq:it(LmHs&b8Cg>>7Sp=TkIp6;'"kKLf+X9uKZ"`30RE+#UAreuSpgBVAtM %bQi=%Ai#8KW/WiO7srut#mP:KD8\Q3?1%i(d-r+`'-I^I(<T*9R>p@Djp<C>Zq;p6"i[,;)1WK`Aabo*JV5)92;EtU-\C$N\Te]9 %3;j+ln^Si2aN]FOf_$+8G+</e3i9%<Dk1D3auWbmFR"ejkTWJC;V>)=(q^l/c!u89'$D%'UB):a+];3[D6s?toiF`;/X0cDor'Zk %)c7s(hU?:F^TYfG'EoR!`+T>mYq%,?XWuOZ+9<b[8Fqo!T[[+lS6Hp(W7>:N",oiRg-uq0B\\;(gH)G"='f]_i[j;Jcd?!kgeU4! %/-9eh1adWm_l0:b5pKhYEG4cQJV+ILU4#_DI8"4&$$[8%(/!(!<_@pn"*^IWXl0Y@K,uS4D;Jk4Oqe\bU(<_#opje_`t72JhN9u+ %"u*n]&Ht&uA4P;W2]=E^UP;VNF;YC"[,[?aH%`:jCqqLlSnrkU`U+Trgeem<@J_al!&2,U',8Bq?j&Iu8f&XKc3bY[!J8i_l"nbs %Hm$b013Ra/[;j!>:W^;uc%IulaK=2o8&k(p;\b@9aFP!<)^H:95YSP#)#DX`]iWS6pOkt.7E?(ECm6/cP6Fo4Tk,\ECSD;3$0dkY %&OdY`$I!0c_bL5m9=<mt<!1()\`lscU/VbM@p!04*LL0nW5[ZrH_Vd../@f/n1i&KRqW(q'dC#oGUQ6%M'>%TMXc)q\4d1Y0^41O %]SBn$.c)fEIGAbk,\WT8X!<62/Ylk3m@De?gVM*VPX)^1_3u.7#D='ZT=dKfV`:^H8=UipIVdMmTc=6LlL)uKC7t'+^f=2OEBnph %QV48Pd8+/88n_HdQBhf/YrNR'pGZqd0-Ap[X)tJo#dR7,_Ld1DNX9DO@ncth'8FeBnmctI2soo_dn2u)B%.8"c9TsqTXGkOYM:Y. %JDM8,E>E#+;oc!?8u'L?l?3F\dr_u82Le*88#-EGaj[%F?f,_PD+c7G@Th`15HAb)l,W1q6bFk.6/c1or#S`ie$Ym_#+/D+(7JF; %OrSFCK=Ra^$321=5.h?OLTdiHQS[S[H(#WI0,1WTZE&l=B]B;"/b42HjQiN_,8tC)c8uQI[2PpOX/Ac'`nIJY0F1c'9V*dE=2!^1 %W,[V#h:*oeF=X*tO!9.^pBa/@>b'#I"d,%cn/_VGTTELJo/f?./_H*b(d]rCL[m9$SPr?>6Vi`J"V-Mq7hiqq/jeuR/4//;'X0Ic %Oo]s)OKSm8%74,1^=G?PBZ+a%-P%)5.p:;@E-5j9re]]I&r;$1m?[7jn95RSX!J#$G)]t192mV_iZq,'ogCR2)'hr7=jGi*+Q=O1 %/q]TG8oOl8?FZ`W0U@q7eik,H&d!enPV.]ufNGY[e+=>C_D\sLrKYm\UHGs%()\,R(U5n[Q(6qY-D@hQdK>uEntkRI)JYg/"CPPm %8pj*I"-3c,!J4E+7(\lL#N,W*2,Wq1V^a=Aj%7Rt3IDGtn3X0_O>Xp.6H_CNd8D2-Rps[l^-NFpS?5=6NW_l'Jl]Eh4is3FN#Mt[ %+\HZnRAqP9ZL5qKCd'%Rno"CXM%SesZ#UU8-PltPs4D!663c:g:qgU:0*cP,,,j*mm-r$.3dh\2B6+&_87t:g#4TY()^V-Ri2D<0 %``H^#Rge5V."1Su0>__5@!+.Q%f7kP4;cU4!pkQ8p^MY,K!chU&c9AFL,=cUPW-DA7O,LP!<A4U`J^M<,DZnJmGik/N98:&5o_tb %%3jLf-iFtSqrSk2LcSskJ?bRtg_HjqeFQ(*S#gUqFlt)ka6!A-2GqsRX=q`\Y/4@.&nU--'+R/42!TbAm>0\\[E4ZMfsWZ9W!IL; %Z"H&f-c08eqFCo?2smAVn2D7E@pEn>H(q+S`]]&SOY03l)5)tp")c/Y;?mEVSAm<B<b8(E[BZ51d&c.^N`m086%`/C?Ih6bb0I#S %VJVs,/-psN;*$PTKuh%u8W_kZeAKc7Q\1QV!DUgHk>!="E=,ST_g)7V+F'kpZ4auaFE'$0hdFsB;S?(""#-cN8r!8'UKiSu'I[;5 %FNXZ(mU[)/0fJ]<d5Xp\7T)#3F-0EX$#sE"M^)pI-0o`k<Hmq_U=oC]k?21rfWM,Ec&1>N>p?iAf9u]EnTMeBdA%Z'e3h)U*E8D1 %p]*Yu/;*+U.<CRp%j&NIm]Or0.S8jn%YJqD+T@"N7KjIq<A[J4#VoJENFf%R<j/(KA5KV&\^M=?1b'!#a<!C.(0gn_$rIe;_@,ch %Au'C7S+Y(R+i,;ue3m'FV(_qh>rN-M=FgJZ)qkA0LnXp=.8r/_)FhL&+Mik4L_CU.3WB,"E7UHY9QAlZPc/?9@h-R$KZTm1$?9Q1 %bSXdt<W]XAAPbdS;pcb.PZ_rI<30ZuZ-1(D$%4!T'J$8L2?8'*1V%.Oc)&Jj@L)JTMm%^QBTOR?NfX;$eAOm@oG,rNIlDt`0Ei!( %+:)IU7BT^@*R\L*($MWtQ_#`.T-g3>3scsGIPI^qcp5@+*PFT<,n?sY"YjOE.FDpe#K<hie2dMDi+/As#r@)dDBrAc29dRJ06OQ4 %^E#Ql&f-!(SO#*tW)kVfLoLkR!G]9b9>:-'GdLpt6kKdFCPXLh0fFkDi?Q]JU)&YRPc:5"p:/7@`X*O#/Q$'L>/f%M]JUo[1HGk^ %"k/;TMF)k*-V$mCf+k@&WlYhM`Gf_L'6n"CK2\YW'[-tdN1h@C%Ua84W%Fbo/OcIN7kL;XVN>CT&p(GG/mS(XqYQWsoi)-gQbU<n %`#]Rj_Y$MIk/`onEmG\^Z+R4AU+e?jL<8p_lHoahP5nIip[^GL%Ch;D(m6FL,_;M3r8!c;NFi7>jFKjV%7/AB"05rTPe%Q/aCO9# %O"1/RXZ51=bR1_%@Hrn.=OL-8gOV2'V'iNF.r^1"FFB6LUTOj,<u)_^eFcZ*UQ..A$%o,5c0-]p\PW_"`/;uKmm(qYMH5kbgR`qE %UCa?73]>3c+n!>j6+%'`YLXU9G9$-5>p&/"VkE\*T1nJS79Gd@\(3=ncrkb-.4.fb$KQY?Q],-]%R5i7#`W1k(=$J?QALQl1VBdi %o*"ZX,(EYGGuTULN$c`Y9RO5nQB#^j=BE+sHD`e+c#-Fa#9WuVbsB;m[W5SI2rQ?TaXV(O)3*P\Jg<q>6N.a0<##:pAgY'XF]bc= %-<!ce"ao:c.l\o^I_p3>@X8IZpG*Ir`.pPJYsUDC3*_nt]2:;],1JS?jPic<>\EkNAau#.HJti$[CfOI28_56;#)V$?c&:tMW1`X %LL]F3#6<&\-%JF`Y^c.uDGFO7&o=]W9$.I^B6Jm0]%._0'('6@6n3o0/+6?8(/p-O6JV]TcV=lh7)5:6@SY`_DUJM7Cj$G6`/giD %274%MG63o"C0S[6;[-:neL=)+SihPS8lEX6FhO[8.M/@WSG\>il@E-?.&)r3o;\R+kSWP%?#'"A[3Ii@.b'e\UQRuarpTn"T]MCA %+3:fejMje=R@:<mUEdqMaK_)3D*^chMp7QFd'-Y27f[a4JuaPXS1eFaO5@@tN%K<D*;cQ^d=?0c4!:V=-uMHKAURokhH.0BQ6',= %IN\!1!M%Npdm=o9@J0t/(c58'>$P3#k2:'Z6p7%I,F.IG#WpVQ3aN0Ki]=qoKGAE3L#C#t<4TpY#cD:Rb(Kb]Ud^9<6DfX67>5@) %G`?.`Ct[;pYp*%]?/?Gb?Z[q;`d/=2U.D4RXo0H5O%2O@LSjf)++\U-m`u><i13eToFh@6X_PE_FpY-[N^6VRZ^aR'JQ)^`7L$g0 %;DA`)@`X/lO0LW3q53-pN.he!8s!N_X@Sk]%a^FaP!9d&FsL$bGqM'a;kJa(Cn+u>&mCruQWerFh8"o"ZX]*e-=Ri[#*>E)dO,b8 %'bMoTR0G5TV&8JJdfeqajD[]I<^dB`WWm3,J%gYr;Ad[4e9cm:NKa/qO2<2YZ<EFq5.=V`q5fUGW8gS57<m)L2Qg$ugpEqTY,PX> %N\8UVfI>>?<?mNBFF_>mclE+^:+iL.-=h"uZ9fqX]po+V':Oi`==eq=pn8=>S<kXaMS?"Jo\:MTph0\#S=bb!,"6n_DAR2(RU?7B %\Hr!:a3&D=#?5J84g!ifB\I3F7-i2opf-LR6:h08RhMGsg'QifTU$27@Nm)`ISSPYN[k4_.A=FDgX(9PhMdi>SR)Y$(="1GMA2nr %(n_&IIBA73Ggr75A-1WSWFR;ioNJ%%J0#gY(d=B]-/j@u>37[UrFJ?b=.B'I,VWmH(0222bI=bXROIC9ECE)=Q#i/rJs@(4fueRC %-S)[q/7SQ(Vc?q1;97`+W_V(];L1l<BiJq,oX?=$Pd2,VBGgeCdasZWV+n]QNH8BWqHbT#3Qfp;)NR?XR>p/MW?B"5?suZl,[tk5 %0A^lB2b%r4@g9r;di'g(_!3U2(fkIP]cr<f3nSW.^@&#P##PE7GZEd(3$r0WCG:TeL;(N@>hjJ)HD8A3NNjqJU![g_B&[ng^`[.: %9hdHKO3:Dnf1l9U0d[6u:u]`!&8tF,4spcmbrVp;?'g48Q:2s0_'2jW)Bs*&5Wam+!L);#7M;K7U#r^V8-V9Y"hBVZ_^2[;Ns"e4 %k]_<]`+Ju:>a6tIb`r6ig@1FQSJ!ZTb`F_UB8U0,,IiSA;44R/ajoTQnJQ\@>k+J8(+_&+-GJ>S<h;W>AUlD!MAUG=i(%=cM*EI% %=XY>[g-8Opo95IDaT)K0FlGiG(*$D[*$m0o)rp10-8k`_+dMO(PZ]8SK8S.48jN\iLn@q_*#)OU0"G`f%B;\P6t<4AG0ECTf<PX* %,.up`'-bKE?'.+u2-uWWPOAfJMj68\Zj7kk<lSFPf8pEf!J./kBitTZ/XES*qcTlD8>t'0,n:V4"a`+_>s'*]g)Y-k<.chY.U'pI %l'ma>/6]Y@`ndWFp&[C[*1Mba1V9UVg8t,n/!D%#J:&F6]%M%;[-]^*6C\oj>#&r'`Jklgp'&iZ8u=O:)-Fa)'jhN3LJO_@]#:AS %8T>[0X/t``T.6Xmj]"k6W$er0)=Kn%+1_KCWCNZS\-m.ks6=%N&lkmu=5noJIEU]>Ek5+hAM4^9K;Be2?SVN$BK3=0SC1@_cF!QJ %UICmmE#5AC5R/d@Qn6(bS<49j\gThciA-9i$!6,'%lC)QMO2hcCcKs4`?re(+^%#E',,?tZ:A*cl54iE$nH@8X2p!/""_Ha=BcN` %Qffj'^D"ntl1%6`9G]Ys>q%frCPu3D!peHMYVYH.)==b@&UAn=L^.;'g<:L'Hep#9Hl/iVXP4U&*Gp#$C*\8n$Ho\bjdo3?]%g]! %%Tp]gY[t(m&AW(ujCMdE0L%EJ=JASYf:@r)f5qe8W3;l3p8-?b>'.*L=*9KO7BXH8T?r1VH\>.LJ]:6ZH#g(=#H&`XUT;i[Pg%.X %!.nOd!&1s9FuE>QB*#,FXna9?qMK];h$&0lI;TJ1Q$kEoBiBU&PeI`0'gt1l+,QtqfuAmOh%?`('Fh(IiJ4eXW[:m!3@k!uJZZSn %jW@;/AGNMPToSl9Jr<YL7mf?-SRY'i4'N@6a%g+4Z8DY.8a+$Ra[/.H,ZE!X+LW^Y6>:iS\k#J0!uAsn,ufk9g?;ge3HN*^O"33A %X:0dQph\OO(=EU"d54oE/;"oee9MQT3C[Db69&Ko-3so_3FqqaJrt7Bd"]t`j;2cVCLp?a"=$=O/\F2>OCL)&TO5me4C[$2>u[sa %#UF1T)rE<[Z!#h&Z@&H=ZZn"p+nC-)W=t,G2UWkO7?%-eTsf$m6:J2a`=(TtInO*VabDbK>1Q3n>>de,c^`tpN<J9TA'#c=haR]a %$ru439\%4M;"TWH@PLJ!8<XE[*0i^_.mj;hF`ju0AH8c*-D(S^q'Hh+m*g'Q&TS%h*b$B;7=D<s1![(>XB!d77;@(i.'e&'Jcu!\ %bUVe!2,`PXia;kuJ8:EdFSdoNYXQJI=g?]-s)>ro>I=W9mD]BIbZ/HN6-FE$b2'L]+0_<fmHdi2quQ,3e^@gt#p/RX<dfs-YN,]p %B#WG+onjf0TN6KC#J@?B&$CM3Nm8I54#B\q3_2)6iiT@3C/\,X!'Bo=<)AH^+&E/,_@U-OXdto]#OL_Qr4oSNG/CGO!Y:Y-X!Yid %0sYQ'XI;-7`m=gBe#JP<Ar]#^\uhHIWs7Mb`oF(mq;4);=,l2E%-TQQHdsNo^jodsoiI]9LE)+MB4K1:=])^?WomANrd`F@Eo'D> %c3O"8eRE*%BQEddI-=R[HdsoZn`%Tg&MuniID0%*aPB%<+#pZ0:\[q*@+B.>^rBJ47inm=engjVHYD5UHGI[,[E)Bc[g294<L[sX %H<dp9f8S.#lZLIr?+#I>/E[8>lrAskeTQG`c<p5N<kX927jFdq*qqtJ*XmJ.+,/^-D3r`U,ArKseoK11X3sXGY*CeubR3H-[dFnc %:,R0Q_.K&aJHcJNip'GSHajk*O+7Fcf5T.B27rtr4s9SUA+F<:TZ;Mf,[]&%7IgnI1kN><YZjYa:FkWgd=eeKB4Jc8&SZ;5HjgYi %>(2EE*0^4[$CW*nN'8*N=:#epYm(tb()p:)Y,K<rm_WK8DH]Fp`CgOo6/RA%l]X*7E9fV1G#XZ[k%,QuhGljI3;+)h7Y!H`PnWXZ %Pd8^5Jqjd5<Ms6TI9:JH-A<oFP'OPs`C"s,&ek>WW<t#:6I0Wq<>#S1mm\j$pc3&<7m_09:_#ol:Xj.f.8i$,_]TOD&bP$%)0AEh %=HY.sL$ZVUX,Xo7m>9mVKpmX[>b+b9hBdlg-pf3reG)rm$dJ\"OqGhWmN[;;4`Zn-[%E:Z\@\PU"a"'Yn3tGqTN/CJ$L!OETI'5p %BRn/8N^.GN1=QHs8^L05kK$])TFE)aX0]*^A^g/cmA9k#WA!I$5Oi>aNuhkPoQ0IFAHHnlSOu25`eA\+Jma:Id:sVW#XZ)S86a:2 %X5%5OAP.>BV4qJ#F0g'R>g^&5)Dre.-D2#ri-V7eXJ)+'2.Ve%b@J*d/L?\lWVPG1@O+!%RUSWDTIp=#6\:mHY%Zhrleb@,7oXg6 %%O`rT'>[<&XM-#2D1enkV(!cDmU]A[D!#pQb",0<Xs5A>[8g2*=K(1V-!0NUa+]p!U_FA;L5BLqThN^4,F.0C`Z'8Q`:r^L2#oX< %']9(nE^d%3/)W9ZrI@dqhuHkB.TVUqeK\c#YZa9DedoU)drPCp>sEua4K_bHFslUE`I^W.T`?QFR*7I%]I$_dDi?"iH[pF1Tm]L! %iS,p-M!7/QYFlKVE4U718'`84knGU74$]I`Th[I%Ubei?/TnX',!c!JdZuEmd_Q03bNd)NgO]rPfCc8ZWWXA>(_8$]<Ah.\Z<#N1 %\fuMeBs-^P2+@Fnd\^&o;WCeJU5ZgLm/#FP<h[;RVWs-Ho7VHR!a,M0dD[3SRZ1kYk3PFD9=9Ig1C_1&3Es=9'>bAt[a;&1Zu0<S %=CX_3q12r9;K"H^\CqN#Au2O$,L]1[4#,l3Eo(K)1m($T;N5+U?COn8"q"-51o@#6S/#or(5U3"$1M`cY7XhkVMn!BC*H]UX87C% %O<m<3W&@\?I]beNms2,akr0%)?f=CUPLt-g_18@-/A)?=C,635as(F^S,>NJNFgIC"@=>'_ffZ1+:E:_Pm2:87eN"U&[tkq>5^`= %XI:kZCYN/n@+H-33Et"Y9S7#4!&fBYmq<dmrQAY?<N-'FJ.`_q49IWLUo#mXN[BWH8JmBocl7XEH7%#gjfO)!`Z\X#nUV7F^%dj= %%CMItN)2GgaD+7cG/;+BMu6I)Kj_@R,E7RhF\IA*LKB4B\CNr!U80;^o937X]N'l/eTQ>Uc<R\I=0:'Z/DX=,GhmgT2ml_hnhp%; %5tc^^.p2Hd*qD0hrK;$tA_k`Gb"gd2L_^',`PS9R7CKVQL(7.3CjV9N`q+`b\[$<!=QZYg@Vt^!YgM#\jm)PFhs.7W@9nFHTPRXD %e#Eb%5i#F*%&n=;i7(\;`)$k$7[mF&K62A#3Y$`iPsTR8Bo)jXH_Z0sd(-;_b5gfkC2>7#mOe@NBToo]\sLC'd+T%=]'6bo5\::, %DbN,)d1cE-%@h*#\L1N6/tu6BD&hi8Q`M+'ieU7QqPB:Xj'&gcU@VTj1_TXI\,mJ3a3co[.T?h$42aYF8(,13mY1J>R2-BL$o8&s %_5RTD%T>bqSqrS`1g"#PWjJuf7I(@MkI]U-/HAALOSVMiL`kpTKYSd@-X>RYc@`Fl][8$-Zl145O,D:a?3$t;*_`TVm6HmS'+M%W %\n4YRC:*`gV<UX*)M-+M@bW'uZ8u0,(`gH`%F3,!M>(+X.Q<WLf.^30-mY;@\/oTD_sJos@J5>JKgOrKBTc>_n0hG@3RZ<hX`+eg %^9A!SjVuaWRU@[ML4@)>Yh")cd@?)?^Sk`-jcMug;7BAFZ^@o,h,APuWDGu?7Qgg*0PKFLd/JWmU,B$;)4Rfu*@M,d.taMe8#ITe %>E(0Y7i\/.&%&rsVQ>YRj*YV66gP0.#K9gd)SJ^N#,),]CTAV5!(IPi,N^5U:o7&pPi`B'op+T0]9.)sk#Pq>EhL)$T3KbN(rss1 %Q?CaoJtCLc)8!2Qi<^?_.+a'GLM00LQSa[mM0/tRGJSUKm/_//12,(785lp*.A>FZ#8&1?=5b?H_5#UoFmT>-:MbR2/pd"WAtYYD %ncj]d2[&pXD'0bth)rC7#<[TA)cT"t[!X^b!_+G1I%7G(MWTk;U4U[c-YbJ9#Himb'j9'CLt.'4\G4ueDtfE5,?g,)h2e'\dRE]f %7#9t\BhCJYmt:5ZCW;%?Ch'XN)*)8N)lO>Rbn>6Go/]qe.hgpXF_.C7RmLlh,.%Z7?E)KbO0ZJB2aGo3@Up?;acm8fSMbJ6h6^KE %_Uf4iT:iEtrq?bHeLPbS#<Z2a%1*33W(#5bhVFLe?#q<q\"Zj)M-s\[[K)1_Zh.:rj/s:pKH_(E)2sr>U0`.1`t[Fp!/pNMf5f=2 %']V+$D;jiX,#i8l;$XSD<3hc<@+7Zs@q/9o?DKNgSdEmI"Se'W3_FSf>/f1V1l5#;`#O)U\4R,K.M5\5$>YV*F9Gb]D#G@9d6P") %P[Wl]`QOlr&E>q/\lOKt[5^kip*Ngn>!WE6BEqBC!APC:NB)LLC*uJoMUoPBE[<,MZ(B2Wc>?mS(=`s[<q>dTg-(ET%s>hmL/oa\ %-ifL"1l'S'1-]2pV?UL#)RiimZ$.0m`#Q^9e,pFM"tOal_JpJqKjnT=YC.1,kg00[?=<\^4C\;W0V.>RR-rl.`)jk*>BZtgmS.D3 %^>^PP\(=iVDWCUU(]2cMhAYJ)Ib+,:qMcRCTV-<s43;nXX#LfeMfZle:JH5LE'ekB(5PdQ/R2'\=-LX(7Rh=PP)8K[J[\0[B[hE! %-;:_28#)Iq%YI*Sa9!L$=iG/R##n`K]d+pY5a>>CA]GseGtX%QP<oi,9dE_K!ZRJH!X<J5B[*3bFs?$m\b^Zfjc*/eT%A(d4p1Yo %/.SXcbsYM)J'LWU<#uJoaA1)2Wupof-qs8-B'k,(03eTD+.GG,1ubrB<P]Oq?QpuH:_[@"bRQ2ZSPgI/L>7V^WB_p$V2ic%2\a]F %;S<PF?_us3Ua5Lk:JK*uOZf]e7k:a&,/C;H#'ajn,-k+FD-uZf2*`1IjSWFUalZs4^9T[>ft1L!=;3(()(3(-+MMq?&SaVdk"f_N %q)l"&NN^Lg;[mQFI_,?Q#)./5kV`PZ9V&:^\E-!h4?Z"Lm-iDA-1f@EV2;fV5!g;2Vt>>5M%cKcW$jNoY$H>=>OV(+L?c?77je5C %fBfOR$,`\"5%8M<*1Lk\o-&mRViLI]TGr,P4Ot_*nA];o^>Hq.gj0IXde@jiZMU[uik]AkV;?2j-Vu3X88Z'$9NA%9AQ3*Qd/e8Z %I8\`GP%Ka=Smj5(Rd%P(V8?&b!DtGf=NnFSmL"a8imnOX[JC0,(cQ`Rg3PAl'M)jU2#C@1_kcT,7[NLV@Nu;u;uo;8-0TZah_!>h %!bFD)>#6XD>/dHJ*6nkEr9<@QTMF--!/9R)]dM&V!l\Ece9*g*F`c][1WWFp\^e^0)aC6-N]ar$7unil/`.N#?9M$-\1aAZIDBsp %CXoo(ob=a"kI*M[rjC5"eOlgoL'@lN#*<$C'&2bDN/iM]&<TeMWuj_=DGO^$V?%<iIL40GONPd$UR[H7WY..'&s^LtYYj4jHsfbN %:Y.MB!>)c`VmJ;]AtW47!*n80S?js8-jF1Yk]*<O:E2*Qn5KWmc2b0J)V?@DMP1O@-\:!J"G"D&AO+7e\.K:10Lr?\ph[?j\?\fq %1;$,T/L&53DBDY[i8?"%&C&%9UhDo1g(*D83(KJX,a(;J/T""LMi%eY^nFkGlDS2ia9"0L"#8^^a)+p>T2FI>qemO@*g$OU\5EO( %U6_lF`aCk?C+0F;m"Fo\blniB%T#oa1%JimALH$b+Z`h&_E.@#FOgPR]I@]%ZO"/H33\,WfjA%&I"N3T-(neiaW`7q<5n-iE+9if %Y>Fs.RmsUJ>mK:?58[Im@cCS>`_\9\J50R%atH!`)M1B8@V!E7-h00\*5*U\;3Z[b'k?U^o)rDIHA(2&f[:3Ql>b$a#eRp,*OYbp %pRI?8]t&cS"KPgZDC0/6)Smh%9JrYW<?-Y?oY&>1JDNA'l555#s,F1!6jf]NnsnuO!<6UAX9QUX(fCKu<[,J>"ihb^K+9V,5`QX( %HF\^.'Cdo0\h^R4IId4OT^&0W"`Z$bH*Qt]V>NVT^Y$2DQk;M!MuE9k7\dotm1)iZ`^/20%oZ%ZfhYG)dI47lT<&iqMP2Nck%_On %"Iu@V,=JX6@e3[aAp0WA`Otc2%;U8WaEHmHE-@ZU.9(WI1eK4EiC]K=_%TRboSsh,^(T+[Q=-``\>MCUno0&Hn(,!`k#4F#1:PJf %7W-"TET.%&)/U"?91=X\\W-Ko9<=PrEiE)/OA,>f1t0PJhfpeHnO*M1&t($"\P$]`b#V1,Qd,7sN+AURiMK6le>>!?M,qBmRM05U %kSME?NcqOum]$ar2YnAMJ*W:1V#p.]C3sRSnj99;.&BY'DJLHG*hS\Ab.(gG>c)j&5[+K<9<O"H9(Z\IZ6Z/>1QeR]V&<R=0G*U& %TIk<.ctH[mSuP_;;N=e9<MuRTbV\3[`8$UM<5h9-HJFM^/L1Uim^0dJH7aA_,-t[e<o<ZH&/tMD>[[^QSW]7D(k5M4WaZEP;b7Sl %8P0W;_@hACFHW@Ob1r$/j(7>;BIFN\gTb?@d13mM+(AWnRsVK,qmU47q:)[42LYsr$55s=RT'i%MpoqY:kFr>0h3=t2cN#;WD?,G %\#cNidHrcM\gAe!:eiu?U\5'1'mWM9ASTo"UJ;Y-6Jc^VOhct1eVb!9>-'QJ\!YPS"_cG$-RLQ6H/NE_lTnZC]<Q&[K2!gmL:M'! %\E>We<C`OId2-RpTqPEU(U]9b')Vg[/]&JTaO_iD?V$cqEH"O+iDL@W_rK4I3qJ`s`Mfn,6-^rJ,cSRCf1SQ`U^\loUTC@%;-OBu %&J]4\jR#o2fQ)d;\XJ(3-^s4-kHGB)&M^kQ%E1KP!P"P`N/D3%Z"U_M5S7`o0+$/tR"S1!L%j(8`)r^>3loOKZ,,&H'WSU9@#2eh %VtlLF'=OdmXEW,M65<>Dk%i==p;#i+3OR"[EK<Ddd4e@;Q.:H?(TUYV+.hsY64j4F`n<%!](&m6DHAV.NA`<+>O3C7Q&P<e;W4f' %jbI$n4:RF`[X(mLBToXsW_0n,@T]<'1'bce9'"Z*G9iNg6Hm-PAH/\*bus>1[0&,4\(/"RpMnQ"B0_gNT[eh[*dGDZ("KC(=LUsW %g+rsYZR'Es62LaBM9irhfS!0bS<QJ<YY>SNg*0MjML.T+/3b$BEY:Rd%4sgc5b4oaB"h=^nc?g,g-*/Aa7fQZV.s]'+]kjcXKtr> %j^="XNW#m^!3".ZKm5H-*['K_o!C]JRlVO%k/We<[/Fi*(AXPFTe?**/MY:i0Q1Wg#K8gHl2'$sT$3qK4*Hp2V!iV&N%Q<2.MZpB %>Ks!7o8+)+mIb(<!43%>YV%:JJKSgPPqa3q.7aec55I2BopS+uIKJ=^`8n#_MjcZX.b=S4`32a_iDUIAp'TdmY(\<Z]Y\H?A._B& %GF[r7[18Q7Da_2]Fao^<1uP9o>Esr&$&_oZ2aof`T*TgI\h215nd$udm0,,(A8ccVgTDh>V>*I*U@M5d;+mTPUN3.o4+_/#=AgE1 %^bNfn[2fSVW2lrWX>HhSa!!o&`l4u]<lk2[(fu.[H+k/Q\p;#c",`_RP]7)`iAPe,/BDBsL(Vgg46V&/7ak73bNb'>"jNiA*PP%1 %>7ujT9GR!Ljd(W4X]S'-dI!2XGkX)Z6JWG/rYcuLaAJs94+7<%JG4E-Lp.Dd3@h[4:ru%:[hW?m5Y7<5AL9bE[4^PG%Gi":c1WiZ %=@2ORnHs:0*F.AbWt2'6F6B&IItcI2:nGi)YDG_;pC@:SjcpFd>JFc/2,8iIC?]qN*0gP`ag)D<0F:*HE_rgjje<7!1.]#9)1YC4 %OFnHY8JB1ATH(cce%qDLUS,KM2]n`.;oV`NWtHNpW%J:#$aLW7BIX[cPoT#gDtMR(!Z?tA.!RRe@\2qZ19d?>@Je%B$K/'!,u5I8 %1m$K(jpERWi^Jsq3?EBS):VNE2_DrrlnPs2UluA'=c,J=.g/m$@K$6.#i&Q5W`]#;L(Fdl)aaN`DfgLDP)?$6D;%$C[nQ,Ye`Of_ %[=[8lGoo,E"7;naSB]j/p)7-Z2a=E#lkCfm&%MIXI?:(s7n3CEp;gW6#\K?=9RYqKn`cp\WYu`d\o#R!Q&p-<1je84/V!V'IC1=@ %%Z+#P_Q;?rI.bHCr:q/D]Y448jn[`oc+C=:+("p;,5T=n8Wd$Q:To6;e_TWS]>)#Ta'\f1QfmNRY5``fG=L3`e#WMZ>l!LP%t"^M %V_X/kJ#T&Pn4f.?QY3#1Q)*t"?<^frf/A>&Tn=4teI`6\0.4%TW\t)lA]^Bq1*gmd;K,atSCR1I;qk4(/>Bl24@_gPTlL\u<nijZ %l.2r`o!h]XhCN4(2;_^Wfa[_<,*Ie"g]<N>=!E^6.UM[D^t?4Q/]E?`D1K/;g#::GYHNgER@')OU'<N%+VijL(Zlo9),IaF;eq>\ %FW8^KY3;]+%]:9]=d4d6&Q+].SUEtSg>tSU!l*bb=Oe+`6Ed[\,cHACTPJcinc"E91a.FN,olDD8'>_kBGhG/oR?PRY0DcOKb!4\ %Sb*h8E!Mms>KAR!?n!MoUpVb<9<hgNRcL=MDOR#e$n-CNo_Q(ORs0`%f+'4I(p,A5\Z2KK'l"eDP+C15JMK_)h<WGm,\RF%8Z6@M %1c@o/nc5*IS`f8p:0C#YWP,\@(qqO)qP@1c9i=l>Lc-CSE<,2b;X[<-02\l-aq(GOB0iY#7?iUgb,?U0%d#g](eEk8UK#rIo1lRp %.r%Ca[d)dIAkLWO9r#1VjsdiT]"iV:Q4RaCXiR5sJ/+Jd&@']ebMXlmpeBK:&S2$"E46r9HRu6*aQ7l7)$L2`84n3O+^^9(a8%Bd %#umi$7l_/aFKpe3/4'(74&=JnG3)1GE^Gfgq.=JsWqIL`!CVO6>]+rX'lK[4ceQ`.@f]NS=+9h,\$G[bT&'R\bY@c;DQK>(fV\Z? %]PkA*'@9I;3C&biI\B#hL6]DR6m$]sa9>OgT[,&S'<QFGHUQ3o<$^El]68L(!C9Bb;E>2eq?8<8IaL`n`$700s,iBKZr]t3(#XP* %Bo8))h1Xk'ankDS@m^pCa<]42XBr+'$CN$`["3ctCN]nmHc8rmXV3+q)[KJ;di8$.e%DZhgeDj7iH,F#;QRdtTPLrYU0@,DhM+Jc %,]SmP[*i$;d$g\\N.AZVe<D_dR4nV=kT$#+P)3l"Bbc_(dUj]1QGZtnO5AX5nDVP@dP7k'OY0&kD=hllWIr1:a%tsY(b@8Z_P35l %Ek^H/<&W9qOn7$2:-POVZjX?(7f<?_-DDQ#=D.^4&7/.l.dZGZ,.4%TDQC3]XHO9*5"-ngE@AUH-!g;8XI.7^qs!HPng(QX[N!T] %NhS9H?jDNNd;c>I];hs05Li.CG$Zp1s89KuGCN`7\6F\J3>""C2"P(%n[n8RDnM:KqWcu<of&4=b:m<$_Z%&=m2,fmgXG'9]Y0t& %DTqpm^\IBM5Q:WXlJ;#4-d/l70>IL*GO_9e^-),VftAo]^V.:+H[ETT(1-t!hqm1K^S?;7rUAVHrS9]LIop%$s*f0;^'O7XjpV34 %G4e/(r8G[L,WCad>:/kBcg#5:_n4`sjP,U9^O1C;oAed"]mcjI0AkW7]CR93ePH04]0FX!GCGjm5JqQtI/SOIcL64)oASN[ASSuk %q8dBm@su8lJ%>4>rQYq`ER0h5l7`2)cbI-hmb>'4qd#iao'N5g+*]-Dk'ueQj*adgG9:_;rc!#MmegPG[ii0JpkeN&:V@bb97,:R %q>0IV`G]WIrq"%u&p?JHmbRQs:\aA?X1QQeo8dS)nW`M<l9AQ\?0o9i2stt^-OdUNg:ImI^H]IpqqE?eCqf#Q+,mY`Y0V9<nc$GV %mO(%JhaIW10QmC?;d\.*dii]#VcfSgpgem8]g)#lq<I+[mJ4`9hO]/imH+/hLV^Tn^WPZMB38^eS)8IRS*qtIcgG[gGCH-'_d;f& %bBG%*+WI%%4QESiF*%<9c25\r>rKsR0`e`#55O$Kq";TbYJ*,FHi)e?*PK.][s.K<*p`3ice7(Mk4WUGH`qmBF8>fhq0P1bnOIeA %5Ma#DpZ9fY41]c/GOOb`*SnETfA/Lp0?2sD0@8[)`%rEg_tTPk[bi^piWoGIiboW7?[[:pp?)7u481%U!5!q<`=2P<lGH+%p7K.Q %gfMh[rS?48?i9:hYqJ1c4nDCoAeY+.fn]=j0@/MR8j;1,f[>g`Du77mDSGr/rPdTr53EsYG5&o?m;ne(]0FC)<o;XRSoNNbT%D`u %D>5We.1%;FIWKXQqp4/L.rNRkqY>oIh*[$Foj/`6ql\B(Is5o3q[Xdr:ktspG/j6gs)@k[g%iTgk@]iYGT/S)^%\o*_^uu)_q!H- %S""Wjn'9eWrnY#$I"n0LA"W=!rr1`u]8KI0b&QGbq'M$?\bt?f0Bp5pIOkHk*8\#Obd6Y[]]LJ(i_^a7$@!m:j:=29n*Wq.[.G@. %aG[6DX.H>2EBs6E,>Zs?2],k5)W?k]4cdl8m.\Xa[++)FOsKq!$smIVna,u?mb@&c]A9+COAs,mp%Q2$Kr`D/5Fc#.bYC>aT5SAO %kc_UJTt`e3#MT,BipI<iTA`(Z2M;&+O[kub`:*AOHmJ\N5=dj-Zh&-`ji7Vo++<98dtdkg`U."bkY3+[&bO]XkTt\9T5Od$aO$gh %DB8gNg$]L%MhDN7(C(i#4$V)@,DJCc,*=fC2cmc*]t!j@S[4b<&K0\;mp(9hHhR1(_sST`QTom8j&+]T7sj=a1H`_d7'4/9]K4df %7W:oWV4BiuTnR-/HZT)?[l7AIJ,/&R>a#u&eoi^-fQ4HD<+^K\b[,*'gHd<qY9/PUhrCj=L_?oihYOj6P!d@&S/`-Mcb7Y3C<cb0 %4544kYJ584`-\Z&h!PC;O[nB(B7+#,Kq5KrLW6*n]=p6]oCF)-'`PU`FSj=lBCF\_>^^a7F`IBt:M9REV[j(%S2'liLYTW6aWL'u %0U#'G5-Bk(RHc06hYDGWG/aIFmemCCmCp:Em2YuqjnnMLcH\)G0AbO`p?]Bn3fL5fQD&Is9HJk2oJiGRIF_l>lf3EF@QT('6OE4S %Q(iWuC?pq0j,^f93WEf;NrkY4,?47!k4Z8\+,?TZ^>@PdgO&=l]:Rc$mBH1@3>CkbHR873&?kHDmec-Dpn2OXYHAq!J%Br\07A!= %mc&%qo^q.qScAEGmHum^\Dc\i@37LfV?FoZi8\k_j25ptl8pM`]:7X$gRDi#OEWYPG2>DqeC!X#a&D9P1X3Bk4c\Ldqm.Af??D*C %^H9&Ue6*pG5P]BV?Ee@Xo4NFIp@@YBDia[,G/Me\!:G5^:!\TeruF>@Xq/'gfD_B*hq['nms\s?`D>s8m(CNUVLF62kG[J,B6$Sh %hHaH[4W?9FU%6R$+2KZ.jq$kY8Ii]]3b_)<bd4of0,"b8raNYsO3kglY/$&l,e)erLPCQ:SS.B;i%VcYN'g6**oSfRhrP-!H('ND %fuQ5`36_2VJ]#,?bMj,bhVQ.YG$eU3Fq,PO0IpMl\br3=",D/T52LK8p@@/rrWn9>"FYLn@c/r$cu])e*KG*+T,A-FfD2&V61[3* %Gs$8n4ju>P7+T.D+<$;JiFi#p59C3P!ITQmDZ\8Wj+gFapre0ao<4QWjj0!G@dR^[*R58)H\gcK=GpK2;>q4As#cW+I1/os;5=*" %7Ot+;7bdatNuIDad>f,^cSaFkgb+2RM0;j3ql\9uBV?L?fhnC/U<ei(g/4I_p"<37*PO_,P<+2B*0T<8WO89=r\M^U*Oj9GgSTGF %gLfW(5Alt:I+r3+.dr=VP3;f(,61Wj*D^QhI9qnprc%]-MlT'ISc/'@a-G5i0[4fgEIIF5(5'NaH?oN2Z+]N#7#/_Ricf#<fRL2n %QctS4q<mXh2j`tcGL%kr?@6s:G5(;mI'r4!-\&iT#E6<M"6+jad1eT_!goUN1ZbT9r[\"[E3FXqrp=#Ds*VBTH26>NQbRe<1-tcK %'?'6q%JBC(3cjaM5lV"2?[U)\3>ARo0jsN<eA7aFSWD%a-d'.C7]pRr99jFu^Und+GTFR!n.?CY\4+SZn;IUJ&3f3fm(6^d]=klS %pA3cdp\f/X$K@1KcloBD(WTgjo)nr6pWrK`kP.Z]5KH>;H1Q[,kA\CaIZTUQo)'VZY92gMg%Y;.d\3;,LQg`m,e\CQ!.;unNp5V7 %3r/cMIBMhqa"a,+e&cs.:4BaU6]UEl@ljFQ:-PP=O6P`O-CrBC-7+n/qsmU]k:q\'7ld>S$@/7.c_3a#O"'/g<<mFq^\R$0mN"Rd %>pI"XN;+V^c(Sg'+"j_!DSG$$WNIlRo'P9(pF#.BVn2KKh7mfVP:Q2E^3UIqrl.+uqe3QkhqYkKr1\DI0?pWrT&+eLq8E,Kqp",F %4mqoYhK01;*J85ob;Oc?%==.%[q!eP(j(*kXgl!nFc=!#=6**BlS&9YHZATDbJbR7pi94cQ[cRAno'jR<u6'fhHmkno&fZ4h-Y>3 %\]9fec[8X"SYMrms)iVciU.q-#3X6bl^rPBQCXZ4ibJ:M7tl>f4.\%\oBT%m:/4AZ4r5F*fA\3LWjY*a-3'.f2"/2k3+$LBgS_j( %5IlXBOa,ak#h1u=YQ*\)Mk-J8=7N&\2;:(Xo/G1@rla36><L&(Gfk$d0lD&kgDo63a10AKDKCck*9/rt\BRgB:+/^ZE>oAHE;8Q4 %\%10f-h^/\rtg6V3!Q(:6)[SJ_cQ+@*FKTH'-]C4*fPEe1`A$K9)^:"L<lZf%Zs-=7CG."fd%Js"gRL/C:Ljfqnq+Ka24$qQVZ8) %i*amA1Nn804m1,CSHS#pST-bRIqlZ>4>ri'f_d#hk>72a,Oa-rSt/C.WT2ZW#\W>ZV"Yt5o8]>>O.!d>rV5>m:46He9OE3pp@dYG %cb%<FYp02jCrr69_i>K-7qhOEk5b;>S+d_CoDrh_hEFO^*6M%1\IIiYNuWU)<:B:&r?+>krZFEfj7`L9YJ&9"!Vl;8p(BN>IJG?g %P=[le%rud:p<GNWnbF8M?';fMr#_Nhi:>:_r$:0+HlTFN4Us)oqI`F45L]@nD]aPLe#T,=M&s"[G.3^-_bg1\K,U@>eatSpE=f9T %3<hA7eeC:P2%F=J[?hNUf_n*r6&iQ>G)nqKIFR>uTZ/^bZ*-HQcce8Y4*q)anKg5.hqXfohjn'OmcJP6nA!bkj#=t24n3Ta5L/*A %j/UQ!T+@+We/5aJ4-Rm9IJ3["2n'V'q;L>hq<iFf]t9m6!T2^\Fa&+TrfL%:lp]CRJ%E:=7#C`Z4\m/"h&5DNm_e_d(X;N[7m,LQ %b8r0mT<Wue?VZ;"g!Sc?*PE`$,PQNI7ONC=]:0p%cZ0d@Bq(-i9b/3L8(si4qU$?m0HN>le*^i?2n(`t]:[;pn_R1\r@C705CL'? %qSUjhFq,s]p]qsccTT/jjiXJ;LH\Y,pG)>La&)*%*rh!3Jf\td&3]`CB0$Inf^@(,`/a4\Jn!@YJ,VtbpWH<1gs,QGMb-gVfBsIf %^H(Y:ps/Z%6OS_!QJ7%RpsIppPRheVpl5jA:V:>#%c>[m4$%aZL[XHr4d!XkZYT%C*PRkt967:\AdLGCI/E0umJI!G*oGB*4*l9E %O73('3dQ1GMoU&$?]<<t?_Ga>LhAaWTC4N#mHF61O4X,UhqYmCbO+!NBB2^-q&WPo^?7pH0<t]*94Y]ffpOoW?9D0ZqFaZl8,eMb %W>G9!^Z.jWqV5iPS#aN>PBPCSr:SUnq-Uma-)-mtcH\*3Ie`(r`.[%*rG]/kN*EK7qHD%^[*INP^&=mb3OH$SDeL:8csD%E>^C<P %g\%uCL;D&lo)<iHPkMfDf/&e7#8#2;(Oc&1[]FhYlX#_boZ0gL.#uXJh`dd9qaqgYTBpNQ9b2IJ[\o2a5OPS#Faj#iX*`lurI$M. %^Me#H]tZZ+=MN8:q7D.6P<\'P^o6uLDSJ1n^NePsgUud4!pI;!?4?:fO#qjSZi@VLrpYa9S6c0U%omf8:V+&>ro6klk37n=Za"t- %a\(Mk'>VqF)Hc.;$L1S$R00bg?BTU+$([3>-INs'85FTRm]2J'<W$M\C&>n_-u!qm;uXtt^Unc8nHhuODEKn*l"D[ic)&b?>l%(e %n,_69T3u0q]@lg3"6`M_PMZ>iG79l]Tm*.$:hR8(GMc_64G'[6OOV0XZQ+=q)Qk^]rc!&V0gkg,4Pu^SZ+o`+L&Uog+)(BRq$?B9 %r#g!O4k[T!jN@9ar*Fl8O+=(h#>)tBo4QTXa(+^$O3LI@Iu[%^o,O=5/*]8^3d6(84[1uO5B2]Rk5cWpLD,G,G%pk*D4q(,(-g[Z %%VR#u<%=UYfTZ9TVgIk]&!(#\j`[$ge"\q)%kV(+O<dKNB?O+5dn:[4@Xn;BgNU@1YKO':57TA.^o5%!VuOO*-^3onf_hZ'eKHPp %7Ruq4k4Z::J;9jR?D-8!/EQo(7uE@?fLepPoQ]A.qYc="a#J?!lkh*3qhmsjN.%tup3ltU9F0ORCUO,e3E!SBT'T6+QiQpni<Z(H %?1qPcbg3Y;Xlc;o#(H<t`(+>7GgcR*Hg*c/\[_U_jm>7M<;5K9hjo2/q_p]lJ7a&6F&IO\rSJ\5#2?ZNq5Cee]K?/R!GR`6\&r%/ %=74W%Z-N@A\B^[cSb^T#Sc.ia+=?IA:dOZEDU71Qs(7$=')T#l5K0SSG=1b/L."51dd.O>+nB;n@TOZ3+o5ae3VU^tX$-5)qsm?C %D6Y.eRZElP1]@*Dg->PR0E9;/5QAp=\(1b@7%#<MrnYi25:f/US^*(JIs(:JbBNPbI.=i;F:A/LYC="\qW@($J,JEqg".&/s7=.I %X-6VCm.t1ZbPBiA5CMKsrGq_s5JI0W_\`@5_t'>4?N09b?b"]:p>F+EpGt\aCL$kcQ@E.6ft[CL(B`I_+$V=VnUE-?pcj]#qcE%4 %DdWIXs.=Z2Q3R<J(FQWappsNK?FASelWcc*Fj8q<g;fpsP):fFd&'H)R!_[R9Zr[Gq=agA\Or2HqKj$E9:IH8STf&cf(-C(P?qe6 %^WrhKL!(]#fD,=\_X!MY-aA/,F)Q/;aNO%=8j`C?RTS3K(KZe!;I=n;%1c9ApEnqOfDe'^n%*:;Eh%tL6+t236\(E!8pS0Zi#h=V %#aSbN"sV,3@2K,ICiX(:kn\T6/bIdZ^PMY/F7$Z!;`oi^%n!cS=3&FRCTY7foo"V\_R'Vq(?/$ViqfPb9C*D3qQADsljYRXrE+>t %>_LbeeJ.>uDr.#F(,AoX+4f>WM'ZhD]IRj?_fC,`B3:eQiqfg`hGt\`YoYYd>`Wau[UhT\:*I&iYnVJ9Rb&He]3<GIeer/t\O%nr %q&rVl[][)V?/?a<X4X7;CiQ#ARIR`Wh(2PaVlc:W*>=+;hLH.&l!4c6'86?;Y#-%jkIV^V%G#mh.QbAQUs1*!&9OQ+Eu2BB*(c/d %Urh5?[X[20s$!RZHdCRs=bN9LC"0adF1lr"%.@YASaRKYA(Qa\<9rYHAglsbVfK*FF7!Y2CR<>sRW4=(\r"/(F)BaE'_U)\]YR;- %eueglg"VqHcY?+>;_W:5?*?@Flau3eDTHk7*Y>U8Z`O2JBjOQo/F./Nm]E,7:%\$/%g+iSFPMQ\6I'@jj1JWp=jjo[Ek,Gf=k;D( %2;MM8bSpYMr4(+[[!-:b]j1M=k*dgWZAI9(lIb^Q;.a1Z1!*X:eh_Z\CNFMF:h+21_U(PQ#HaSf&%#5I4U1KO9ob0oD.$-k.OA^k %]8+h!(2MAd/9<^\OmD:sFe:iW3D:`sd3G8j68@K2HmFH7PSb2IZ'SX4*MuN7:>?]b8J`kaMKe:Gh7>YQ.hr+QG,=qW'*h#S=<"LD %"?,#T]>^FS<S(Q\X_>9HYmijcCKJZ;\pjbT8C(nRRonG7*E]cqY#D`a'rNkrLK\.roT&C?CZJS6:%)_Df=UP:7@qur1)PGV_\TE_ %;jk*NLt[_]TF:nbXgdUulrHh>ZaM00C6,iBY]s^DZ!Q=2ETnNB]6r4$CP$];Dq4n4@:VAeHbCQP8sa%p<u)E&=#krs/jNOYQENBY %2KsRN(mhpi":e#\i&CrcfL=:0BBG<LqfE.LV/i*EpGRS>,L>`^P5RB+&I30+8gWK]Tj%!Vbo`8"n\;b7VPr5O:79+*ZY(F7H.=D> %<"-Fa!F(hQEoh"OC@U9qUTj"b=_@#2/QiOn-om%7AF0.qLf=+S?"-<LiaS"EAW[Bo,_o3T=fVs78,Z`FK>7+2a#TCYXXu'C_#(a? %G1kk+&Z>PNIDF3(+(-9Z>;H`I#Qo*+gDsE:;-mL^2A6'Z(=XZO>q]=]([Al5b$*8',"TeM*97Wkae/"C,Of\9.'m(rOq27Me90Ns %aja<q2nas3FW3Y_Z<S7S8r^Dh0hbf?*/oG9j:-L4$G;NiP",e(isBqm!/C]Wc]TYE^3O_i)6t<FV%Kk1*Hp2T&H/da-73Y3f=u?e %HE3B[N[#umSaED#C>C-u2dd"NeRFD/M8I1IP?_0g0'0[f-A5P)gSrJ"HE0n'^q']3RSPBL0-dX2d)NYgU-A<o&Sa-c:RHJ[at-/Q %_Elb\mp.d&F_SoHf)8pE-[Pq*Q+FXoL)Mn5gq2ntLcLKi>##?k'8/)7ob%1sDm8*1-G(MGG0hPN5?1""SBP9iE+qU@Fg&1'E7u84 %&"c3(`UL$u%_[$7=$<=2]%:,E[C9'f:<D>eg*2TSRHiDd;21($\b"a_o6!E*+s$T3',Z!G5o&cq3%!/mj02\<X,c%1P:31CDdPSp %U'T43oL=JC?7'6IKd&!4>fSOTD6o%pY)V$>+B(ZG=l^?r]Kr+L*EZe$i%'%gUX39$gP!bCg43*U<K=/c@Aq/O->ib[$;Fg5(2*mJ %r'_[0bcFmTYtHiK(C=h2JXGP>JEZk$\ijnd+Bs2S;GbmGjL%P#[`6mp6E-MF$ZR"<NbQGN!P#Aa9Ro0<53.g:lA*&7EQPVe`)]4r %2-n8FU_Qo+Fa4eD:V*TEWN<5QqmpsYjkbE;=D0EAq)$?r=Y&eWOLZbc`i-i&PF\as!nKMu'<nj,,u!ZB;jI67=cMGm%QK-.io1]& %!Up]K:Y*(@o:a*F#u-m>C%a&s6GrJgPF.Tr.C!O5&Rga@QCdjo>,K@3f;VXOCYcg+D6Z-e9W2-7mn90oZST=[Va=B,OCPXV=;u&l %gc@`3%I7+2/1ZP"?m'7#BiN(pHFk/sV*?QR>P/G7P2Fm1?0tH?8T**ol/5(?!+MeGB7ZS!4NJWtAM8ie@'PGeB\>_NRaSU>rY"%a %[?[Vj@I^&EU=nMk/Y_ZA9Qi'E1p(SaTrA)JQ;P$u+h?u?'tf;'8gP;GJgJM7NT>[`S>'9,4UL341/u]`ENnEQ!PE\6r-mLO`*B<T %$oae?'BU)G;3o3[(MZVNq-:oMeARe<9m/i5^$%q2DcrnT<Q/@2h6"hWPUueBDRpJ4ZZnTe3_?!8/Hqg<,fOZpooagrEos64D^>2T %S5@_(ljh=H$L3Jgp,"G#*^k-u>]7^[=e#*H2F5"<fWY&;+RU2[M>JpkUVtU5[sm>EF!HHj?)rl`PQr5Q6r[<sJ2Z#q!j5+53>BQ: %jETWq:ls.nmDAT_<6\*^A2/-c9GR@N5K0_I[[\/ZMcWVI53q:Xnc_VAG&qaK7TKH`h^L'#3i'Y-<PA*a,QVm:>WG4_BYC>i1[4Pg %^0ZKcQ=V.s]T,=ka?:[^g?U(/L"NA1]/6&j]#tl%WcZ,Y$)51O&Ii23f&+D+<jeii:<AP+aE_)l"M?u0@GIdp\/=PAQ](.6%cY;D %9M*'/X#8N1P./kl3E2D(jX1@m>c-N?'9-a)MHAe+V)l\%rIP9Q<,R\p<9mDdk&IHO_;3j]5P77RX?(qC71hI'brTd.8hmHt:U_'8 %n1Q?`79*V8P=rPeCDV89O)^or=#9e-b&Ue!O4_u!`>ZI^.ZT0L#oCL(p8bbgEQpmr>u^^o[Yr\$M\Q6@Y-iR5(Y5Xi`Jh:'"b%P) %%h:C+nYqiFeR/D"bRnW80lCq=9+p[$%A@>e0-ref/>`Xrb,hc=]!\TdZ5*a2Ha]bBC5RP2R:6;*0q5Gm-'XuRcBno&,<$Et/_>"\ %MF0PFM/^bN/mXaGjn!V5n`e:6]_+>05jL_l,AXi:SC\RmHGcJ*DhhhZLjCimIK;INkH&kX?qZ]i.@kAAb0hgI]I_fW0oP#cmjZ_9 %?5MooUogb*U;!e"3`Zb9*\e,8@A@2norM`fRWG0f0'elJj&Hs\]F3)3aOB@/JBAKS,<FtlJ9DYbH87pe\,3fPZlY"iA2aU'nUjlc %`FAt7YNF=Fn&g!`:e'\mFVeshVFh1Cgg6IW]hs3ljA@QOT!a,bKQu_:'nhoW[l`#BOR;%m-$R8:H58tVVI-=eie)K[M:gY!q'@8$ %l:Y@Jc/`3H;.)6):)c=OYW7rXDJ_MU.WI(@gf?G'N'KM,FumG#aLi6(hdZCU)?3kAiHcrOC*GcHbUEuk\YjeFr7'7VK9L;TX$"#_ %"'T-Z=c\6?667un0&T:]WR7NKQ<D0H`4SNZeuWrRWCM*c7lOu/Sj3_#e?8l6JH7JOj&eurT<;+``-Hqg`.Y0+H\.X*i20QGo1Yt` %Tb+aO[aUs%+DA'f@C;SEmRGZrT#&)*65I&3P91DT&6l_j<,t7R6Vk-]69-Tn:,AF&/5=)_UF./RYT^_GS7%r(/eJK]PH<@gC:C8b %8M)7;N#>+sEf[(9LT9?0Lajn7AV/kS'ZS$U*US=>jF'0<botuX!(?3&OY9q9.0+4bX2mLu'Xfp?bn<;!=Y)D%Ws+Q6bIWJCX=uWb %f$@h6e=?s8ICsGLgo3"_.Va_=rmVM5i.5#lX;XW2Z3E;VM<a%fr%d?V5t!8=M<]CIZCC'uRrPL*!k.,=Hn]Sm%Xd+["AV9_2n\$0 %EV*"G^moUJ*nTGbguetZ>ua,`RubpUkTa.]JM>D,-,_eN!b1H"4*V9f7s]#)HqGSd^#TPs!te1KiI8,:02J\i,B\U7Lrl>&Z>+D& %mZ?-NeVUGhMr+Eh-BNosEs-O2_I@cFa@:n"D8a4$R`%\gD:]ku&sj5?-`eO\g!,kjoM@7KTPCI&gCZRa`><;?/d5+c$bQT\(0_2( %MV\PmDs!aMWo/l0/i@e=RstWKA6^HEThD/QU,TrCC>/`NV;@1X?IpE8dk8nu"'*V$NdtIN@FfS42[gk%-8*Gq\=[4SS4c-5P6p*8 %,*cfCf<Nt_'Q.Mg7n."If/KW6C5M+h^TI9$qW4cNPq4e/hQ25uS#MNA?S)PlA[RhF=V29NB.2[(!9@]mo6'M&TCB4Klb85n+1'am %!?mB*3R5eko(U6=UAEPg$K'S@b#A8_IN[=)ZCPo"b?0G=Do)VTiXC`fgE3XM`4S5a[M6?T;12d9V<tHlX;98DG-r)6pL2?qM7qAY %%Qt4H[qHPkW9D?&[.PXQM_."</$]4_;S>r4]-i(p?]\n$Tej:U=F00P(7Q5@(,qG^iUm4?pO1E$6pt`,"fAg?F!9Q2/6g^a,FTTS %gi?Pb2Q;73^r2S]R*?7tMYR11PK,ugn<j.<Sua)D&;A@9#XZD%PT!06dOaOPm&l,8%16%m^W360$Ni^42L9:^1d2C42&e4N309O: %nr[CQ:Ckdf%Z;nr+fcag/!s2=d@/nb3kMt:_rC-qX#5,)6prR4""7Q?N(W?>=o.)d^6;DG&WJR3ifOX!R4L[H#\p@q(1j7XY-1\# %!u%Ut*/K9AcI@!/eW#A8]WSr9Gfnit15r3Q7Ug&R#+$?*G-OFP@7EO7/g>n'AdOCiWPKb7OD<(_$87q_>NJCa+s5'#V,+a;jR'(h %$VaK#i\DstCJ]a`1uJe:9(1#S^[u<j_&O/sNcWW93aDtX"K]s3H,Kn#=IfV,`me*X#El%TkaVVO+@a/1r:`ZdVJSnqcWY-GWpJ%i %.09cDI&7!b[,GGuhF3fh)loIM-9b#K-Tm!ePag@MNA]Nh&"->OA!I^[25ueOVe#4FYgc"=acJR)EDl\-%qcKneeR$b4u[nB`GWr` %-]0)-@bn\GM8M@p%neYl,;,27*#GbD9:SM=IbjO'nM!3.,Bos9`=g4A`@j`_N0<jVh<_*29J*8qQ58"\-fB/_2.i<>ppg_inX,X/ %hdb:Q3/:20D[8Y0H;dRKV<DJ2kmYWVPWp]u[MV<<"irR5cI,7RMG+mRHo)os+r'(En6'0nWZl+p^1Cq9b>tP_Ir1<T0R[."\gf@% %C!BVf=`dk+EG\?`fj+4U=U\[WRLO(B(5=td'Q[ei?@^Fui@_oX]"G7t*TpCA-B?30pUMCp0EHo:Q_Kr]LL\k[.@.AS-JT6`gCY&j %2^;#7LBb_:Q@jlH`4`>)Bsa)S&Dg<gc+8+_2T9ccP*!d%BM003+ka77^^d,K@oE6UTU^CDD'=i#$#p=\(["1;0=YP1h8<\pq&4R9 %UZrAW5WilB.][/:h?g,$'f2N8+h.Y&2WQ@U.1d3Z)Dg7]K-;%j$QLf(`M24<"JT@"f62WrU13EkpsRg&LD&&Nk/Cp0@#A&@j?_h: %(Y'r/Ss^=H5YIj5Sf/bo&q:Ls#.ImgYjPQkR\Y46Cg"K9a/LgF;ueF3c5fUIek,HX$C?(`@IQ,>pVKF*"DYWr]n?n1Wcm52OOo2u %hC".qbo+icGLDL5HB@lLen8\j_JfG'pEl5WIET^Y3k":i;6VUJP]>YF;j8i(FgEM'JLR7%F#4G`_Wj&JK@W_H(';!uTrDT4.'@7T %<(sNTJUHFj'!KOPQ;buX9L]PULVYmi_RRAY54j(7'VMV8*%s&N7t@9KQTcPSaQJJWU5%Q03.r2;A*_dq!_IhJQS(0F,iucsnbXq3 %&aPnJD]B*6Hn0d,h!&`6$&t'qYJ(,"@UNG]97B1uKmqPaj:0fc%$gYl%RB>k>]^L0`Q0'uUu8<nfF%sY]TpO5Af=Ws<6i=>dn6I" %<6(8Kl;Iq1X'UU3`PbJ*I0s%,`B/cK=F6&EjUX#Fm[upAS75<NKm-BC@9Bq-Y3MoQ@sYd;WX/-KH)K0Ol4(eU;ZUcRp`6AT>P_.. %;laoa27.Y-i*sUtGZE='%n@4<(W@GU`L?AJ#S9+ukb!X@JGk:=S"-@p$kC51B#o)ld5G+2Z:haS2oZ<p[K8u16O7*TEG1pje%LiP %=DTHR?U3bY[-D))&U>662up1$Z'u^5R(g(?-N&jKK9T$%-HWNQcT>c.Zo?/%ndT\ff>gZA,hADWn4)da6S?Q>f6ViIXS?VoOBHA5 %rhJ8-*Gb?-mAtMI^qc<sDWeHNASq#7Zl.?3//J9cN0OUSI[Ur+fR@`NYh[dHHC45clsp%IjEDLD58,$O%LrM'lUhM(],)"pgK]_h %mK*^<Mf(]d-s03=.,s+)oRLKqqWpt\LT3LI]^0a/#Y7ad<T[XcI4uVmZjH;sX6tjfme(PRr5uD@V/J&)_h';E_*J\ec61LSgMhp6 %RiWHrB]e8Y=M,\/[<?OWh!^s@`d[aG-boW7T7?V6-,K."^\uLEIrFJu:Oi*1li2-=`+^jYKC$&HrEFAL4EK1,M/=]@"%d<%Mal^[ %ia!_EgDKpa*&_6@9m@ji:+^Y$Tu5>f]&8[796:348<Sun\:MFDab!>1"bd4d>%uBlVU&CHXluK;2+Y]G.l+=T`3:a>W(Rs4]Kg4l %qMP7V3B1&KSc(*O6AEOR;mT()9P*hd;m&\/2*jsed+J:(?j@ckhG5FlE8?s-jmfCTIfAltT:Z)Qg[Di:Q0kmA/?)g]PecRVNEjG8 %dtmYC%k2Rek+'P1"`@8'.$bZNV^,S'j$)dP'!hu4=]`lg):F1c*1>`k74p_K]--7L6c.BDbebiE'B#Ln):2Vtf<2"FdPVl,oO[QP %aK1WUY"h78h%KY9Q5?X1Xm<03_kMH8Wb-s@4_Z$MBP:?&XADY+8MQVZ#R2dH%bH0jk^b;U=O0nSA"#T3BY>%b75#qjc];DU_q&uJ %Lg`W9'!JKVmK!]p2nM-lkbX?;3R!pC/0"GA-:O4'As-S(F8G>%s%5olA#R:gLC1=t-$!O_Q46VN$m'AX`FWk,<Rq-MQF\+*F]9l^ %"QIN#AElQ8">Nm6rBAn+)Io/7"pV*WC?Ydo0KX&38=l8N\[[?D?V%VIMIahdTD\QMU.;ocT59-:Qm)e@Cke+>Z."o1+ctp-3DtZ= %(LAAGP*\!Th-_9X)a5.o>e6*W=6*hS>cM<iij0b<PRMm_)-MP`*3HJB9[\KIqIIX@Uro0c@n#rlr1`8f<Q3`dG;Ef5m);b4E%Z<B %6<I3c:H\2VR^:Pr:WOb!7gXNFQ`qpO9<FNH91!GX:orti52&=G^h:m$pZ?L<55fWLDLD<V^V5hh=4kIm6!$4k]n,R/`6=$MrsR-u %cF7V@-#bBcEuHe]Qq[qP?CNOFji%OIPR*eLF;I,<_!Q:G7&HrVdu7!U?d(SV5tlkC`7?;cQc(O;!m,g$d7*GKXkX-PJ5Rk?WPmVn %'/W@SOJ<OPa+bK@=&CDFEV,L#otq4@q3r*81#)uP-_tR@ZXEoI/Q&'lVDLc[A$k/DXpkKjLqKR#cRM)?GhI\`)@t:2IiJTeq!4ee %M?1ok?d-Y7PP7s;O3]Z^8*l#T1e1&GP'(Q)cH-87R6"2+6^,_Pe05-"4'm(i.g'c4e*_<<+<@c_Zfsq62BJ%_dmR`u'^\j0eUAX& %TbPsrb9h=>?jCuhoTE_WRGE2("FmiPs0=-\S%,h9-O!,uZV_U*,+b#jLWdD'.MUFp1MJ?o*$Y[^oP[X*/'qirCC4U+I]3HNqZfOZ %#ge'`_m#V"5J7&*4k%R_1Vi6f[l4SC`);;VV&6^>_N6[lCkXq%0Nnq95$lZ'>QqD/"[U8m5fmc)!+N&7eEhp\(#l$;/)"Ge&E#AZ %i']np"R:LoZ9e_=bQ%$TrraSeVno/3OS&I*gZh&'DI;k<*"YZaVHTT0HXtjqLt&)J2ouKT)n$Hdb"Tch)QW*$`[6gD3VNF_8O8T3 %$At.%Zo3TQg.9Kg`=&&V%(/b0_<,<sac&PUR\i)9Q$_ZU39f`Ar&`e#nI(5b^W_2o="u%h]qU)q8<"P%hA9SE9W[0kZ]`nb[Y"ZV %X4!*Zf-WhXWWbD-XMluqQPd:Q2N%X4849<Uk/,o2C%7Q:*7oX@k1<_6)9"ud(I+?`fVUb>&IeLIZY:GI<I>Gj=5_t7"p)Z59m%0f %17(3_"a:HN][^m6b6H..q%cL2$<edOBgh&-AXc0N,+pO[i@g[&-LH[,=(:E's$i[+6hCi;RK6NT_421T'kCUa9"-e:-/4jq#gY[* %$<KpSCE_V8.:Y_cGd`j#]-[7<XZt's@U>4L9b9XsJj42U'g!ms'?n@!EC_@Xb$0XupO'91Bn6\Qr^<k3`fp>:-:niLK2j')c;,4q %A/<u]qYj2Q!9EciW6p=SRC"MdS0:ofK%k`g*rf]U>0%@ALGSi'8hNc)6S\gt*,C!!kK06I+-Nt7076;K6g2?2jc*7J7q1ug$d(p/ %MiO6!;;G7PErR?)9Q<"J30BGqVcsX#Q7%]-mt\j$BSC#`c9rY1WH&'C>mpW^qj,l6(@9gO8NDh)h.!>\`]h`^[-s<uN6%`>1W_d0 %RPubBn'A*"K+HT$G*]BK%8iPb+2U-^]A$kdV$mf^k]U$><L'8?2VffXbUQElL7+OPl0ZU6U(r&2(TJ@_JDh]h9I%lRc7!JfG='e\ %!MBGN$hq^iqPc=)'G[%5frU>qVCDLh_;]BRpGoGa]lobA^[uCjokqKD=GNQWZHDHFq^V3K,L=6DH3Y1Aj8aNTGmSuJpHD*]bV>(6 %q?&t7bHFjmD?i8r1,Gp7W!3,;ni6r*`V(bD"1r2,?3WLa1,Eqg8,b=*Et51!&FUZr$Wc`QDH!_p:XahX7m?*$Uh[nsq`srC>0XO/ %SU-^W<Vat'067PRk,o5b`^6h\SU/R4orVEt1ZW$U!@9S]=m#kj^n@Xab@%7-*WR%)1\58#26#?lp8oF#cUj..q@*0\akhWijNAfq %cTae29QHZ$a5lP3IXjXM^.`QPNlU5(,l9KKL4#EM\ET'rQUs)Nq$d'[a_"b<ad5Sb*4#Y'B?1knFi-=+CeXMAY`MbF>ptmD*tG.9 %ESN`Fei@W//?+-/3H"_N-hT7f5(oOOmjHu<r*]i/m1:=74K.Gma3jenq0:oTb^AD6Rcb>Copkk<Yb*)2:V<7OSp27-j,"$6SGG4b %T-5:P]URTGGT>c(M$N]/ofh0'+WjLmS,%\+>N;(9S!W's>JXZMZ9cfopNj934*=Urrbs.oBN\"jh335@]I3Nm(Rl^!`FR$jX7`0) %#2%=Wr8C6h82TX3@XO?bOS:#pCPh2&<Oh\-Zdf.m)SCR6P1NQmJlg_RK33SWbXju\SpN8eoC[b4rHNXrW0WW3glVQ12;",V*DNW6 %dg_cFHp^(6*mhS?e"7f<,Te)R]igJW^O59352Ucao/ZBP0)'GU025oY>e^u,*&V>LH1ur=q9hFJB?3#=l@6<mkpE$pZlf-)o&WO5 %k,)r,KZ(E/cSsp+Rc?/OL4$_YrS2ea^8gAemdZY*4ii[;p?0NKjkZ9]_DVnpq9Xa+I"m#4oR?5CS,k,fBMEN4"HcGYZU@gsUI;Df %$VR;IAmA:jQh2#TH^!/(q/5W<+n;B`#rm"F0(2%aUu_!B!"$Jc0rW&j>:bWlf'=h*J?_&k>F8.iB=o!JC5@0lYRnsag<KrW&d`lm %d*/3dGuh'$3](("Xa$>;6=EBG.X!%OA-fM6Cd]X9?:)"X?s3n"dt)Ekl0h(F&$>NE3ZH/\eMPQ_mT3F-Yp)MtLsuamdo`"\)?Bh7 %bhTFc_Y>H%n&NjfK'(n+h3JI>f=TT?8Oo)iQkn-Tk0DA<"BNSmJ6r+ls$"0m].XO`$l5<tf'A9+$bAkp0#[kY>\:qjU<6(OHFq[E %a.YA>]**U102A)i1o!>g&@5ri+F)kl`22g&M(sR[A?0hk6XiU&dTlm&N4'pa`EFQH+?CQd>uuB(Xu/p>>h_N(@qEKQ5#GmV(0%nj %Di457$CcI1"[FXQbne9\kfjL*$uY=4X>*O@+WAXKk.n'E/'HY1(BD7l)$kXBM3qNJ%i&Xo]R1l327>;4"7-PB&c8aoA)q=8P?Xht %R]TtJ/6T@nK(>=QLfhV$[:#jIrWRb:&]4epTF1Rhq#NOmk`Q(&'H:72bc7'Xbp'U?Q;PshaBh9>=Mtd:?u+4:`aL0,"J#M>\6_bd %I7E0WHWO2?l'>`$La@jKc+nd=$OKu-&=\8moN@KOcmiPV(`>.P"Sl;^Qu?[#;>hQ7K>;-!b8;nJb!;mK3JB2]aQ+oL"-W3`jOb?c %8J7nhh0;5!WD^F>SItJ)h)5:]3dO)8iF6=;k%o9V-;7!"TkaJa!*=H8<]R9OR$!o8A[Zqb@#P`#"s;JrXF,S:Z!<D$1GUs@CTai\ %,$dNcUf67V!>8BZ!,JR8I*,(R]m+Om_W$qb$q9B37Bi4RA'eBHQfXE@<E_Eo4P*b55U7h+r'KWr<C"0%AAL4o'"&K,6.M#-d_:oN %c]S?,]8E#AXkI>3JRE28"IL?_#rFjX=n:?6QkdN%Bj9:/B3))>G1Tl91E"Z'$Ypu&Z.i/>ln6k#B8p(0jWJ;PA4>,%:"7V%9e2EI %JuXF0M+hOGPG6T7J6$R#R[`GBp2[OJ5W#X862t=NWCe[jmREu3[dP+K65GZG0GddgCrCCI2ec,U3S9ec,m@spnOliu2"'?^IQ5Lf %XFMkIHLof"A]F3+&FKm.\J=9*>!;6o=N7@`09qRaf2-huQDB?a\^RL,X\33J/II=M8qL`4_=!4oNoF3aLjRPGJ&WEsV!p3'LD2P@ %ib,gaIqPr=7^+h@!0BC.*0T!3XJH)$TiFI+;q/robpop.#lVhB7X^A9=Zn2_H5XkUI7+1'BGf.j7MIF-[Y$_=XN?qZbDBB8GPRTe %Zih1-"$.M-0J[0=p,FfCDC5gIMRkNE@n_g'$&dFc5Vb$teFM[&Ugkj1?R6^E!ln%#5i*17W+#eeXMrg%&'$qdWFX%_mc*rjO*C+\ %ZbnT_Hgs_;UD^/=.KeNWN,_c3E0kFhJfd.TY,U/:B"$kAY33tBco&Nc:`6['T`4KN=H601?KMb:ZP5'UV76<$@/eDF1h_Xdc!FHK %R4.?;Y_%`)>egqPOG=AL+!lF;SfXrRN4LCV*)U67oAP$T<1G5s`*`[;,:3UH.GRh*;AbRg@pG[OBe>:nlM9?=U&3LlVJTtLHn/c] %W@S_IUP01_JX*%)^[jGEP3ikNDu_f`*s"\<i[ud1WR^D,d[!&54j%1>F@nP:/((YP6+!(b+>ui+WEDec+;\3YbUcu:,Y89aFjdcE %MYE4jYY?GYHqI[E17+LkJU+q#j9/aGYj9s/`KD`i7'2#jUX3,]8Lh4?f[s:;Xh_oI'uV*H]Qo./3Hak0D!Nl_^?\D`27Sg;8eRrr %&6G1>Y^p@`6-R@se4DReV-AS;a]%2X:2KMEndR.=IN:N)TOu^>*A+!h,(EC/p'Sa*1^u6QjmM]Gr88sR23oO*-KpIPj^p7lCI-!F %@bXmo:NAbhV6*CfgNtA'r2cE&cj>gJ=>JlYCb4Y[3<p0aG>i7:Ed*PL2DKH'5Ut<d1KeJFW^MriP?_DG+(MXCp(R&HBALLC2I4D* %Mhep/ah4b,OUu0aenhZ4"[V///kgb^(?u^.L-n,G:Q3@Rd%m)Q=L`W'D/Iaj%jGuF@=o:R3OASHT(TssDE-@jds3=bdF64'-%d\X %8GpuaKQBSb3%BB4l!/4l6]@%mNBH35,)id!,P!CRNk*3Q!OF6\53nI^Dr?Dua[M-]T!JKa;UWf/(t#m'j?5ZGmdDVV"amc`+)bX: %?RfU+7,7oS/g?qPoFJY-K<3"YP'r94o!F3U[G=(4[N]RW^(r6""ol]/Ub?/\#-:"EVJ=N1ZH65_puGjeAja.LW4NB#<gfdsM`2&q %'.AN[2g21M2?=h)+Ef4c;QlL\cm'jj1"PXI*4)B\5e;CC,$JuplU]8X35=`Fgad=iRk6M:Zcse,')^&,0<4NSk8R)e*[^8`!\IV, %7'3U!@LVcLndWg3]T-jb/%I*\oh);IO8gJP*e%KKG*,;B(T+L,?\C<1hUd:uLj@RMJ$"Dt5qMhdQISCa$Z*+i7u3-jE>8AX1uH6. %mdeVErGsM"JSi89g,L_I0[FJQgn(7!k$E`h0$q[MFT>C<Dm\5Oa>^?GPh30@A[lB^g+Gd5mW3tST#:N(eftfCfTQtC+A3*am[k$u %YBXTK_T>Ok@\7aKYK]cCZU)NJR`J3N/FpX!9iAYL8W?FCI$;NI^RauS:cI1r0,H=_HCJ76Hq-*QY\[J%q6l5`fj&0R6KC&+kOcBk %<c[srlR'3[G9pJJ_!A(&6LjmV6KA:HD3(t!]8g$4f&5Wk7N?5sQaKQ.Rr&%R/RJ^'[Y/=sZJj=66j@klX%4nJS>j</L.`*hB[(b> %m'3(El?t'XA)+Kgg%kM]hNZJhL=.oTQb0M+[6nOHS<U:/U;bs`!PPmc4*3Mro/RHmbB`j[FBWL-/?Q/:X%qY\J<NU7_2ok#>eh,F %QmkOKb8?>s;8jNK_'Cbs'im.:H(2I`'Po(62<GafFge7rba$h39'6>H>ZiC6YrXM=$AOD)EU0;42sCuM(onu1m/gsdXPM%n`(9]I %+k%llN>_.LWI^[10=ha@LbqW\1,c`4-uDIAoLMAJh<FVI,oUT?$E_3?nou_2CJYDYLjT:T,CUZVi-TK?r^#'%2Z3NN-M%_"3,$)I %Y*N%#^ds/iIY!ao"PN(YJXC/ed&&d)M%TCi!i'#`f\e?pZJ-H;U80YeJk]jjc"#<4K=YK'09@i6_4d%QiXBgjWVs^rjYf0-J*_'J %!@(!MK]P"^@hBs0rFXWE-uZo=]ZI80I`uOV_=\7ra>YO%dBL[ZmlG'o=b@O6(K@@(aJfm;GrB^:^p9&]BRl(JR==lA"OXnn(`T4F %`IiHXU`>]coZc]4?AQ_:A/@#]M1)s1hqYaQgl#2k,EWZ3)X?-\/]/^0$M0FS>cWS0S&RSc$+%lu*K0VMU"mjQK%>Le4<JIjc4;m( %=p`I6X"M?(!Z*WXJ"l_-`NS$^)DDJpH#1/p]9'//FCPZL&8UD2<q1>9X*`bm^Y+m^P%3i82$i;tl5d"S7s60pCJ'=Q#>nBe/2se5 %)Mn$Jkn5Z]P1[bYpe*Xt=ki++ggr_]Ema_o[PNO:K0K4>P54*sa9gj>okl<H"Qj,OU=RSThuV"B*N'/VR#`>$E-12OZ>G1nP9Z4Q %G[$<N=KPDmVPVU2+qfQhS$^:<=B]VUgV'EBm5uhY@:%DQL9ZqD4IHp4--M)2D)/lXKps@^OnJ)O3Q<9088c;cnqG`O7s6&^6dTDq %K1FbeZbKb`*%P>1r:PG-[OuG?dR::qnHRb6N&&jP-7>VPIN=>fQeT$qH6IJ.aKB&3[Q8#;hJhV%"!_h2ppQNoqn"iRr>N=R`,sn" %G)D[T,,XbplRlZ#(,=W69KP[:G7i<5M!6NMqA(e5nIRE&fgSSY&_"5AkUp?@.:TlHR*/ThR(c!_G7i;"&_!:2*+Ob^Qt+]U,3JIo %i?ID>P%*JHWfq\/^e(DZ=[\.7mNMj''/BFs0d)sAkq6F1XDB<N7Fd0OR!si..Jc!ph,qgZ7M0^8D%Uh4;oE'A'/@a#N&7!!R]o5> %/3uCPY7XKF1`%k_iYF6R\[mU5cBsEe/iKqh*q%i.7N-ldH8h-6VRhQa0fc1SMjSpMl4u,1782NHUUu>]VhjTXAO"1PZ/Hm='AFsF %:9oeFmNSNF&^t%(Zr=nb(GTcbR-l/qD6\)$P=*91(C%q4k$k*&&T\Qq&Ta+@`14.T4R.Zn]g0O&'lU"+3QWm_qSBOE`:S\uD\7U8 %ikiLO%Mp))X=&"GQj_T$_4J&QZ*E2ZT-@m^m:GY`/t_fS%:1SpJ=0(P>!r,SB9KkgA8>[b@:E>rf(1_mTe`IjVh:ZOB%D/hco,#J %'CHtnj)Q;8iNSA]DTUJp?CmF=#kX/7!cDcYO_CU+Ek<9[o6-[ATORYo=D$S4<09u@I]QQ$^WsFhCmR)JM4\bZ-f:RdIb0:`fAJu] %A0N66g:DkT[7AK[a<5II6KR'mK1+Y)NB`I6-ju02RC#c^kl<ld=ukc`4`M%8lng*BjOSL4pIpOgOp1hb*mU(ON:2/u3'h!'s6*?E %HSs8&d@mf]E\u@SQGipWab,/s_\,`u(\b/qRI8)G6K\V9[n.p9I9#d.L;tI#g4nrU^J;O<3iiE*:kpX3K?/Bn)^jRr2QcD*4Nu/S %(SZ"8jTM&hW!'e)gQU*F2EbML&BNj*[a(We.j<MKCE\4qI0-^;]^+NI!bHDV`?&fCI;oMu=[%\(AGlD'c<9oCSFj[jDKsiA/maS2 %[^N]lG@]:3QA/J$XKYkuf\GOp`hG;1B"T5M0t%NPLQ>Rs;;T)aig:eGEc.-*hG3E%ZX:M(r&nD1O$,\M-bWl<QO=U/fZKE[h>e;P %ZXZT4fnbXeHNm^U&Io5p9!%,;kB/^O/;[k0kko>,Z9O3!MhGBWhN!7p$H:n1M@^C4X>4rZYUaCLQ:JV+$fl=J2_qETGYgD@q?_*h %[!jsb8rR"fAQm@?%F@\/T5]b>qI,`Z3f1lq>f`/L:kN&8,gSo`IWLImn.R@ji!A"d=9r]$`q"i9gHjm>beglaO)7p8[VE>Hq!Y<W %PkDL5RGi-ZfGO1FIeEF()-hpg%@J<#Z$>E&2=FNmb]5A:'.#9klfVfe2T;g9U*FrX%X,'4<$F_*^_H%VfOPq_e7(@G,R-qg1>JIp %['OSK_[2L$RTjcBR1X_%fp(_V[cYG0/S]bHZ^)]n"Ii(q/;TkbI&kgIO7Kf<e0X9P[dG=P1X#d%<6prbQ'W>MDkP?PDoP761M0bB %o8^=2*aZp(:O(*0iD;JglilB[YIG>"I(gga$XdAk.ZZQ_[8$R_nK@BR0am;&[TH&<A(Hk-A[,$O3KllkCN5HpnHS(T,T^lNN8<B6 %b^-`&0,H<b*M6bS@cFP8-?%+C<(H[l[)rHcJme<g>_]_r>3W\%c$2-'=K\,OXd2Eejt=1UV$dbLF-Cl"W[%<!<b(EWGpPj62s]1G %N^XRKZO)q+kp^1u.#M2ViOqt$>a3E6!pMAEncI[\!Th+./CU]oB:ZD>"\u@3KS=);2mO&U&s"L]rWs^4+2H>>*?>ZbBnC@!V/'sB %)c9t8].?.cU0]&XjXb9A9(YIA-TQF%*4&h'C2aFs4tAC4>M>@TpEe0R'R%O%75Q%u4=ke)`jes92H^B<gZP$k2J<+G,ne`CG)%9p %E360j*D=p1Cs*eNO(>SCJ)p2<@00Yck(X5qg`S>I1_6>(a:u\>=D0>2Zsqtm6BjU/XlYYgPQA<e9E]3u&<*[FJpd^k0jI3TSU7]H %1B!5!]?=PaM%O#a>6<AeCsl@94h0896JOiAK,h9qlZLbdK=YK'09@i6_5!HmcZf9E<i#J%Qc%&=)2E^pELZ3R4@`Gqh*7dl7!h%G %^WH*^+-T1_<,t+YLor0:hGGAAI]Le@[fETE/ujZa<NB=WebVKifoD9uhqIcF8sXG(bi8!R7$p4OarhYG7W_%80%>(Di^mtJd+gSU %^;V@b<&dk/>S!RP(I]aE@f\,/p0(t4gt8%^.3Lcd%#QXMNj\#^f3-'/J,B/HiM5_[U#Dd<X%qZZ![jE2/,<>UQh!7R#dS.`;r[<J %QKC[mH#)OFd=pFRKJJB:?S(+-(u)/@1PhW>\k/U,q6J,m!R@'2n]>0Cd;rEFiff)`\bX[@QO,EqZ&L@Ui?c4@#LUr4(NQsYTi`(1 %-X^.pMp0mNPN^F`!Qs$!L(XaKgWAqV!QlO.2dc8%WnW:2].R9I4e:M?f7e5VGn2G-Frad%FGtudDmd05dLO1f1abp2HX<L[`.R)S %`fR-]WGP($!QlTb$3c"NELEgdF#R]/O#Wr:IHbrcUV`%\29iWWmdB?F=d!=k#+YA'U2JW:Mo6!)]Ld#)oA)T$o46U^`"UuZ]2`St %pm3;a#D<h5^DgAkFaVKGM>@:&'V1\o5l!-K;bZrY"kj"L5$mq"H[`'BHFj74MZ"q?-7ZPVN[%6$TQ<J4KqE5JmUBu$09pWT^75#& %G1dZZGrAHT3jAi2)u=NomEi#VnqK'2!(?DlT%F*<@/f/F/XXd+_])g!+n!GJKhOCbLF%]PGu&Tt_b4fq2G`nVN+J18`X@<18Y.<< %!1a9E3U[g>4j!;_[<n)"jUJdKH!\KGEV&t.PBa1F8LD"K7*@7=kQ3k]>[R^4"=AD3F9*]o(E`a8r.L%^5_0sY8m]LmF48M?(YV=p %>f\ag0rZIEDKLGW(Aee`FFc!Z35LSDS;`"4?#Us)FMU9"kQ7iD-$aCH!-Zc]pc#ba]mMBQo.lV'Sf:sc"(Ooo-bA4q7iP_fS%IZ< %@K8p,Z4t)D(SJf8-.M8ubJ_Yb/i\Y7]&5n%\c?q'ZU,JU"X%!3kD:ekfj\M3>p*G,.Y/[8gcYDS7Mh^n73XtdZ.0LH2nIp6gus=t %RHT7GX9Y*'iFjl8o%YaEU'iSaiW,iW-TM_??n'AN2nB"0-A?V![X7#r1$_Edk^j213.PMiN>OY3i'\A$DgNA6^WU9'>D!`];!8,3 %#gh6rSeM+iRLc\9)gd2na`CM'CY'fQ;n@oUQ=FH(\`s>aWlJib@QRL.:U6lc69AbL##Cbjer@S(S7&>/nSTnY\$]MlXKm&UPVL:l %:G8/ph2RtS$[l&8>XH&L"!FcB$-1\eG,^<PmYJn%>f]V1KIZ)KlBp]?Nkp\&,L*R"j#P6B(p*)dWLM.j?.:[TZT7?dN+KP[]$ic; %ifWAKP!.'rH*N]AD+=:>&YqpcVlYGDi+\d%=0PXBdl]RkS8"QB\KCas!@=?"g!1#0GUrkaa"b#KZ,Eqho<BA?3U\fNiuAe0o>EpG %b]NM)d+,g_jY-gW`?lrl`\-)8DdZng$ZW(i?H<Nlc*Le-dld.K7m?Au:Q-;.b"VC0d=V2E;`?B-A>a^I_c7pGnZdf!]KiC`86bu+ %OI>6VRIf?62uN"G,%e$&4jlGGA;2.<or:+(;`DD-[hE%DC8(TI/-I7,T(oB7EMn(ga@s[fbf\G[b8]e)ccb&aA+t0fZehe"b=0YE %.VDY>aLh3S"NIE1l[sL-S"l[T>'0SU<mhh#IcEe868c"0:s3,3Lc['N6=*8&)o33-g:X@+>%Cf>jEC6+*@tlI*QqQ.dgCb#A9geW %%dWa_==X17=L;-;q.A2L-f=S+G)>P.=E=\;hfTQm2)r_'SH4e4>XW+%.^9[gLQtIdmqmYS$.T_FM,Xc:2F7a45=(*Q".%KNN+Lfu %,ZrT?6c@55emO]&l9oItQ=AJm7Q(l]`:81]"&<eaUVS->\^l's9LM*NW3"`2G?RSc)L/]K?6X2%`fn]o.Gp*o_51;(m'=Zh"'&(0 %gN-?>MC^SdatDtjNbkLB'-^4-P7T?V;pE<`Jfj&JP@b@'rB[$mIm760%rZ3LGE!%#GCBSA*NI`,_ZZ8>.a5seo:U4R6oS_5VlF]P %G6!Ki]j'LAFhNmMId`m$jAAurp&b%FNjM+Z>X%&-)s\lHQaNI2l.aQH?WN!<L,j-@U-:r)2fkS/ST&t<S+_b&k<,jArUb7Y4<JKf %)8"@%N]D$ls5j&8V]mNP[%9jt,/'9?83tb^f6[-GX3<:K^M6-!pRImR3@^m\oi(I"QBZhAMY-iAk*A,&oS6T?Fn7Z90Ug1D#>ll$ %Y)-X>HlJ<mCn1ml2RW*NS03X^1,Lp:;]_.Nj)X_mXGD9B]6tq'=XW`AJs.bQIuW*4hoY!o"=AeXmD)N-0e#Zc95QR!LgI\jM#%=s %.H)3?=Bo7f6q7='-;)]I-Qm\9-,Q`ih19mMHl#*BII8qp[0/<M9XR2ZMjI(Y9^.8@1H/(7(C0=4FItNblsaP66#5&NjMd&Rh,kSm %`VDA$b]GBt9YK2%`*+]if99+NMT1P.R3a@Kj"6q7I?&-+M=Q<]?\m6Dl\4+Fh$\@9UWpolio11dnuHuSi)HmhibS)I#Jt:=X12K; %`5Jm6)#b]9NK*)p"DBHq)e.>Am$qIIe)[uYdL1--@:V#^]\0>k<L8$GgB<h``I;Bib]TV(%qG;dMaXO8Y0nkF@r!2@fk9-ZH74%T %ZId1RZds=9QoeWI*bB9a]C(gE\,)>5$h/1M6$"k.2NG1ZUpb9"#PkL@ABB@_i7<@DeCqn^nO1q;p2B;*e>kMm^(BU](u!J']](`< %$$@I<Rg5mNk],uDkKVY%aU<MM`/XH-k*Ji`n*Tj01!snM-1:=ZB1oQnGlC83J7Ir9quHbsP?8@JfVU^PYBuhr]"nGU^4SqO*$9]+ %+:$SUSqP?V*[1(^KW&gnKL-[WAh4?\au)b9]Fp.F?r!rJCmHYI9g!9aZ1`X>s!:A#T.gT1Y(MGgBfBoWd=iu;Onf'J/9UZ'\\.Vd %9C?1$9k-3,o:VV$nT+2ID"1uTNql2>UmD^'Z]XhnQ*VT^nfe)ce-O-LA,a@P^"`,/a.Ch4=Y9G9bQkXe;iB=1EfV\C1:#G^(LF"M %G'o/T@BV*:4JE"8FlGh8.l$$QB9[X"2YBHu7/Z(:S/ZLVah(O?1$aNZh(Z/O!"8LP=%0V`hsH$ue.If'!LGtp[_%rJ>DPC6N-/FG %f#dJYa/gQ?)u*QX15g5rZW>C;45QVO<S<GB4iX(cRl93`Adtu)^O4fH>.QiBVk<tTl.>t&btiffpG)U>^O5YM?i9]s:Z$W,s8M<L %5Q:757eu<+J+JG6Ig/KPrqG`.HXfAm4T0n`([h.;Kr=r\rT!o`Ujm_@:]K%qs8DtNVr-OTs(F1>\jN-P'YFXr2e4An>>1et]Km;; %eH[%o9i1*n;,-`!7^s_M[3<`1mjVkC(Z]hn6*qHWH(@'][Y=Kq6d@)%VQM%kfL3GIB'Dg40bRIioZnZU_jegs+&hOF3?E>TmD[pH %?=*q`*)MjXLk(oC."4([iQ)e&X#1e/9@3Ni2,l*d_^*Bm*Q\1nnRcTD$G(3<7?jIe>HL8i^eF,ZaU'/tjVPI\cC.Xc8jX]H53%oa %,(\c&P"2g#\PZg5iB6&2l(#PJZh<#H:RbaoAeL(>Q0X(Sk0IcuNp]'+L*UA'?c/b>4.RMC:FRgW?.P+*W*S!4Ej5,?85*i9NB"#l %<?YB_[J)cYl9K*Y-jTnuP/=ft!l^H`C@oPtW"(u_<i]aZBGII_In9S.k-DaH*.&);ii(,2gTG;tKRi9HR&\UP*/H8)/B'XeFDk-E %n%bV8RRf+^_;8;Ke;AaD8a$2oU9c(]@=+Jpnf5P3=LB,bA[Unk1G8'XM"[rfmtBYFclFY+0X`E-7TA5TKrL9'?)P;r]4P$%b_A_' %AZ<=g^84SuH>E(,VZ$V[mT%nNTafF^N*NH[B7iT)m*K.\3S)SlR$=G7TRKreXrCVna*GU#D_#ho<7;fZL1BLm7+j2`@'8N9@[lFS %,\uS<.;A1\La_uEm7(08Lu'qVO4M[^YoV*1H@;FCE$b2R)Yq8[3PGSDrklu#9)\C,B'Zr#<t^<2^Acq1D?Sr`8H3tB,"8hq-64W9 %6FdAQ16T$kRqj\$q23*V"^_]:QaY3JEuGnDlZU06':lc>>3[5S76c`Ri=R]*$)F!%0Sl1V^R-d-1bQ"Mb`df!A?#O1NKeM6NbrHi %,s#@<$<\f]A\9OfHP%L^U4'dB(cFZu6,s`uZD8/DV4G_P'h'[Kb%5#7IoKGg"JpF^[@DiN9:,ob5fSmT(JtNXm]+dMLo--"CQ)3L %XnRm6a'?%hXRPI\EU0."XRW(i>.H@D6d@=7E#B[MOlKUfe63jKR;E^niX0ZSIiFt)Norh8e'"7hU<1V':>ee_ckc8/cK]l&Boran %f43\^1hG*7Mh=ZQT3=X-F8CVV7"jM7q.Qs5[JPtZO<#Dh]t%[*^4X-GNiGKNQ9\8s;(j,0X[lEE?p"EL6U-bD<Eu%V.CfTS/cb\o %O^Lj:=s?fDb!Jc`bh1HE+VRCO9o0<EJ43/'J141pP=uP6'c\.:'lr`$ZjP_dIW&pb#Z!>Ve-PC*Lb.'(PoOl;8<SF<5iHn(CCS7- %$S`plC1-F%bL2,rm-?1\.j;CU)(\pG%,Vq1Sn8T?.Z__C=2:UpKP6ht0<re,(#o'o7$r)Q\3jN&Mhi$1GD?R\erZm1a:/i2'8Z4f %8ebO&N_H;ED66ZqE(JQi8fDmVBQXd?3_Ek>N@F&"U5_Fk4UECX-.Gfp+!jCS&1,=g@PVDPXnhQ?1K0<.c$\+t9f&CfH/$F`jsMd& %@+--d$J?uOYuI2_%D-?l>o!)Uj^CaPcr=HAeiO"'j]"RaPHtDN%l2_c4s:lg70=YIn=<i@^fr+_@1hJGcWlj2gEC*+Hn`D5_Pe-$ %f#aH,B=is4,U+HLR#k#b]E+1'1gQKfE2in,Q_pH-=n_n7ThH#7YF=MSj/44WVK>)`:PH[n;%Bi01b-(:a?u$XRSOli#]\.(1hf[Z %mk_)bfo2="%s]B7(X\2tFfHYaRipuOJQN;PDdYf'p8GZC,&A+k4Ibtskp2/X?B8hW?giqecrd/?&6.\X@$*tbf:uYg7D%j96A3dc %^[LGM'C(Cb;%Z7joO:;u"3A8TmJ;KLM%2>Y2^b\!DO!+Y>suO&apk-f&D<7EY%=+#J@0=*%)N+0MC&m/#-D%7h5c>eQ,ACpXqN)E %1rG\OdeLh8lpGNN&4PiFCU(t/O&Mt'/2'\ik>/f#X7ZSX9fb0fPm.mM5gWTKB$IoAfPg1pMOHr/>GL=,AsK/ffu@\Dc6>j_2*47? %qU.os,p@%O?OZ>,fhcQ<^7]-<SnJk#`SIO15m+Wa<%bQ7iZ9nB<[3C0REZfqD,t`p[Bo6(X2)]!2Q%`j((htkikLiF3^U6M<]Pk. %5UFcKG[@rc(58,jntR(%_1SbO3_rURB[A=-S%<?,atROsatXB@ZY+sVGr_^\QuL&)!\[W]CV1KN/CeZOdV@>hHB2b'.UDtdn-$*i %U0^2AIahk@QW>g]YeNl$KMnIj>WPBn@77g#iZ:X9o;AGk2OL`6Go"Y+CIl8qDNu3N#POIU9F-:9C?J"p7.8)N[GO"phleo1ck,*. %N4#gf+ruE6=@goM[3$)$`emV%h$!1-A]jYQ'c`(*lPDt6T-Mf$d(&;Rej*=aB]=B$C;Z8sJtl<lH+H0o[6TY39@rlBMt7m8(IcY[ %UeP:W(a[3)q-MD`a811q>VJCBqqk(8a.RQfPSj=?#F3p;!lJ+S(l5l*G!lH^X!#;>hj6biP5n>Am:8Yf:*aG'oAX<I9cAVYILUc[ %c'6J&BU9)AijHeBFGhJLq(WmM7rl^/@PGQmq;Xb7Z^>5Yk;J;J^+CW@G'StrG=j6Uj8ir)),YL/+)Pi#b4\3)6$i]$q$jG1n:SEA %.XGQ,()+fe?OpQCB92sG3uW&jSmQ(:M$3F\$fX&YReXU5B`jQq@Vgfp&A/H"=\M_0i6]]&er2#7S.NAUM=)Tc,Gd4UD&mtj]@k2& %gVjWH,tWQoflA)K9PX9J8cI;&?V9A^,7VMTG"]QK!>5b?gGR-;5\97U+<$f[]5Q471>jH6@3Et<Wj*mWs%l:o$\OP`1>7/.;&s&r %qCkB*@!_>p$qLn:4dO'GagDIo\!6U71B<t(ZHC<`],t@&+N2P.kWT%*k`luj[4ETn`X3uJ^!+HuStcC!L.0IchOYY%C6iRJP,)nm %aE:Z<JIsGUUX0O%_J[>pBXOS7o]GN[Xf[J4o_'nLn.tBmWh"`SjTK-?bNbUoAY5Wo9LIm@)MAhGM?XaMXW,7'P^\d(l5"/9IUhWB %"sD1?.^T7U1ns6^W+k>gmk\ah<632Z`A;:Y\.D1&2YFC6,?E.P=Xn.:XSf0_^kca[Zp`FU7-!g^1hKLEe@JiE`BU5ZPnG)q[aQ+( %1)V=m-T\"]XH"2H<+=:Fcs.4hE>]KYM)?=PZ%bm?(:7DC'%IqR=^rpNlTnd:/ZA9)^L(WbEa!BV-&Kn+N\YHGSY'BHeY+Q\e0d;a %OMi>=hZL5-;GiKX>@k]"WQq?t>)q03=js@tVPgcHSB7aBAsGMNSRftb%%JI'c3Z9':l0O"p.uMtSZbu8J@;8Vif=l:Ob=B."@UTG %kaksE+F3#e_2]_./SF/JP+O78EsIN!2olW?Z5r7:[o7WsO0L(r.M5bmn+n_GV%heriaA@*38_M6lgTECMK!YE7:]NLZ/)AZ8\kXm %K`Gl-Oq6\P&9iEN3YY;=e4(+p;1J%WjdTjYlL2'ik.>*]KU7L.188'M_:k&E(7$V4b?1rob?7FaAUB''D9\@77:-*qiFYe02L.gB %Ko7_"]i4.'/OsJ"q>qG(+jl%-\R4[p<ZuQ8Vh:>1nTEs8?u2^XB;nlCd.sB?ODtSYSH@"!)gZ)dAGohV$4u1De7oFHof@FUo=d^X %Qo[NA!"p*F=VG_s(t+bQ<]7Cb!N5:dZP-7r4^AT2Q#PrDJeh,R&Qq"mW\=`6\c8s.lRsL3f@c@&,'l,*5GF=kk)[d1r'i_)>'*6^ %]&EjH]/]__;ZWmsGLf&]9o]V&+gNTJ[.T/C*d=_:^8jn6.2^Nm_j8BtEE6:_0g18X>#ple&-;^VT4\=]$'g&e8=S=m4aT'39`;$; %'6'28g=GN_"\WA,$S^:&U9Re(in7JK+dcV<aN^_u7)-"C2\n/>SW-?i2m@Zse4RZjLJ]FtPBoQL;5@j2R^jj8\n%W,dV=n9'*_L8 %/uZ0jVoU?E"FmPP?9s&C59$_=dNTa0=sQ9oBbDF-TE\GL.;3LQ;pq+3B/W"GntGK=!`<6"H8M\kJJCdpGosmgPG)PF7;NK.9gD3) %a14TfJa?KLS0DGhBJ:N2>g[Y?*0SDb9IN;laJ!t_po]KK0Y)k`W`[MWLM>jY/=U[MGVYZKX8j_VC*jAEa:hNJ-[Fd4Sl@QaIo_4Y %mU9&MTtb(W"^!TUm1TV/?nGXBha4D)Y^SE))dK`[`f5qsJNU"Vf'qLaoSF"PViI;4'@@*tFH0DWK@`A'E2qk'=,F4AW/n#e[QWK1 %+N1:649OMf2-<^1n+)PMeU7-%/@(gt%c]hgB*B1@I7Oh?-AaiQk_Y8L#m>Tk<_kKi\C20BkfH$@-:45`6JM`9qm6W](mCpQeiuO, %+JCf,&5'AZ,m&R]\O)+[O(L:uT^[ksmha04h3`o^-F;o+hkd_s'B*UIpb=Q;+<?hK[;XXh:>IkJ\S7eg"Q5;SJB_h6M[,(f<4K6a %A)s=qT4"%e-gqsKJL\o(b+um#.QA^s,Q]--Mj<oSCoh`]f<M3$!&S09#tCqa5i<'(?\0)jB&mA\jH'fhX<'f5[h2Vm"SSTh0<AHK %fnmb/RVA%q8VU#4-'B:,RneMj/lEiJe-Rq2=.cS=h+c.FZ&".8f+b7?TNY2U/hNNi8tXi0X=Fk$8gW$Q>LPI,V%Zf9PmOJ3l6+\f %TiOip:5Mh(Hh[V%OU/L"AE.8h>^H,@&fl_S<4f?e[s"dEo\V`U=laU6.]ai56pLaQJQ)`b7FH@Ip.5]s^KJAn)H4KUp'.b9m&f2` %Dhcf"rW-T1=f.8k$R(j&q27Mk;HMDG09c)oN)7uTCJr3.&2V**5J0k!i%T<1ksJH2K^7;h<<4nSJp%;0mR]$iTdF/$Ru+S_$SXEL %+5#9qG[%\W)j.D5.=2l:VM`Q:d1@Kc/!QNq_gBHe[bB5F$(m"+=1'RPfOe+G6g]Ym>RYZpD3N'a-NsP&5sZ$.]`qP<1)JKK25h&. %35l23&iEhu>;/.6;,Km,#@OW[iY?:N:sC0@U9fV]S#pff^+3f0+^T.DCT0ak'(aI"&nREr@!3=M-Xc#;/fNK]&m#%G<">#IP<Uq* %.4mrfC8+T7Hi3^O<_O_HF1ns2`.@`OK11;:09k`Wh^\0s6Fj>9-p3jDdhXLgS.9DJC\9R@.r+C6c3-NqP,0?+hH"n5F0;gW:=7^L %_<d8bO:!.GZg8AA74TQKa:j))B!W,a2nVSZD>(4+a</YjZg,9BrSD")l+FZG5M1m.UoLs%9"MfQ8F/l$96A?O.l'Zga%XV.(r$`T %8F%3>W29#GC$MB8!^sXVQ$=aS3\:W_7ME#eP/+75<=Ad1$A8Dap9o<r%!<a<<l_5'_s6t@Jll0,H>$_ON=PE7pqm/K'#V)VP+mkK %]JDOM&h9Q!B/*<6;Oq3a_@Nrka#,.h(r0UFiL(46Kg?R,q[*FB/rUKT5DR,b=+tl5-@ZT!;9kp.6d&R>H()$m=Ue)WMCOTXF9r:d %Bh..a]#Y3G-F@X]FCUA`7PTAs<+f(F60qpgX;P&);(a`2/u=<\>1dSs3+<#7';-W&D%4Yl(6D7a*RTj4@dK6T_-m7%/>5Ps;qN-/ %.4^=ofb!&H1+c[EZ759U]-P0b`;KeD`Kc*jLbt>&%c]s[Z2fqXgso,qUkRfeJld!#8[IEQ9\Iq?657J23j>EcK"%'.>J74lg?sR, %g-q4Ua9J@gP[+p-V%f2`]qiC+B7^c>Q=L5Y9AH?d2D:TOXRh'0_Laepn5=lP,kI)7R4#:B-ZBQ6aX)[*X*g;q!XU2KnfWCgQW:d5 %i,?IbFTm-7:#>qcaq&%<$K6p1;BAiA*5^\s'glu#ncJ56D;@,O^WN.&,oS&C@Hhl-Qcc9G0b]>SfgabC/M<bGOKo(lV`hEdM%Bhi %6iNb?@q:1'+$3=kWp.g7OZ&Z4`'dGWcC,6]]&4Fu4k:ZTG/bo7TlMtF@IZMUfn<AUh+"d'9("SB2iYDQk*Vs(W*14_2&BoH?'ia! %2C1s;G_P(dq>cp-0F^>A%HFA>U0VdSaa(!1KA=#k]TZ*q3$cQLZiEs/L2n#go1DcF?sOs;=nV0'eCZu4(tSVj'(RKu54_oXc%co9 %ZYP.`eNCeY%1Og<0cQGapoeu"EGr`S<9$"*NfHMp0R-AP%;-',Za52kETJkU=J1M+NfZPhJDJDK9:*Y14L,gJ>WTP."!,ZYe>K[F %*]C5!D5YtY'JV=:Z[iu6Fk3R!%4WOd<WMr/0<D0"KFa-[YbLuO/TU`#7$k;p)oq*r)th:t@"Wb/T&bD'l#eZ1!Q^K2,9$gkP0uUJ %+=bZ'OBgZ:"%`nJIY->8K$#_NOJ=TK=;#`Xc*!eWUE>*LJoYBJ#SChZd4u!GmJEXf*PIlP?n*O5<Mh8\2&_.i_6Buref\(;S3Z!^ %,00uNV'Uma/3]m((7.s$Kub\eLSK84mK&klU8UNpF1nC1'55ThY.`p8^jZ>(f!2QFaQj^DeTfEe@Mm*Y]P:8"(Cms;5qOcgoj_r. %nMkK>33ijUDJB%^a.1.0"YOIVnOGNl*r59*K`6]"N]jblSW1m@m78:^IK@eulkqKkTn:LkFU5qNjhM!7W0m4gMX^/u'i:su$ZJQR %-_R+NT$`#23]/h;$%dTB,gK7ra^U<_8-]KXij&Y`6@56\#47H3$%RnaN:0P=[>BjG;p@T#![0]%CuhS2')6W$2CH<L;6f(aZ?R<X %W]Li]2Hu.H$DgaM'K&1_YLU6bge:Zl5mFbB/tk2R3',qC-5"&,7RM;m3jPH[UnBn!aBCSEN%)@[UGt\^n-/8e;9Zp+/M=Lu@6cp( %`0c`;F/nsQAk-NgnT[#<6emMg"s-0:>s%_p)O4u<Mp[q9W;o\ES%,YpG<4a[:?h%CA[Mk2UH_c_NIX08pHgCQTtX`R(GX$US39]q %439`MBQeF=lGT84_BX/&C]t?A3%Q0EmK'BIh)ct2E1d]%D!h##HW)(#8X*^P<OsS<=gk8,1GQLJies)L^$N"iAag0/!X7@'>/DBn %(8Gj8A9b?*57,A%o&sC778*f]R=umpcA/18g,$VY#mS2@XB('.+cr6%.3:&CJ2Cjn1:U<ej@2-UVM0bW).^d5lF)Q!A;<`(h5qH9 %N*KhO6Q<aaPhtg4FOFmOX'7'(KKt.PokdA'>bm[9f*J%6?.>W()LYp)P8oNZ2i#E>K#<sUrD3R*C&EX_lp2sH>LXRW?HaNbQKu8> %a22pZ1Rl4Xp]f3/5fLESLtrl$X->EcD_>nk=QVl"mX(.Sd?6K(fE5-$q3ad-U!<.I2VLV]8F88t7QhA96<HZ%ISdK(5Vu>$*Zn*0 %@.mQ=h.SPg6m@lO$??CO/?$$aN%`Q2O'!\_?@f?_M2<#mDN$s(XDpUVUctN7l,sZ]@IPn<oe^lg4mmqbit2`;D.ASEM<kr^'uJ7i %NVl>X*-mm=]dqN[fH*lPS?t!R/HHT;'+fdm:5kOMWGrZ4Rt0,sJRFgrl!Y\@Akq@*>%JA*B'aaS/bmR;)4\K)\e::`-oW7&2KmC< %ct<5VF9:q8D3!"fj_eVRAqR/.a[q-INkgg#OZFL2#_s^aZ5ZW:=$t5D1+_(34mgd4FL(^NQOdX8G]?uH&rT_u9Lu(JB1BoUp'Xt< %XXERZG%h^'0HLGf@Slh#n/Vj;%`NoNM:%b(<4Sg\9Fh#LZh1ApAtc$b9NK:i:ksQ^-];'E@#YU]DLk^:ZA1,b`JUJ0UX,t>-8"!' %MGK<@9.&D"")1p_b6qJc4\=jOX<u%kXC,=^W9f*FNEg@:UEHL90E7GR,6@m=r$RFA6[)&WpYOP'9jlVaRRU2<M,'/O<`$*<;Lu&* %/A,kP7rd><Y0Otq:S:!5WUaU\X4cO\;ZMd]`6M]]Tm/moelldFcdm'B9WFUfE7>6bO,dJ`"?a!\[:o`U#@H&D0i.k<-]se-!$]=: %!_l_.%FF=&WE+3'M,:rRl,/7BJS^*7.TACohU&#BBO["<jq[FiJ:0R>;=fO]2NH<Ggb&Zb+E[o/q\OLo'^S8B\;P4l#L7uR?D(*N %"(j_b9q:fbX:TSQXf#LZ7La8%>b=9jWFS2gf_m-U7H'ngKR-sEl`%iN%@q3&74.4(RPRm$+f1CU+jpSW#J2'(0ug;L\g4p;=EZZR %'p--u7`J2-<LeR1Pk[e"H)[6S39\;C2&sH<qja&^ls!O\gH7<u,E$bFRN*H=XsK1pH13ddfKjnG)5[V^J/SHP>;=Sg@g>$qU"npe %P'e@Mm(+ej,)019/h"RS(,H%RZW7]c2.)-omuMC)aekE`@7/A'Pb+H,h;'hK]k)m/L$pnp1Xe8,c]"s7Cs*/#=CX$T,?'[-:L_/# %_'_gSUlK;Y,G\2%\Z:[hSg?D&WNdZ3oMC>)^2"><bkOVL0kWcWnVfK4GoD=!HsRR:+0#`bl7UXU9lFJW`95`T&Om7pHD(m$+7>L. %8:u/&JidQiX]%AEgT;&M,BB<!j_ibd#^1(sF.O.O3ZMJ^DR_["#ZVnhbJF*q_9ub'M,XcYnR9\;r:"@$J,Ncd[FI[3;T"Wn4;=A3 %&N586%-Gak*/H#?/!"D`RAX!K[n)Slr]L=.J:a>Kc:ICZ.60uTha6oW)WVa95^c]N?8J;Ug,OY*$.]hI=(&7oY]r.P#IB66nis6b %(_(Wa.(`H_G\^jo8Wu.(&*?!?H=B4DQG!:mpS`9!fEk92mqbSV_"Q3L<Db,^@!4eJY(rNn9:p1QP:St20?10(<mjV-k:kaEffc?p %qkK--:L4<5";-rn?(7c.RM'm[$m)t>,oXo6mR!(E6a2BL(Hma7NtB_3ec`dfg!SOHHItqlq/L?t!<D!R`I&EcQpIJOld:\NO?*[* %a-KmRlWVB*lOJ(l2neEnFL-!0(-_K@[m_f6hLJVa..F`q26arRbY=8$_^btH<io=3U"kqjWX&Sa\b-@3/#>G2aaA.5$F9GcKN!#+ %B+MpAPdoaML&mjW^[XA&L'gIaNC$5N"/^=%ej(e.94*$&<1i9soRp0,P?:LH!gdZ\J]u]R=[QbXlj/8p=O%X(+Su6R1V&$;Yrr)A %U_+N_P#()1C%eRdVr.^?duaMXSA690E2+AZ#dA@"bbfpmLr1D2%X@kBpS_MaTPGZ@qh'kSpo\CGp?a*6X&L^^/O0uEf.SkJ(a-o4 %bEllb8B[XPT]<$=Y/Nqm$U(mq240KOalIe_F_5=)l&[_IGo:4'V_X+n&@YN\KZiL8\Yd8.V!tJ1)AFd)<^QF@S8!+G,l`tFoHWs8 %`-l7.9Irb4,t!6-%']ti!;<C+O,oS7Mu+l$q,o']$]NN8URV_Yn6L!NW.rVfk!X)VBcSpN,YU^T6TF2I<"OZY7pqW4@`%93mYM)l %RWLrc``L_cZFg]6.+&'0;HG>'(8ban9LBf#\M=!t%4aTL7`Bh/ad;CTWQfu(6u"Pth]#HP*aW4s7a:Et%epse?.R[PCBCr'XLm`\ %H8)PheZ0S8#sA7$mpr[kBJh!+dp'B!kR5U_2$hJ*LA`O^&m5>%:OhL^rPr7Es(eff.<Q5PrVJO5"i,TaVtE9=oNM:hiA(,LDa/:S %pkP1X"e"=lLI%e^h/V(cn_sYE;nVBdkS13]'Y5GpH7XO9gHVe>rR/j!4_"+l>0[T;erbj8:P>JCgp[33:XTMs4Gc?XNNFJ,A0ksa %0l=@.\N,1R=?IHGe;lJqZ6I9DK/lRsVMso!)6CX1>It`^YVgk2B8>SO!Z\8TJ#NJ69nL&N)PSk5M`7\p=>mZ&/_O+ZJl5JWglbhB %RLq4oEhdM>5Vt$9;H!6g[nU&'P)u(KeEN8W^3++56$4EO#6i0&&h7>?9nG_9L6Bco`Ic6',Z)E-["RD+T&pLfET_U>m]mJ5U4T7a %Wpb3E-RZ_/;Q2!sXe_J%&n>m<h@h2johYm1Mf+&HrdHqHa7-EaF'QFaJGmM[qi?s7f/m\"(7u+t+iWUp%\a<F<uj_ti`1b2B6_sH %eF.Y4JYWj,nWD<-??7N;L=[D<cL>BMo.%O?.rScG`=2uN0Ps%!.MDC(^g/<b8sDHmKjrV84HX9BGE;LDJUVnHBk9jfK2W+OBOiH) %5uppL'KQ6-/#?OZH7+>:N?(/cKK9=P$(\WZi`#TWs6s.0BMLdDf)_6n]P6u#/''Uhdt%:$$qGlhc*2p4^Rs4]:k>iQN?=/3)PfI] %F4i-;ON]j=NLh'9PLL;[(+]l:l[/f;T][E`_[Du$>LcjDQn1$>H(L<1=OeesE!NL;Z.(*BjsH4..F/JPcqrTHG;M#hBNXZI+"2+\ %I1aRIK/`tPC;:^%A[/]05p?sndNbIV1+WaLA+/*n":/-#W$J-EDEt[TT@W?T;6(J*IB.pJ9`p5>,O$bb',1X#@4F<Wk`Dt$C#TAL %'!.s>p)J!u"-QR3;pY0@=YU/M9&gC$O=aui5U@][XXOFf;8#/Q,m[(rO1O^AMoqg["`YtQauadU\%>;R#oNU-%`Z*;nK7-H,h>9L %p(fat7.k\HrCp'1)faUPK_>cVEl8tV)l9&$<mo>HJo0r)Wi;asS1C)tZL&Q(;Xr2pDM-;GeF0G=nhhJB)%f8<^[SUF-nN<5M31dL %eVo\q_'V0C?:WOr0Hr4VRo3Er+/%$;h.r"H4MdNr`[RMJC/K5QZV40HK@'?R2tu((qpQ9JfJRm9iL]l6/QLTq<Y)ZZn#na&l27?P %<:?'5Z[koX@mAm_ACXbIBc0!%KoicP>Ytc\;?,jVh?HV+$g>AK0k2RFK09*#)^GWl"&"l56=<g9U*g4i.l$)cCFof91>GOle]IC6 %ATgPJm<"/`*-adTUB].jc@WiYEsBNBLooh!'-%0u"WX8Of,CtnG>$n8+R[.pq&i7m,G1XC@6d7-7Osa6#WoYWJL@>"HL,8SdbTB@ %K5`W'?Z]59\g&SRGgkJcU,JDDS%CsfX1PhdriQEK3f?QZ5!Kl<XZ0#_cq7T4d<=1mgB>AmQ"X<hJ=mM-*LM9aG[h)-!Wit'Qfgjo %\)Q3T#FiUq5]:/\E3FbA(,^['L*/AunR]bH"4i<X*dYjkhD!;rQ5R;;llZ8?jGapDPc_;Fo>&*FQDt3kr!ItGR]M%Z/t4,p6np>3 %.r;]Z[E=$joMdB"T`H;"<Q@7r:WfX.auF.D&o8'3;S]]W+hPaLoF7[`5*Zr-MP>Z*;QN2np=Ai^,80>>L$:ndcMVk<%b>,^(6\W' %V+Sn&]am8hH\dRTB*DYlb^<^ei!&VFf$uYGC)Z7X!rtO*g,qsS`aJHhp^XtkVut*Nlcs#W)=8H./NjRKl+[=OOi:i2Gd0FcaS`Nk %RLKV+a:%GP8IR/+N7<9T)6N/QL=\[^3A'PS]TfT^8q!m1H?6^9_Wn2["[_g*qIlsr0jN\gg2sPh>M2GH=C&@On3U`HDH_(,$rW-u %`C[H\3m=M,eYP+#9^Zu.=gnV4_]BZ0ra44,\hE;UG52piFngrWrj&g>qU!h.G0h+5<SBa:GXZTW:@R96%Q_FA$9[M\Q9]+0*rPXK %[S>-!OhkmKfjH*I3ZpucHruEK1r,t#D;F6t<))3b$;D+m$._-II0X@u!`*.U^l%Mg+'"0E.:,q#JhJifZ[fcfe&ss93&N'qmph&b %r;I2lE!o*C2El'U9<`VbPI"r#;?GOA!\-h*#:=)'VE.I.:R-0'YC[G#U1/gOiFSkI%tRkV0s^(7DTsunXmLWs_g(W+#[YW58g.`_ %._"@h1W9^7Fup(:jK[#6E_T[I_a,*pgFU-fpZ_slPqtD;bA1ah2sjVq1N\Lg\_WOI.c77abt8a//XGo"5`5po#<Ma/GK>KS5%=(9 %Q&dJ)Z4#5H_?KHs*h\<1if3Af8NO[T'[oF^dfXEN:(`usFjIbAkc3Cb2$0]I7]i;B1)r=LRHRu)%rGQ"5,/l[;PIT0&674XSKL7J %mO=HUb0b;$JLp:fM?Coe0Oha/GDNP[fX"(-2*I<T8&uGUhX;,Q]><Jno=>km(+6Q8Eee8J.D1gd"=C/g+N_,Tgoa:D<ZbA2:Ose& %@I5WP=`!FY#bi`AD]^.rN[Z;FZe-1n."#ZikeH]9e[!*AmdUTP9IluNeqeWOY(Sb1'a76Xm9a,(KJ2kQU*Z>h'kL%Z@:*?NKJU98 %FGWc_Wo>=/;S9Aa$")]R"\^nnb=e5d%'M-i_C<3pN6-#9Q+s8Z$.nqeV+gg*^:9O:0A\5%R?3!4U7_gHcmq_WE/I^22.<l^'kL*! %`@D:b&Ff:KdO(LDji'q2Y^Alb':n,_"\s/s=-Yb=UA'Nh-WK_AAem^BQ?,lZUbOd.O"&m_ZBb$CF;F/!@*m.R;MMW:;$_EQj9"YC %-N:1gN%!AHHO>YUWmE:CmKtM_TOa+@V<AVs.[Ql.]W,@s:4_J@[;W&\XaI2>dF8BF?*CdL0A^+YE@lD<6uUpNla`ul?06&IVnk&" %I@i@f0YQU4'o-HZGYsZi=eUI>b,eRSH=rY2(ef>G;^(5_j]fCA8r;5XD)h&`k[hNHMbCbM.:-9GA`N>f>jc0!n^<"BH\N?'I+_H2 %\EF<uGX^;P4iJoY^Mo(BdP(O9.pAM/'X)7pasgZRmSmhD7Di&!n;<O03lS.gSoT]iZouqg?IAP4'>1(4WD515O';-RUD\khn0Snh %JUB0)h6[cZ&UP_,DtZ.2C=$4\6gACPI%D)NR+>e@M9p\F'XZ?#[XqRi[k<A?-*S$NHE^k9=*A$6'X-`<W`-R)'._u!'tm`F%^5*9 %b-P,HAfd4[`/oGLioh7$!*<X<db1otHV6_<=D(ej_14!;F?k_]j>/7:qB=DFkZ+sVPh8SeQptXu$:bq!<rm@@]hQm2P>BtJjuo#H %nA5@W1Aq_F_!2=@E9[4S`9(U7)Pajq$GU)TTYBJJNoViJe4ZKbYg3;:V)tk/d-P37]"`pc8#NX9`1G2n7MH6#+";8gmQgpMKC4M: %W(l-W2O?g@i-3uKZK2e(l=MPF]X4<5rqJ>kD0:TboX*-d?IdS,Vg(pC>Fj_1SS`M(=7s#P.:1Q\<i5Z/rjKSHd9kVdf&qL-O'=g; %'jY^f82'FQbO9[qVd$mPbBr&cL6m+rjahhK^KXJ'MN50Y]<CFDb:-cFop/kL'n("c&L.NR&a>"**$LV]3/AGTO/6Q$(pl!F0uJ=@ %_EYtJUR)j:du%H%p/+DJ4[kg-J"T]fR1b60MsP?7=HEZAI4Z&.;aAT*PXU$kW>=,0F<o`S_,<587M$>0OVB2u"oRAA\.Y5R@WI9p %[hpA9BbpT>ED8Vn^gm4Qag1UrZ/#re"`oRQF:>$[I<j.Hb4jTB2;"oFB_A%DRRX!V,`rhe!HHV8]Yo,d9jsk*Zk$q,U1%rH\Z:CS %6*+:E7OqTEQXiQ5Ls$F9":@.1D]e[*jp\HW?L1V'["#>p.BhrCbSaa7_jJ$X/%QS`'OTG3pbtD5b;pO4oj6%hQrCZ1S$?a^0CNPt %SVeYuEa&2]BsA.K=lX]O`mpp*g*FO#rh(6:RNbPmV-skZS"gd,]<0r0&*_VCR&:`BX'UHTh'@%43d^]q7G+`40.(I5]5S-]Lhpa5 %]C%Q?DEB@iMQY2rH=c=K+Vn+kZPGC7.C:Rm&EC_t(p'NGa;$#,4J%g:H;mIs1KXhkk[]<u4e&qJ'?5LO1&V9gSJA0u%;eq$^kQts %X+X#-D"-fR>%Hr4Xs>"3#0!^Ip46nL-,,peC@Sf7n'uk5L-b_&Y+VI]q"sW;%gs[I.&s4E4=n>DW)hr2ZB"R'Z)om(h5uQFA\=[S %e-Zo">j\asLKVD[eeKh%&0cq]eq]OV1ln5qqUY3oW7&EsJupK8_5`:nh;k#-h,J<Ip'=E^]!Y=uJY6df756qjnnf+:R6l&<qUF&o %++1_TVA94Da^TJN[gXk89G\,*!$FSRQ+\4.W'+maME!@#D4E_C.*\`Z-nj7$>Y]ppNO-RqIHPL+EPJZ#[nlPbmbODm(&bc#8cJ8j %hOK1'<t"DEa`/_o`)?DGdO\.MI@RJ:gf]]hjFihjSK,=Q%[VLK`rq7,CK\k$[S1FjJhQ_OA7U%OW,hb8LeuVdW$8'0'dGpc?<`P5 %L0$2Vk7gSU,lNASXV"[8X=V$:#\T7?nL!\M=J'MSK^0*aYqkamZ:/RZng,Q3[R5)48@RD('1?cem1kp/oL.jVYNUkh.<sNuqVmI4 %>0YHO(.g#$(/D-.Ss%?m)\Vea)UV;lfHIO*Q(C!)n&=-D)iR=.<s63nG&aW?ojmS8WsXijiI6VCq)hH6R#5Xdrp1C.J'agYU#&u* %='3m>FgO+UADV"p'G*X>f3L0!N#"(lDZ,0DZ4u=Zg;sun98PT=\+^TMZ<sek>9an8?626oE=`/L`%fQ)FlKCn*!*%&DeFba2ih.] %Esg%6e@D\%jKK%']hbW3gO*hZC==EP@D>29m%;PbQ,n5)^>_>g7hs5c]f58NV4EFs=hY9'"Uc^A6do_3#"%5E%+QY,ZaQCFc-Od? %7J'J5[k6o+KtqB_&&ZcH81?8WQlRe)@"W2F:Z;T!>H!HFd]F.[=Mfl!Eu23o.gCKNaDL2:cP2e^.nIu8*gX!Z>j20q.)&J3.Gegq %-1lO0dGc^_S?*uXnkE94?t,<27sp+ro--)p3C%(i?6O30"..K8m*T2jKQI9O7QcP4h6dLW.INZ34D[+KTLAlGKO#mYB*!Y;L=Klk %@)7r;4]>Dn<o'C1Zd_;HLlUtjF`LZpH;/4.4tP;PO33$#KEF^B9G#74q.mlOBID'T<$G>kFO?,1nQC/(9qren@S>ZEX'r19dm9It %F?)__L=p9nStHDqo!%I,.p3>]MBS7FccN!"A6M3<e<hn%nTCg,eTl65`^9F:&=M$N*5o+Ml7YQCa%:].G23.*itRn!;!?<#)Bh@l %H+,lf?up*A&6.f_1Z3#?p'4(Z@5O5)4ahRO<,^W2?&3od6!_==WcuY>YL3k-GoD>S=,SIbKhW_-VV,,/;]`N]Ti@1m5cth@(U5", %),/FG0NfQiKgj556.t<0)n-4Fa<t_*<DfIAQoK`Kg.#jk45#T^-1J2a/rqFc7If$$jCq*nmHgZ;9*g&)T7)?]K:s.C%osXE714Oc %>?K0=gO2oF[<gFjC!dm'#;=d;h*;DVjARd9d/;qp^1Sat3qQUt+4tfA#=f6n6bR6N?d4c6O14W-_CBMLTJs>NQ?nEYA?$,^KB@/k %)O8ieVLu8A,u5XG#C!]Gj'%NBYkgDDF&^f1fDKCN8@XO.onrCn]Fh>l-$tK]ZR-%>4frr`#fo2PIPo=Bj:mkS.PN2EOU\k)>r!lk %W)$ng<SONpMLt2dWdeD?&$"HRIVj?hD_:iWpVX'ritTp&-s$=U,Tf0Crj;*$r0o$#HO?h$K0N&EUp1GWTP6=/C4Zh1af4kXQI0Qt %_u.o6rgprh`G%eM>'3_oOdpB..ie`.AgjZK#ijTQ$,(!=((;dt8o>BV6-IoWV$$=96/4V?UH_EdL\Eu$.c/q%N%X%k2<.GfK4&M2 %R0@k_U`KSr?)H.8ZriP<a5gk*$/'2%s-,>@ksf\9)l;Z!,dtgi*K3^J)^6(o.O4XHnYC*^;1#`9YhkL5'Qpm%Kj.e_h/^f[A%/A/ %k;onI#3:?CX,"b5ObK.2[q$Ik]-m>A_eaJZ\&MeEo!)&P.eZOuBY`A>3SMpB+$(][/*c$6c9*0@s3_c+FpiZL=6r3`17\L%C7=UI %Se]ak0<@W/7Y/MAb\G'$O:$Kae."!Y@;6Lj3`qf+@9Jsb$@I,)OM)>qH?NGJ!\Qo\a)uSWn=s<-jAldP^HLoqpRn.K:@YRcgh6K5 %h=\/8'_`(+*d,VPe5ahka28sGO1P#?PaHpg;`)a^QKY<E,9s5,i2_AdIc[=>N$j,=WXhF]:koE"(d4YIlm;'Zhq;<!A#GdFkp;Up %j'(d,'gnb06PlfiX+3E.F)0=g6+l>KbMh!RXPbqT<c"g`=/Afo.P,?Bf(U($g!hIPdgqCD/`NL'GW%UA>Q_(X@YiM`p!^"VGP6bB %B)Zk/XP$5b`UB<_6/GKnW@:HLk+`c\F\_TIr"%VR!S&-=TS9=rYso2`@Pas<Qr=,\O-73f9cZ?]:id3DAp:'S0EWf34fCRVT)SHP %^\RlnVa(4Y(nNp?qu!YTroop05Q-ZCrk![YqW[h1hgbU2VuO+nrTEjgp&G!eIp)eA`lA&T]C3N7qR^\FiD8?\qWDe2rk!*`qo-=! %pU_N^rpCWLap1/IgqWe@hu*Hi5<f+r\"E$%^\[efs87jRIejT4rUJ^mqu?Z-n%O9tqt0mBDnc&Dj7hG[pTlg;l/sH$pMY!Lo]C)k %Uug^6Ib\:.'3878#gr2XV0'NEKrh+qL:7$tM#(]C7c"b:OEiVK=P9e+<>\crjZP!4h5[@(iMCjqW6u4b<DgU5?'mijC/3Q2X%/T. %R<+DUcFph;o#$YM9>5`RjF/h8T<(O"DFKR$*q%TI&iJ@(Kruq&X`'%pICVO(?:AraI<_c@qA-g%ctE7/e)1/aqsXO[Rm0+8oW,0E %rpf$@T)\?8msg+ta%?)r?[f.?`a=%RI^+pXo@*S4hu;m7s5S-Io^)M9)s"h''GH`!1]`uYMUI)Ps6'&?`H@j5B+NLV/0]X.:!Lah %AX9JI@6qkV-=SSX_,@gGrOGQrY*CW$FS,<.ib%S0JYC_M%3E(5N;H^V=:/W>mfRg">]f98`AUm]aIe,:r<8,bg,g_B/Y+k"ND5bB %%&GEYPBgZD#p`m0`[^]7^22Mih(R%M2dcLsME1\,Rr<cMr:TNNrqP=<IfI`$0;^PKcXaR6<^,6V`rH#&O)NmXXhk#NT2Jb.&V^I0 %-LD<V!_gkRb<G[Pci2Dc<05N>s(=PJ5ohL`I9cZM8pgN/4frH1iN),pre^:2S,*N&%-LM;s6MB=:)(1U=+B`f8K%SDFKJ@8V`3l) %X092%68@PQLmr&.[o*;0cpIT/7#Qp-;;5O[\M.sAU5Fo/[mS]+hdGesdriOVs2Wu?m\Q+($bnX94b/EAU^8^`5p_/@ML[]"7R<c% %h<08OS83VTHW&0D$";k>I_4q29M\Z4Fli&V(?YnjGCYH"ng25l_P7G<oc^IIQ;0=B7i<&`d_t1GoU+T_l/XC0#;LjTa\++M'@RA7 %b9N@8HtL$7-*f:HH"guVSTJ$:=qTqmnhD3V6+<ltl^4t5l\(OslSR<)!KjFMA=).\Bjs+$E&G;P`Z9KN;IV'lB''p?[c4ajiaNCS %?o/]'WhcJ-^Ptn#ZM%MLBh1@&^;WtaO)#WgiAbEJ;`Xc2(*nY6I(Po-CLEtS@&QC8nM.I&j9sT$'YWJE2mqTWIU9Fs^f>CMZJA)V %E9CiVH-^od)RhnaRJUaM"b4ViSQgK0D[hJM@&@YAhiV)#-^.uWc+9e\G9-Ki&VHs0G6gHqm5`\11i+c!7dW'-_;BmR(ka=>m0>B< %_:<J+TscBS@F1U>jNcD0`ZSAU%j,ETC(-\G:X^0Y`8SMfkfinjp/$k*@M#CYbW:s=&:DZa!&'%o0`hd#i1jnf5ITuXC"X4_JjGb^ %3up]'Vq?&KLPJ0geebIA!*CP#k5Vc#h1<0R_!FaL'@a`F%]%u"\0HHH=CbUnEXg30RIs:O(0Fi&1X'=l0>r)0?h$?\;c6Y%r>B4$ %@7A*hoP][Ts)RmA8QfsPZ-)kZ1&T.L,6babs%4Nm3a,QSBQm,n1CsLQh=uUNXbs8Di$]XfS<BgGs$9"Qoc6L1`a7Z.&/oH-iL%)' %#Y+@kIFBYt`$:qKAN)ql#p6_BLg0i`ECn*..7\;-,j)egBh$RC0n3?POSUj%<qO`*(/jd:I8P?C,"f4j+jOI#S\Z7@P[>W/g&>JC %8sgMqg;X(sg1frBBs7:r[oZbVM2eBHf4&:Bd"2[e:6\kaLMQ4EK_Pb_hcTdp$?K;0Hp%4QN;ikg(F5hA(PY9.muCX>J)*Cl,RY[_ %Dh?agP*aUCV>_%G.Xok3O547InYmA>7&2.qUQ6=O((eOWUKhTkmgs.Zj6j4f0PR(u\K`trnlu&(IN)I#,/&@@pgd5<3YQJ4]C6FO %k$W3Q9UcF/hh:N"[u6DDkj+p1'Y!\G..Af=Ob3)]::XYJT)o.H9Y#.5guM:\6uCcT7?5(Xpm;Es`-FL1m]QD;:OIq(Kj4L)be;)1 %cp3]&^o-ujdd/WAJfWqi.3&1B?;/cA6GVE"!OT(LnhFLE-W0]UB\4DpO[(jo`aUhD#aPU$nF+8qRFKfbT+S>r3ghD$#GHJG.p`u? %gGm>`U=bUYVtT3)Al`Q6f$?7*a5LFFW@KS#kC7r3#<s<3bT)(3r:g8??oiG90m5NnF>tUC9>/mCUI`D/YQ%oe%C?'W7\sUXq1/L5 %n0W,G^P=oNDt@T5+2jS[\1#5b<"r1[ba\2OZQ08Kn$N*(V`hVs*2[sO>LH1ESbBh7[,^2O:pC:tF;Dim-I^9>H]1ghFlk4=4.@/r %j6k6'OpM%nV*E[;lR2a1$*6JgY>G1GKo-[*'JO42O:p0qcjic+ankbAH-?eNOM;q)^JYdg'pV`?/id26IS/c`!Sa"lbU-84UY"d+ %IUAKmoM0dF3`DKnS]qorcW,>%`1+2K8a+mGES"!4m?;7bitoJG%6F)`a+UUC*+.CDU)Optn_OOVMo]a%gj*Og3uCo-ghk:?;A[:Y %T=4U+$-XqF2sO+Ls.b);RkS(E<U)c^I;SG1'`TD"QDbJl"o_Pp*[H!Jh3`R@re>.(5=%+*0\NqLk5AM^4HYSs3_=GO=q"]49;1DC %r_MgoW1EniD76/?Bj2<#dI5CYGH>-&Z%'H]F#N=NX1@5g4djXDC<`tIr`cIXCr6ATPC-E<]1TYES$GRWrfINYk,^G3InXIL(&:qf %R#4,uX^gNaPba$2V6leA/d3%nb,>2XD:0LZr8\YMiF<-go=`.4)GPYoDVo2e\YeW(di&SDr`Hss6^lSkQ.?T+#L_-@01Yi[ZnKKP %`U@GQ"1@W!&3a`YpdtRH;;T$P>'Tp,H:(PuGCWb^FTc\\qNn\P90G>se$m=$kUH]rFYp4?G;AI`c^trPrb6rs7Fi-_[59--p^:Wo %caT4Y!gC1.N5sMYQft:herA!463!,]On_o7/_EnNhM0I))bN2rU&S*lmgiUmrqCaUQ.Bb.)?4a?-c9BY;trGa(]TJg[U_GuSA7cH %)3?ri2_Cbt'saQ`SqtgG(\dQ_MobneF9`K6^8V#]k+2HpcTD$]BfDQ*mU&0FrtTb<H&r!;kFMVTVu>NA<f5XkZerrlqbfZodJk$= %8eb>_k]0f50?J32pIYKZ0#g?c=8j@_oq+(b.(Y*5&!OI@-N+GsAdf].JqckGZ%Vp,R6PAGj.A/#%UF(28'+pCP24\Y\\Dm?&3?p" %O-7DnCGO,tG/j:f8d.7$bTAY:s7b=B5>--mEd:6!dH7dXrA/'YmiR5_=b[_5I>n\SJnN?+2?",Sej"1Us-q@657i'%_:-tU\9K/` %N^eLT*@`4fIQ'W"qTEu=YX-$<.9s!+<`fp(_*s@&EE=`+[&o7f[>"_ce@61"[YpG$/q$N<GWT9Vn;1$rBJ/`90)\^MX[A&dGLu.6 %"QCRc9FN<WTb5rj/S>OB3b6Jc[%GTE`qAO68EeJ7oI;rkBqDWo@:KFd6[Xh/&/hk5KiYn6b:6+#a=fQdLCVi7n`&;NCV&kSqW!F^ %JjjI9;'&fL@=8,m/gd,qMej(rn7.CoUk`)ZBdCB)UoJh7b5bW,cJ<W:X*]b2eX,Z1dWj8SE_DNmdaQoj1``6(D<[&NU&d!O8e_lK %pgQ7Tp\JBbM@-/Ii-l5l_o_@^O4:YUXP]R"Uc65MC4Cf#1E4frA@ZZGB7_hg2NgOVf':E=NbdNW+C738%YZ?\:Fj,DhA8]!X>T@- %0/7G1F[KhVcuO0s2_,XOUDjc=kkJh2f+l2Zo8AV4&6`RfDR^Bkcn`@F;WN>8`YtB,]1VD`<kkj80W_p)rn^-m-hJ2.pMm#qA'p`r %U:Sj`U#cI^6(#72TTkf&k6-al9UPS0eJ>)tI&N%[L*d*Y*=BqO.*o4E@F=s0?]Zfd]rJR(D#ns[YT6;nMq4d[?AO!!6`9s?+rtc` %6L:#WR`Me.F-n@t8s$K\"@6&u\Xjk0)fL'?XoVK#6LA#f+UCH&5dW7;[MPg6FH'9K=S7:YWIlsCUQp1!0`'?+N]c!S_(R0-8[:AU %]F6RY#-3@Tmg+I+"&aXDb/6f_28ncLZm/,6WmA';6[g9E&H)i;eY;kk<$M1b<YZ%HqcX\DrHG8\b@B-h`,]UKMi_=Mo:8q#o\UPn %+GG[]`8j:;Tjo(b5PXm2,fWm..2GrBV!B!\:^(&qq@'FjiN&s%PoY,S4->B+$W_WVN:SF;-"p)-6t$!93Z"gH(?XLI_&[R6$d^uA %IKprq;jf3"!^89t!t;*2.^VD;k3%llcBm$$-RL#nn$GL6_PFLXJH@@/(+jW?RJ]!-Y"[k>U;-.MWgApP@/)M=pAJV\*5h(Rp^^b" %Q4%\"(d87Cf(sGQC]Q`IWmg8E]/)`6*`O`qP2DuUMdKEI=BaV]GlICU3%cZ>Qr10RD_3M<\1N"j2ee&uCo$Ynh/^Ek5FsoQO?4:/ %m=7/]`.kM+`+6*M&D9,>f8ai5)4Pc:*8b_`);l`;Cr[m3gsYh53-s;!oT&(AheEZ*-]Dt*PCKj1GF%j>AFrBKqEIQ0-%Btu37QG< %/,sU:R%1W^H3)\]:`W<anILrokf_k^/,of&SU^S:2n$_UYo(]?rQ[W5(P`hs\k,<D-uClp?V[Kmf3bY.Bo5CS?Li*JiUd8;,]PRd %\`I0\0KFi)2PBbS!VWlMHn;F4I>COd$uP[,^Nbhs^7(VQlt5_\IMX(k?op]SiEn[J&AI7WO7RP4qMuj9qR:DEYjQ:#QEuU56d(46 %\IS\+lEBWm86E71i"Bn\O2QeOf^29k#Uet,1aY5.O?K_RB$bK?biX,_I]$8:9g8D@iEVJ/4;Wp\S5JV3W%E,aXbl=":#j7!4Vnm1 %a`oPDUBM_#"1`;&H^_`?!\]3])T_TW2=)uF\Z<Sc_GF]cSLc:lNR2^Ke"60q6lIJS.%+eM.n,9:QQpn##'puM$.>C<_r@GY>R*,( %c4i$G:Yj^c@cFQ"jtJ?c</s5&DV9$]B#7f?r?f%D_LE?h@^j*c[JOVs$@;OA*nmaWOhd/c:>OIOpiG-b'\p+<F?.ms'd=6mI@R`r %LH<3*T.!]$-Te$/CX!X^8Scn"j$Q_@!AWei-*oLI`na[?bI6Z5QtCKjFs]`ALm;H3/SUp][S7L0^8D@4gL#urF^[HO/u9j_73IPF %/Ff,^'5)(=<g+_lAg1fSE=^'Qc2]FkIEj21[$W];6SDUN!QH>A7#j)_C1T@Cc37C!Oa.3cGS8i!(miZuEOB%F!Pe:d7$ePSBkn&# %SG,Os+`VXc/RaL(-+TIbIje9cb5=Eu9peXP[WK5U'(U[3Gi=m6!V0V->&H@@)`I=tX\gN\-OY$,XpcnbN_9IqL1qG"%B"j7mFJL! %mMO"sq+55OTAkd:L;JFjeNO"hARB2+'']tRR2#9.pKqF7)oAi-=o`>=-_8g"Z/?V:2_sen>8Wtd4"ZOGak'6$P9R+!WsGtk6.[:Y %2@&!g$9q!Z:F+@1%u0[E)#hR/>JimB3+MpQ[&.EH_4`qXXhS;^+#Dl&M0,@jPFA3/cT@n/"".q79j;]['$%?0]qGj\A(@1%Nn=T6 %'>ho&[.pFF/2LgH;Fakg8M^n@##-^>gPlC'c;8IL.8@0Y8Umf\FMjBqJaGp#Y<QK./^BP`e)@eWFE")=MGRN<R3K]<YhQN@B'r@4 %Ecn]o05+WE/=UD41,b-.s-QRN2)mWEea*D!M1$qqS[Ck=dJAS%NB7]1kW):B9==!tULc""aje`Yh7an(fFG`s,Vb[T7NT;^^T9jt %C*!"W[6o'r:XKoThe])L<GAZ)F@-LY[Mis6.FmrChNMM,A.<oj*N>H0le\l38?3N16P`eM,Y+E)(elY7><4^\m*E\lkVRjtV8u]/ %S14S@56N@N_)c(K7`Xd08l$TAago\F'OAV]U%QjVg3(O%HnhF;["c`e#9&TT>#Q0E[2EJEpR'LZ&+B+s)59SrUnmJkh<]`:R^cA\ %gcf[ggt>W,@$Q[WE8*J^>Ok\E;E#"gjJL?G_!VCEBMiBDRS)L-#$JHm(m.:*`TSeLM6=pm=);0.mp9gi]2B>Z(&*S-U#VNe9ec>e %S5[gb7-cmVV$ftf,RK@9L/VQ>NQnG>+%WMQkH$b7LP7I?hn%r"BfZblY>C`M#!HVUmQ]1iA3(MX#CePtG:$V383=ZNeuB>"mk-12 %8.L>#k-o"O7f:ghL]+2HT/mVh_Q&h%osCMnQrsYaP9[jOC"-lUdrSsAUueMgV9bV0Ql0)fZ(/`h[NW/G\A(@^H4t1Lh021)\?`LB %Apa5/m]L<NIeRc>28[WEHk;gi24jk^UY[S?1f+TKbR@4a1PdWN>r?n^P9mZ"jADL&,J=S#6-oeSK/2]'gbmWBCC2PmLbfpC6f)5A %1tl=@aa>fGjc:Qoh'5k6B!Tfs;L;F-S:!-[UA5Xd*Hu8PFUVMc/*..+>r8*d\BbFBC*R/RdZ64p.%/GB=Mp%E9O!Y&[-"UhUXl=S %*XWu]96?W3A`L`tdOjYiCu]1oD*1`Y&a'U/#dpeEqW`n-kTcRu7n6'!o0t"%/3lr!;=Cs/FNmi4%(3sQ'BX/G->h[qH2hs@dc@J= %)e+qC95BQr%11j%frd2NpD9TjKc*0N`AVK]D=jO0eHA+b:5)"BfcEIZ?nl]O;G"X4`H]G1mAq7ub`LRj6[.&L",s=/XId!/VJe>_ %J<*@?1>j+1oeUF+W)B,B//&>g'gB$'L1T--2sW3D44@WY,#]Vml&=e+$kI1jrLpO6@m3)DV.".S:C!ki7Gk#8UO`Lp&[e(NonN04 %#;m;4\LL!B^&`sqTQ;OCd"jE8cu;pf!@WuTl7M%V_q8c1f9o>a,T&J.K'M`unc7uf1SX$Y%OkR(CU[nsMg88l!;_k_57SSbL`tHZ %S_7\"D/7Q");@$uI+4Sok1X-'BWUj[6!L)8%U,(02NlIKnKQa/>,tT,c#iY6)-c?'e82j8cRj1q&3:6MXU$8I=hB_=50G9_iNn4J %$*nBsdB@AT[KFE+[Y?Z84*Y1S-+MN]Q+^4"QjN&T9kbsW=;Q0^DFn@lBQC(t4AhGsh>K'73CO-=Xu*?mLQ/&JCpH?__56q6n8D11 %q4KqU'0*ESJZ.61-?(jZ[)k,AQH8*)ah?<Sib[%4<Cb&nO:hZ(\J8s;j5c*M`c6/jCqae57Jpo&r/0!J?%U%-MN)3X_5\5BD\nW- %Uskf-7RCPSqcMWnIbl/NfDt`j)R.8]U>q6.Dn0^+Bl=a&b0C;,lQq&;SFoD9.c`ZHr3/Ek'Cj7Z3%!P8DLjK@QngGe[\a\!&16rA %a_['Fd@Ff$M/<sTVCMo/ToO_T1jdDCHedls/X3=69jRN^"T6YlR^/2e(aFgcA<'G_pm#\lI^;imnu"KY/3sas</B=/aq6OgSQJeQ %@[p`eRc%R2<]4b3dQeR%qkb49fecl29Zs;ZJf38L%E4QgZ1/W-?5AS/mp\W(POqqAMpVb5@D:r`iF6XZls"?)O?^:D$WpCf$0U*q %lj7aL%C>/&oE;XfP&LMiTgI)9qtH[9G0aC-ToQV%maL-6M7l7&\]?.A\)unZG`Y#F:j.2>h1,rcKV)FU^EuVJ'XT_IV&%Ek!AZtn %K)7r+mdrAmJo3iNHo_Jk\ec"_U*I2FfW)C8_q$KJ$*?(U!\)&>@.Rs-LUq[j0&XfS"X@Iq_u)*[GEWOPI=LZkNX+caOg)0+"43TA %Iqn?r/+N]flV;-Np4_CpZ;KFYWT%edRnZ]!*MAj],E.r5<\4_'-)s_KQ<PUY>-YJND2?-YN_-4l/AsF5etUmp--/s'>&o<TLQ*)_ %PqFXe&b:^M`MQQohBG&hD-KLL(@A$QJQ]j\C+R.4C!F4MVoZ_e>&<^b)85_:7,sfPQ,fVsL;Sk3cFisqBq=qGRORP&c.%V3PVU@N %THob.a;fFXjuXrm-n;i1F*e5B><?'H8g@eu_C^XK3T$9_]<hBdojXWfCm(q%]GHnFM=gpCL/N69j3@*YR9Z"+N5AY]GUo7_UR#dR %@Wb<K_0V\nXWJuI`BcKNJjSdQo]:VJg;hfk1M/Ac)Z#ZYIGY_&'l8*ULn#O)elf%jIO<pS.L.:dr]7[4/`[0j<$>C]W[4I$]a3;X %]-L$Ji128KH%fK9>h.dG)k`GU"M5gurD!ZTbM?7Z.q6miP3^:7Bss-g4lp/W!Hf'hN1O;A56]JZ7gH$EIIN3O^C''XZgt&]r#C(/ %8tM^E+Q%*kkBkuYV9&$N1H4FUMs*a<qL!7ER4UMj;N\NJ]lZ*B92Y;t=5br+m:B2!iPS>M31X^Ek=ihUc(qA2RG@"BOo)4b=#9*> %d)bsBN]Vr6pu$2s<OM](pu7!j2]7)r0+)&>\`dNOQlSo$oB^1$d0gq8]?=(q\p'M<)BR\E]S-m]XDJ5Z0:qrphd/N1B:J_dXZ9:b %?1K;**gBtdaa&+F-j76,P-<[>E-X1C9(*lSKo_S4G]&ldhBtO.]g]XOJ#"s_Gi(/rkj!@=I<'9S_LX>co<4di'DQGE]5ZIep#JI; %f3Yltg)Z*"\8QMV/oTam([)PpZ"m^\(O\rQZX.f>OLkq8#;Z+-Ro3Qp*Zj41mIjGK:2>B/lN`:heXhSbVBW/;XM=M$m(]-7F$oE< %6"h$Y?=p6trGU28IjT<h@pNCnFo.?DN]RK@^sPS#&g'7Yp#GS`r.E8>3i@(-OJEVIS\j(X(<@7U&E7mbeP5c/OVZ.oI<"<U"bk_c %?5n_GGc5pEq:#!(>qq_&c!apRT=E_;G^f3%8DeT_P"^5s"bSrZHXT1[gu0lSOsf[X],i1X*TmWU/gR^aD7<-b0=r$S81VA\ncU"H %#RcDo]OE;!M9AQ"G>=q.pV:bt/cD!L/"V[Do>0Fu#`O%::4[QVWPJ%D0ut&(5*$sKG=UmspZqAbc_SutJ9R9:8Q_W_mS)l\MqS3c %G>q(lKID9boAg6sR+*8J-W0;oqs%^]Ks*c#,BEchCpacHEa8M(3`5M*hdiq]\Q[sedJqL>^Ec$LhH]]Hq'HaGOm>1Hhrqjm/pa/' %.M]\chX^Uu/s?&JGs=stO$afkGl/VDf=M\2+5ci7SS,.+LZbLc^O%T]7OGL`q_7o*C%s`.EngF+#B\2[X\>b*fZ?%t(<b7%kpT3O %6(Wo0R7@J3!6Mdo03mAnA(UV"]VeO4<9ZE\@MVMLVb73ONl,6I2bC[Ik=SBMEan-e&38pL2d^#D_,s5hSQ3kd[keqD9KFk%]pF*g %kM[tWDE]iT^"9XD&M6#QAN_3$I/?il^;nb/`BZ:c;E5Hpi*h3o9V^6/*1?o%)XYGhG5_6_??%#^F`-Ktp`jjXT7^<YGcQD/;_EfV %m=`lO,R2,2hW<!?0=h220ZT#:Y50h+l7HmFZn"AZ5<rn>%)nI+(TX(4W0R:g@B*:_4YhTKnpAI><Q>9<l?nhRKigIXKs#<u_?n\V %gE8shLqHLoF'jjn-oW.':9r.$r>pJK5?%VVMo!L];q_c$T<e-Nh>r"I\IV`af*?R56*r7s-3#1;`@@D)Omr$ffirnsLr=%/5C7d! %s59XLlmm`HmFhZ<7^'@@lM_*9pqEZ['Tdb)IA&`MHHOHTmh`"L`_urMFPJ)&V0TLC'K^s9I>M)!6W%E`^'1&i/58;:hp8GUQe<]a %%g.CO%MQ8KgdD'h:rnH2([$^Odb?Iga>T?2rF3BAoYD[=?4,knSqceo,'3=L>,joaF)5#^;@@+*&qQ7Y^h^U^ER8.lVk+;qA912: %0VWU3]-ii^^X5>S5/@p_ULWG'FH@Z;]cXO?r.W<e[d5&m+#67qQPVl6B+oQfP`+&\2q$;5!YLFu/6s\ZV.QaQ'G&XrgdGm^/0ZW[ %pJ<(I%`SQB5mN#*]^c6^H/]0?Do=9%c=&-"%tI(g-AI=;<I2bFn1tXn*gMNbIB=`Vg1;;Qp?,@XU^_p2.!@a<+hgF'K^OL_-Zg`B %QR,1Zd2/DJ1(k>JA(N1:7!aU:_b1;.r?/.=f&bFVPi:,p4V>8>:pA_\Qc7gUNf)0>*iI$kSM]C=gSo[3@!K0uZU#[la5UW%n-Hti %A;JZHRQiN2^q?$hL,iIk&)XG+W)QeP+;TD,=H&&ia!stR-3l8;eC]k]Qo>:[a97_VVAhDh7`)'Rd.W2*;Glcm4r#N$-R+8RBIrFb %BkLGA*J0*:,>&f0MBn;I1F)r'P@C3Em#1>a-FFl/@$5$NKV9hWVG+Z!%E=/equIao;^)_g;%-)Q_Hfe/YGC&0q9^n7OWJ'I8;0!t %hr0#"ls=W4DYi//*T'7<Z\cbb-Oe"hH?tjE/UYm`c>o7ANp&Z/Z*Q2+QgA#;m65am9^NQi:UtBL;sL4-S);[^VX1PV)=jDUNgf#g %MGD8aC[s=L5!)aa6Qt>b+%:nW<-LoLirVX,7d&W]CjkZrkI\(\k>IGG=4@8i;ifI,2@<QLQZSp^A$Oc5%2N\;F*lgq(B^"fDIp;+ %Pg[7i%>V&:GPC`m/=[`+p2m!rjBt+U/#3EN,tn:?NTR]2eeMgBfD[<,LW-hO:t,R1e8)VY*KuZB1[YgKfCU1*8@=Yp3:\XoRG"Zc %'2;fgSR>fjO7d/@`kF!]/-&d%E4#8&$:?jES]-c]UJ1>lO1IL-fK"/$2&saZ.Nr[:7C30EX*p'+G*+R</l-]Fd:@GXGSfO.ooE,t %$N_#UR.]LKoqOJ,>HSp[XW>*+T+%u.XDJLm4;Q[NqQM*dAjK%f*Mo"2daG,c>WC&L#J_J]2J.;n3@Q&kCbLn[Gg&(E#cSh1hLCKK %DJ;"D&te'+#Ef)B$Wi&Q^ajrqH_#n:5oq?FOh@1I4,Un>eEMAOOmgWn*!E7OI_PQ@pHp#UhH.Or`"Q%4c^c-*0_`G0+`^pMJQLGh %G5q.$>'`EdVrE>?]1,fHgJ^pR+i[Ka;Ue;'*JGJYl6DEUQ"GOAi6>S&Ets@>RA9!(c!1Q8?c"KM:TrG>l9(lT:m`9BaN['QVJ-Sf %_S29P\/EVgc6%4[pNmr18j_T7U,:"m[ScIAQ.!XH)3_W$,fF(K\/0EOngt_&=)%)PLbG">PTPWm'l6>n[:AfJ4f?1K8u3U'[P>D, %1.uXJJFaa]&B%5F08I09ict:EGS;<.L!@Y"e[+%R/Q60Wd,%^%H(\!Z9Q(O'5f*/cPFj<T4Y(u>@=>_fW0r67s@p&5g7'Q<Fj %1?4];ji>I>UuXTjpX-pO;.ml:4R*BVC1f5a7ut2Q@jhN>%%#d'[%fqio@ODj,XTNn)6Nh"^`5tMC&oIj\!,]AW,OXVI(,GKU*I8% %*Gf;iqUUk*Hidb;2rm/p<'aG=DTO[]jO8Z+V)S$G=6LM**DrG]*X`s.+0(/):#BupRG5Eo6=dg*oB(6?;IUk[j:=tR5aZLYPGl)) %&tNTE#L`tuqEe^?*R\RjA#2MR$RBHCF'8&ue/"k!]'DfkV,,>Xm]uLti48X.9c*$&0@GUf27=@6Iu<rGs68GUl/_T")/6^ZQ@WN. %g4+d=D(YO[SYXn;A%tjoO'L[W\KQI\-d^?*m;An*n?]p+R:bDoIN;+1<8*t4jB^gVj^ALgLY;IGVk7p.7"`@QI@44dYln]LG__a; %+C[Pp2!B;iS<>?eH+mr+aq'o$_YJJ@c@qFu'K\7Zlsihc\\H`E^$Y7&_DGk7X%:R&KlF^Eas8XT#)%7hF2dO2`d'#J.m9qf^)O$q %0\Z14GV!4Tob+GTko-\JFB,`PGlD)OrL`o3cd-d#?$L*LGq]B%6R1>S'Bq6q^3-2Qq=3:68Kp*PGTt5h\4*s$(s7rY@(=1H>VqcE %Q8qI_0WSH3ef=g_4qa<+YoS+[)XmqjPJF]m!6*Ko=39HI-C(&5hP%k"q4Ks9HF^"`M]A1ec9];PHr>=9UcHb"Wm%eD`<hhWOmhI: %`V7aB&<+hY\G4cme?\`X6QQ=+JshX[bu/b1_1au0m`YFLr%5$shGVZ`]`VZ#`")"lkQrqZr1WWMEQo?IPKfmjSnXmG27Q*O'f:l8 %=e8Wtd/;s(kra(QLgsF;;%g;u"p'"[4W.eYa3t*gYS:Glm'IiL>D[2"\%;`?,^a4`$gOmbm9N+Q*rk0?YR02[h<4$ld6)Aip8GQ8 %:PhBGfZ_>KohR82jfe%H?1)/*$S]cl':S]Sh!"#_k%piVS#:u2%WM`k;mBGn"8bur,mX!/<C3,.oD:`8OO%QI;g*glUj3Tknb3:l %mF.9p53W=kU^,'ohk#90ZA-:T5.g=S/oTEI4Cech+.]`ElL_'GQ<Gd6FM)L38IaR;pDZW/FRUFo9_=p#VhO`KO$Vmk3QgR]Kt6pM %ZaH^kB@(.JATK<2C>:[Hlu\9Ph!h@+:aVFQ2MRVjp+#USk:a\J@$l=[d8bpL$mO(-@U4kA7TJsjitpbr/.OH"UHoR's+KS/Fs>e] %f6=9UXQhkSC]p8\/M?`m4Yk[a7/#oC;TdQ<7rR)5Br[.oUpL/q8-5,:>q*GJdf)CJ#@'W2TA/+;Z_`'Cjg1198TBD7b&.b\3-PW2 %.*=$`?_$sdI*E/hNNo-G@r^JiW&24COKjFS]WlreprF5ePPBAa=s_bf+<.AoS7ZP`SZBV#s'aLbbCqV(Lq]-K5jU/0NSXM8G$I'* %/u;43\J%QbZ9?d)-B,,Rho2FDcJ?TZP'O7.$g00;[cEo_dq%K,G(d0UH]fm'/M,b/GCf*RBH1h<;;9JA#fAc(3'Ft46_VH&+J`@g %ZIako>I6Z"Mju%R2@\IVe1ZVsk+^k5El6l.>teu]DPP-[5St9UV`4L,do!l>*4Z1"Tp6a@if!0-,q);5i3DRA&A7l-ieRm"TtsVM %l5'pF#V>klc49RMZJh3co,Zg!`kO%s.UL7jI>mmo+Y*HMZKDaXZ#6ER]7*WP8//t7S\onD>H.B)WOlWtl6)0-`a;)6m>`hlq2b,1 %^g%3c@0W?2`dO1F%nh?rG#t+p8aFV44Kn<bH%D?)..Ld:oTI-:MUMKE.c@7a3eLP'aB`1b54\6-gb;tQk.\QERDN\4H;QZnq+=2P %:G]K)dh\B&b[ZDHocSNCa<E_<H`".*/hfgQ#V>`$.HNW9RT-S*bCupYFa92,DPro8Hu1N0n#sq@#^jK=m/EAh[&5!TJqc8uDH7Hh %V-2,O(?U\!6KD&-H\LWL.D((q8QYIk;C\C9o.F/.*"TV6<5>7U![Lo)7R=M39XFD3AH1l(OIW7[',Q\4e$mEaM70]uIdj?6$oEH^ %r#F[YmAp1:?_/phXTnH1CRd!fa"USIDO21@Hg('BbNo!fd/,/Gns76GFaQ(kpdNc6F"&64m0?nQUJ.W,"0,b>r5^gh_+%u($D4U% %IWj/O3`JHV77kVt8Pr0U16X&ZLh?],gO/H=rE[Rs1,,$T`I'\nAiMg=RnhH@SU>3L3:'-rnMFGaMN8jW74"dcRl%oRBp;4-C=12p %U$rO!ONR,$BC.G1I'5q1Kk4:i8,g((drGG01<s2KDr%$)Us^DX_<E(kAqnA<G1E-%)R.gT\X:,G.<^mYLgR<2C&AaMMW4BTh,<B# %BI^C$62Ki:49"paLqG%.nknft>qH7fEZY"A;5Zf-<][a<m_`[mB8-&m:^7:gY(1`dn2>^8*hX]6-BqRY7s+?1OJ&CA]4bLAV!rAC %Z4D'PcB2DDp+8nNdoIA8G#R]r0ZTEj[-nY_:p=p$q4LcX:MK7jq]dV[GAf@11kWImm6?&[$QkS!!7#&p\I2\8RZO4jY$#(cVm"eF %7mF3&5.1L2c>r*5^T+N_"<0HrQ/7,%8I[ii$B"SI`<kbGd"@A+'KGOmgQrDc]M3Vq&D=*5=3aRTk7Ig.?N`5!r5<U:r%NEI]"Lq\ %Y=XIUK7eSL3[f>J'lYZ2/b%>9E$q)uHf;hE?oLPa*\R/DST_5qZIUDOZdI(4bDR_HXmeV>VDX3sQZskM)Hrj8iXO+&G9768W0Noa %KbEepm[OQ<ojq&M(s9h<VbOblo(g.YI\Hu1*?pDXXUF^O:W%]?p8;$H03>(:rhH]15B4kdBDkW/)1$O<MOmWsdMmC7H\p(\)>(=g %/q2!kq7c%VTGTZTHl&`pcktr-?/CqrIn2rR0nP5NiMKmMM+B;ErpR*iRASg;<knr=j*fDH\9]^0Y*HSd4geIpV;CmE^%;[!!>I3) %68`6C3u?`m83Sc`D&50l'a?@hpLC58hoO_?Nt[el0D,L<j&mG1d-*2)H7r"^<\*19b+"Kbc&P)V^L,3bKu_Wt!PCQ7!PF0hW94>B %WTCmPVQZ0lpqH,$7JZ\&jQt.^+6@-2p?K&2!u=#q-,,?AWq4o&RC>;08)K^^;#WZPppsGW'5F&mH:!"8ncX;H9pi,>-l"agn.Ad* %UN:$rZ#8`/j7;^5Wsp;`c=V]=qB^8NhsuKWm]os9=.Wc4E,ET3]ZV7bZ[:;TI-@dEW2cBCjbmp92b"eO;4[$,fkOu7[0[aYC>PID %56ao_8@0P#5ja`X46K7p>NU&`fEXIc@tK4:m-KFpVZA]j$lkTsqs'QdOZ?d/o%tlQJ*!@\#:.a\fuqA+2+@qZY=/iV`a<5te(:fI %dau1UW[UiKIpVge+a&'CZa@b3S($5^d9,RZNIHoU0Zc[,V"95s7E>UGXQO@>4;9MJn6bftNV]7LC$,$@&EusS27e,j*EJ/];Pi/o %`X&Qe$Y[*,^%'<rA5(qF_^ea`\83!,/UPqCo\!Ht&8A\l1bhlRQ)b%"*flfZ(b'E6];V:N]@lfH\;HCE=6J*-^ci3A59Pq\<2>%5 %A>Lc@PK$cf37&h.`C=cE1SerqQeo5dJi(s9ih\dVcO5S1@\o:_\f&r=*pZH^)^A((?KSj_Trp`i=@BOJH2mF/hPb1B1lrV&O%k_U %HA<l/R4DdCd>%t,Pb9W0MpYXN8tYXeqM;[;6;!ML?:lP8\R"Z3I$*#(79ChB/ZKe<^GSJaVQpGY0E,?MhSjC%6pg_]o'+5BEZ%#d %G)<Ls(S:pYbuc(:<&G_k&^nQ3U_R=TeQX1$ON+3pO]J(q><8RCIDKEQ&%\T=1Sb3>ip\7&N:ca(RJE:Wed[a";?rlj9ub?CSdQ!n %1-taNU)ItL*Fko.(#e`JdI1"rK'$.^hB%V?9p%>[fC*Q4Uh/ibI$ur_>%PB"mnG6p4u+,DmIY58'^>!hH"UQ?oSU4A3A7=%nLf.l %mDX)8mIg>;`=V:We_npkl.8;(>;AM@%,NN-1*;70a*RP=*F0t9ee%*#BkV=?FQREC4=X6>`CO.FTo/frR3>K-1:6)`]S)/m2#46i %RcRcO9g[QGrApWlH2WfSefdN+*$"i*g9F\XpVUMW+V!^u!na\p=m7$QoLS//r?DX5iZs&e$dDd:c`JS0Lc"ikT5%A7E&PHkp)p0i %<Ln4MP"1sJk`>kb;O&7t7!h7mLNKOM3/q7%QA43gk0LG+pL^a4H]4%aqN9(/_F3PC1QTQA_koQiQ'<iE8b+pD,OiuHG]/Ht<G9'c %g+HBCp0T1=UUSl"a!qVOo]XlmlQ0&OpF]1tK'FrSS%OFmfFR&VP.%0>0-RKFcggXsh!b&hf=r@#G4&)^`bVKoBD(Z7m.8G0rS@*] %^=RZo0R]F%p)c@cD^?L&)Ao)#VI*EZ=!&m?[oYY^G/`Mo?eMWYDrrgo4q>:?]!$#RIG$d^TQcRq\*^NAf_"QJ+Y]:_Dc\?1kA<^O %VI/4D(Qq:cDr873nNEYV'#hR#[;!VPlbP0:]/G(!)O-7hc/&N$Y#@'/@]StDR-=(Rl.aLnh5HdUh=p9.4s-4lCql@NBFC\ET.q]T %[+X38LY;8H9dpjY:rT1sH.5Dm8gi)=k4SX?HCGGCF`3c<jhiYF2B&Yi!M1!TjcOJ,n<B7rd(=LXhG:CWU*?GCR&G=OPPHL:H:l$8 %@Lq+%OS=FR&eAG.#sZ;j=ih=.eFVnE*KJuUqf3ip#mjt>Ss+<SCkk#1WeD^X%WMuPq2TZ%0cn??J`7Y9*[2Eup]*Y5q^%8cG4kss %7p<a<)sJHPrLfd+MR2Dk32BE],Z5WFQltL6;4R5GqI;!YA2#*"Ob+JHU.pd036)<(,VR7&Fc==tOEO3kdDd5YPeYF"#c-;TrEU-e %pAPAJN7ALWH2gYqddg4eeGip6'ZbX>(a50=,jbO]@qBcc7c+0G$.=SFo9&I*k#%+&VB%2\r_8M!n%WLo2!kSg+a&'A[+,7W!b7k> %'IiT%R[Q5O&i+e2Rl("i`LhYHNiZHBm9Z-SZ#)R?p\V@CImn)hPErJF`-7BYaMF79ZN293UC-G$DhP&f-PA8VV<&+9(Rtu!FL(aO %Uq`B-W]uNA^2?jVera!"6p7.<do-FE%g,WaC<)2%;ZYBKX,&I9E[4D%i4/!9IKV;N&d%D&b6ZVS^sJ+=@M<&8$'\aKdLusoj[WSq %nGsUrFJ3s\@4@DXI6TfU]6mP05PJ$:]f_OY,C8a?3`c*<Ygi@Q''^l@S]/6Jqua4bSR%QdM,U0%\\(h<hNeD^\edZpi.N:0Bt?t\ %-9Cb(bake&2^UQ]+a#q/;)4#t&Y_8Aj'[90L[G!sG$JAN);J63GA'$$jLj?:c6(2j31E2jIhNiXg(I$[-"f`U_!&\k=31r>'4t$o %'YD+7B9f+(Xm,7o:3ger*e,Ru>1j-i0tG?Cfaiq9<BYe2ogj6JqX[n?:+c@lfdK%Vc:A!<4?5d'@GQ@5Hq\5J>#`RYd[OW!./o<A %7utojnfafo8lBLF9-qm()%Q%"-^DhjX>;^,jL0>B9k^']4l;T,'+DKN#WN]e:^c_bZbOBD7?$>OZLNHA0R$=bJQOTM29`[^+1cZ' %0U\frP]#k/<9uTkKIdCe6l=(20Tk3;E$Y%8_T=d:@n^B9#>3+!3<Q.D]>IX4h^TL8*R=;[.sJ+dqk`CJmaAoj3f&5I"Z._S.uXLt %d8rFhSPXSmd1;U>2%@7A)m'`\d:klZf[[CX.ACH/Q:9K2?cV:%gh;ebam_J]$&b:oMAKkZ-%XSql'>%\SBG]JI#N>s^s>^q!`P.W %Z'CdR"`NO;@;2,$o4p7rAOMZ<eq;Kj-HFtA\#e-/HF)ZF=][Jn(7eX!S=+K`W\3taUe>7d6L9rI9;bISU\RRLl$WIFa26Qnf?E.) %g7]2C&(QLtR)*f[ZjAN"()[-gN46c/)KR+fYml4H=9gSH;9[%`>E<63Z`R)`e7_(>fT]pRp\8PNE*XILPn7ZKf("bNl\'k4'0VYn %ms1E-2TAY*38)uR<9EV`pDa=YU<d0W&1b$je2a5KX%oX(e/Oa@aZ]"WDb-GZ\RLk!FgC:2(qYM;H_k-!&VL>!i]P.8mtcZ5E-\#& %7-e'[f+HEBW7[$A/i!j&=O#/!8mO[G=@J4gN+,.o=].t7f2[XNbIeiBdb4-E.H:,sAVNU65hmop69FZ>SKp&ujak?;g-MO*b>[bP %X:Yu4GA5Y]hKQ%$?5?k:4:Au8edC>W*<i)XT-iEM&K\#LFCUJL49\+LU>oE5?iK@*/aD.P(n\ue4+i4j?$r',S`_e0@ra$X"7GW_ %>9h^VJ/dW'*"g@Z`(cYNfF;C?ip9u\&CHC1R9mf@K/?;GaWs4T>e@=V0&]Juaf9+lgAX&A.Rn&Ss4oM!U.NLr%IIPeTo#6<%.-]t %Y`4F?dMjS+fhuUO=fng59lT#C"!;nH59(6Na_*,)o`oc7d2?-CIF++q^l$eX`\,l@;[!`Y)uGqW3h-<;&?8!ZC!aH>RAIEsO*%7M %&"FmYm9SsteWi%V(C.<??@/f$URFJ/DeWehfoqp#JNZNUQpFSUcLlq]7mlm;%aF*XW0PY0!p)<7>ik&2\_coUBL!W@aYV37=Xnrc %)fKP@"eaOi,n]96T;MXN0+5-a%%S[l47d%2@atLiHNT67T)!L@hbW>d&%r92a`tu@TCJlK)u:l%T348BN<?D%j]`=q<RG#P-R5=) %YXkJJ<,L094E%)dcRHnE-u'SJn*]ro*!6L(Jg,NF(2u06WDK9R]YCo:1BjX]+#NXC*3E1j"RZMC>(8>h\#GfgNjL;$0^k:IgJ?E[ %2hl;u!lfoF>iRUdjd0qBnh;E/1g/tLe7eH)Imp-W#6C0Nm<5MWJ2!C0RsD:5k3d.Gd:g*"494-)7_;MTg<Vo.Pa?Qnd4AiNk%tJE %%F;aH2>0s.ef)fp*7!\^Y8E;=H;H<Y;q>q4L6A=&0O4g@f9(nY+_']_fLq>bHHEc1+lZYHNMC.?"kXpc\O)54Ng(+Gb`Fc$m'>b> %cEF<,ULPSX4B?jDoka!FbPcb>0jf9M(c:+,r\0Yhc3p("h6s2Q-j9`Bj4KP5`V&.kDLp/#1#&[ZiN.d`5NtnjpLq+SC[%#JJQX;) %N:r<8=[O$55]7+j=iace>gBH[CSu'[7:<6Rn,@2drk/S0CC<j^b_\3iEuJ5o]N-TSr4Tgo^S:1)em.(VXW`:+D$un;0au*rIrAo; %0V".$HN_=/(+SkRHIhT]gI_lUCn[6,ZF#@)X"20QffGT&dCbiM_kbW;4tLgqL@OKt0"&0V`KZI[2":`?)7hbiD/G6u>e9CUnoVuG %@:N[TUt\pe9,)FmiqC27b[f?sb0>+/RJ8X)ceF73Nj-k%i_DMp#\2iARO,=6/KYJ)(oD]5]ZY'oBh[q9h3DM_R%3MJe+Ut4'`^[M %CPWe`J[2uF[Kr9!lA_"8)[+=FAbT*ceL`Ip4red2:GuDrd*CaB'2Ms<AJudX=Dkk'E.ju=0tK742)i7,JudV3j4M?'0X=Mc?Ta;/ %dh<X,^NkF?Y=258bJ'^n\Y@Ok3b:>]/*QKe%9od)Z`]sBH+-^>[t7RX5ppEjc"lOE/*Kg;i&5?66s2=HTT^RXNGIaZ/*Q%M<AptQ %1IS6Bcl#gkrhP:o\q3[@;e=Dr3pR,6[J"ID)ER0k3i'g);+%6_;;1uq`p8oUf?gXg13,H3cB+Dn!n@cQFqHPKZ^KDG+Y;36>r8+X %k`XKq.@9*63i\Psbq1k;RAZGE.u=GCs(b7T1[k(;T\=^;YJLh7Ue<GEDJp>jjK^GV9-%aaemP-';;5_h$AR1-:`8,VE4[->1>7M[ %O'`mt5q97mpk\U0eRCISk/rYHp0ER><^qO)FK%oVR4G=5R24&h+RDb`0TXmCCf.sNHL7dUNl6PXVjfuR[t9toNV/]G#AN5XqHH5o %C.042],MQu)=3%S=g?^B><tqu&qeY-;H6>;>/\;@?\:&p>="'!`8r+".[jCO3K.[Lg0FjMo]hl>S,'MQF([PE<E_WR24i)OCUepn %c7#hqAD5bJcrV5k-dM5JS&P(d/;poP#Dk5sD(&WLirMBpV+KV2Rk9oCi)9\Nh(H<#0O5E\WRLNm3khG]79ZIHYAISFZE$Q#R?sf< %=R:T_E#aS/9>+W;/nKhW.n9b;2LFB6fL=.=CGV=^m\&V9S#I9!;r;U)@!47o&YG`^%%(=WN)dX"X.fle?(g/(OD9)a$P]p"'4$f2 %G"3_.:eXqRPIl;MBt$-'9WMfrqQb-Y!m:@#'Quh_Dd=rmS4$cf@^'@kLNhmG7R,ahA=M41?J/MdpK>ljG)aeY;1^r0&9d>I"b9@c %Hrd<Z7j2MkNC#XRc%u<,]hqNL*])J>-#QJA$tf,g$K94g8oo%*Q,X`EaVagN0HaR[f44t7[dkg/fSe80=;;V;KULtf5!$8ZEO&=7 %O`br>7dGl%P+`9*]Z_1hp3\HAlkGFj9+q8IWfqZPJ'8e$*2[q%NqUWpA5kQ)fa\Cg6(q1\mAs4j?"+dqM:ah)<IqSZ7`MaN0"N>i %g"*i?F\8-c$*RrO7VAS9)&"&IaiL"N0I*@C0_G1tFtti>?8B1^,^82i,BL;Q*CKnE[tU!]Ec&2RGtKdRp)+a7P;9M)1GWXO3q46H %#%9'?F&m&4XZ!ea,!E'L3S[N,]?`gH6To-9.'9h'DHDU.jXcTC;6VE,J_^d'@<ugUda@J^E>Z*6O`=>]Wha_f/2@Vcl.^Grf\Iia %rs'O$b/_`49Bq%4p2tKsT,T[O8%WZifJ[M'9ciWVHB*.Z,/S.o3_Dk5kE\\9gYt9m7_K_FNiI%RH>:4inABR^p!;t$8NiU.>1-I; %i=M;LMc&m-i>gEOCfh4Ge6-H7idP,q@T!`GAjttqlf!f'"h.bJB<Nnr;%KRLI6TC8E)7).p`,HVlJW06j\%SgG!2AhKQanLB]EYE %WK(ieb'IUTS1Y;NX4:f29*B([4cuc,^R[@<'5:P<`>VU#FiDMG%EP_jOSD[13ee='e8<Ls[PM%8M;,r$8gP;-bHUu+BB.'"/?Ud) %Lon;L)0oPD3[#490q4#=.#,4.&[_67.be.(+0O!0A/#W[D/E!rQsq5obSs(%FqQC\GiSV%S-CNF$PmOcZ(-U\5VX&sa(KVWebosC %pP/0Fo@?D5YI3t+G9jE_fn4&[1#ieIk-.\HR3nRbW#'N`QO;jS*#$[kO0*i;YZ4,,CZisHN:[>iWND`"@DZEcMU]9*<2;^-DkeKk %6.n^r.]O<>7R\eYZ["thJtfG>2*2#r^4,Bc-,.rH=?tTgG+4Up$pt5.G]0/)Ek^:OP>X@b/%5CS37E0+C+5[!%_S"@rMQK2`Y@0N %.@e;cEl1d7QfChX;@9n=,N=KTE7U$m;-X!,[CEO!M=>fH"pt7NaSL%%L1-3^`Q%"^Y\&N<3BF._Cep_dP\'p(;0nD$R-'35o<fk@ %`<BM`k2^ot?"q"#`&tEi<_GEtNIuJEf#,X5hs9\r,r7eLn]nY;nK&<W%`HQ-YBo<hD<hYg%UMcoAR8$Sj'"/N=WHKqc'.oiiN`%% %/3F\\R;@RmT&k%P:-P;.S>/^_)H5<+H&)59XH[eS<b#:^SY\JFju9d>f?'I>USobf96IBiaRh9>1tFb\VEGU!@^g]B$G6+/W>cua %6s&a+baDPbH*@&\/Mj3kQ5+T):kCs4^X"GKQn(`#`GX*#?<+P&O=UAFn)O"B't_k%;l"tdC1L@Ra6i;DF3A4F$G2'@X1GX"<JB8) %fec#FhoAe5H<mia42Iq_nG:u]C%:bn9Z1Cd!q2-%e=.?(lP3G%EL"o2h]tB])U,p8bEO6-dH@NP4+p&&GH?WQ-.?#Y$sZY4E(eBJ %hOIc?V3W9JgH%Ij5;6Es-=>N"=RXp^3Nf,sFGN#@26ja5lJ&mKNk;)McJ<Zie_2t()0rukXk`&5E^g71>Xu4_FPSC:9XdQq[i_L* %i5Q@gK5#W"gCGs"1BN85;rbdnPRhR`)aQ[3l3Ih\ATQIR<L4!'?W_M.V+$_mRH"b;V(C8(6_nUC,qC+H;b^oS6iCc:k1+QC[<*pC %VJKL3B9_nKn)E,/24[SrSYMArf;b](?a&6s24^/Dgho"*7TjNIeT=9sLB/c@=A>]5&u8\lXmBu$Ra.jtc:Gih<_[3@2nQM)9kREu %Vl[RLXdW"*$oPG7no!4L<RVi9d]%MZD,o%&bq@:FDmc%ZGZAk?eT=8dEY89':,STir#))B]MUPW;(\?HVt?0f3[7J(21aF^dlC[l %h6<>C%gm=S[O>bT'<Xn]#M!qA.CMf*SP^u0\GEYYC-&+n3oc_#2Q<Q0!jGiaZ=u0:5o+%>`2mS3kLFZD^9^I^+PFcbF@NZ[2YW+. %TUO/>L+LX6ra@Z)3F'+\c<4Cd8e-X<2s)XZ5HUe=)NaqlqmEHgZsBsC!%fZu[/lr:MX/lne"`CKU81`"CFYn*@KFGSk21@!:6ON& %^,fcm@b^Y-3PIGgp:`Sc2/A,cJT`.%:[(h\=?@;!-gFf=jeaV+=LUr/cgTqp3iD)1X&mZ:<sm^/ajpR@ST8>i.J'YUlZENUMfo$J %87cN\U(dB>Y"P%dH\n`Im]Z%CEfpW2kF+JRSU@lRK>C&jHA_ZG5GI6sGE-_\)dRN_aG\S;GE0k2bc\K\Dh%=RYIW,Q&n$+7h0Nco %K59oADjiB5VQeW/GI"?X]]`,*G[u<KS^VZ=VWSn2k1Gk:g8hV75Mgp8m\$l,jj<7`So:nF?fGT5gl[*H69<SdLMQ7a`eAM!.k8tI %EI'RHJ3>jF_QePi)S2Cjl$KcN>g4TNZTD'93f])*SCJ9]*nrj)<tq>q;lr"43a1u$f1,W3jbF"K2S6fWfF8#"*:61<Zl9@&3SDes %]tYP&^9(?uY'\3b_IImO)qWSK.$D\.f9Qp*QuA^&l^l%3>VmnePIT/[g4k(*"MQgg1#CK\J-_BjIqMSbl(m;AHL!teBlBFoh7;-Z %84kY!1iOVfba&3I253UKGX"D35[XJsKut,.\]4p;.QB%l!+8gmWe`NM0SELb#E-ND2u"j$qdu+S:(%r@mheB12SCsa6.s7,!TJ6B %<_g<=45Cs<<XdTjP]$/c7*AJ_[0miRdd1bgn9-m&W4V$VkOk,+gi+WL0c.a0gi+XD=d\)d[uM;ohf-&:jl6m;M%":EgKY.gDReHZ %VS"cqC!3":bf+PG)t(Z!J':[q[fNA0ShR_6c>M6n_nt+hlg7DAp"8m1->q+$mG$2!CS/B7[fH?qp,0n"Ug$na?>Q;f*MA'EhfFM1 %fYgT=Vf4O$T4DfLZFNGG"S"PGmG`86<dPP4YA[55Jh(;to][li%JKHT'#XUSMO4gYE8$2R=&Wb[E=nCTK432@IQc=eb=r8,5+AlF %0rIO2,@F9BdQDHIV:aG:d;b3+b'U$t9NFSUD_k<RMm9?bj*JIh&JM=L2KoT>N_@<e;JS=JB(tiW_jg,$P=^W!IG8(fl\"GZNT-!Z %YAntms(EnRF06RmF5<U=;r3gT>k?p1klQmg])p3X`cYi3L@`;Y<mMmTS_Cr'O&?/f9g^du`aV==g%@]IDj@)0@6j!sOgD[:Y&Mr? %S-0bTUWIk5KAXg/Z*s-#\^Y1#Ncti)iPC@VP%+"NRPMP!P<+P";\(hE]mZiAW@I9uCruV(K<?8UW(Sm!_j`78PI)c:W^Ikr<W7!M %Hh"]IKoB?G"^B=8"c#19.;OsN]_crK6]*b9Hk4tG48`f9&"DIN1p%NLYD8Sh`:mo_?>ESCjllH04:P"We,5LjcF*;0Is?aK6K%HW %blfK)l]#3dhTb?EhCObSpGe/FkV'NZhL.4Hb#^ErQ$T6K*E$n7Ku1Uf\)p5>`LE$6<qjtqT^nROK"4!+MWicN'O,Frjs^NHWV=;@ %ej2Bj=E:\qWb)l5r=INJ>#:N#$qt<j,((S0#'7:o&r7ItCKH,q::EqY\AdgU]!Q/t6Ximj,Pq=l27HVSG:@I?YDkNP`G'&8I/Ub> %`]hU=6J'oA.`3_bAChjiKX@FO_e'">o;XVP>H=8pV:k4_FM^g/.!!GQAl#U9eXaT`>&n.^dA`CZ>3gA==)mY(f%R$5eKs6,nIO\l %@^/R!lA`VS'0:89Hp0aDWiP.!3G'^d"k]^_((>'Fb"T57g35bEKP\*6(ko^O)J0BAjk$6lkPmM+[ap"Lk4u:A2O:FOM`A%ZGm9D+ %MTr,Q6YKa8#kQND`JB]c%YJ4<Rn!#XXO8,4><)o![)Elm<E_U)CmO6S"a:`2elmo\<bXG;^[B32g71e-Hf`b2!C*p*^!q$FftGob %BD,t+BM&<mr&2IG2;5%X/_ejc40<$cGgpIo-g)J:=1;>'N9\1tf6#/_ZbD&Y5VbD.'HQOWWK^>nVMJ<!IU!4nJ*E4(MR[6;$CLM" %`jYhD.oHt`eXMPJ3lmTZb)Lr)eafe/0q4HOodFFYEk0aDX3kQYMQN*NRg-37h5EirQQK0-3irG48EJQ*J?+)PXo[$sj(h]s>-'hJ %b9oBO!d%TJBR9in)2P\<e2,khjgYZEBapa*3PA1g!1hQeaAt@*!d%TJkTE@'Vuh'E"),%;AmGS-&UUiF.fH2kiZ:N_iP?UT.A&1> %gJi#M]9LY0,`:toasUqkdm*V*52CWYJ'b$>-MJa'q,4qLZ>`%CPYZdpg)kAbT>lce@@-O&H:grs`*)l\\2X+o6`kR9hg/p&rUaD\ %;FR_ElM'>FTlg&*=`7WRWHr`8YFjq'I%0S'3nqs5:lau:ZTT7B/,/mChs.[?IH:[@&-b"K5J#ImaC/.gp!_`+[Y7Gn7^r6mUloNl %h2:?[>jL53B76i<`qNP,p\J`m[rcr"T68[)`j1;FrN,bZ456HDJ$5KnqT@(Np!_""9#Z`4-i`+25IGIVaO")cA*_q9B0DGj<G>Ye %GF*4?F-,R/FK_=E[<&neg?r93kP+L`>k;iZX5B!+j'1:!);iKDM$0hT<8DE%@^X4hIeMK9)u'23Q`#WWps&:#ZeeYHhIK#kE3J.+ %.5eU2=j@D[;IapSTCo=8`YCl,hs4qB%bapZD5Y$FZB\XpHSE1aDf+/d\_#0]%5>GUmg&U`)*eM^c2RS6qH61j\W>),]mePAqH9oi %X]P6>=P`7tp"1&Jos;B_cfJG&%*e86>I,erCK8sHXaX%<R,,H)RsF$hn+CaB+5c5TqH;_@\))O\58>:=I=+8mf1ucCJ'=O)A]jlD %qACU.eiH[KdCk"[!B!'mH40KD=l8LW'>6F[L:=hGO1;`FUO2sj3jn4mp\O-s&U!DB5JN7tSSXVRI=.M#_b7K8D7\n&^=U[VSLn]W %O`ma@I'90+ZdUkJf?ZL]V7i)YkP+fjQ&hoLQ@TeJdCk"[@Cs$jGk6:\XM]4p<;uMr59l%Gg^1O2]m^IOapmh4F0p:5j*U`**(.uQ %IL;AMn+BU+f'l^)ijAN@me*n=LiqAS]+4<&ZX0m[.(7O:IbK88PES6)@<D8?=YDD[S.=WT?9da[rPWc(2S[j>mZMQUXLKUkr`LZ^ %"68laC)k/1hA[htQl_T@.jlh+BBEuso#CRWHP-bp(NoX$dR;>g*?Ru^SL_6e&h9O)MS4cm.Uf9sQ,"i4I&VrkX7P#'RJ/gO<mEgY %Voq4QE^,A<9i+!<BCFjT1ed_bSk/$Y)J*QpZP$)Npl`/$3V8"pre'!MNiIJ5Ap;"V3R76OlE]p6Hc@#b;jI<>X7(B$HgpM=O+j>L %rh=KV4qGt%Z"c;qSuWB>::cDmm]P.U/n<eJ52g#?0'eQ6^35t<F-h*4*2`0P_MN4/r>,G,c8&ntdW9VXEj3U\b+/4dl1EK?m-Qu* %-dP*l:G&a94MGMfDEZsoCW=8>Ibt@Xlp6@Ujj%pHl(`;hQ+?kiD"aIic0"pEaNJu*Q#"]UmAHCN$J5b,77)3,[[Pj2bMKrWZha1q %>rJ&%2.#t+<0sI'X)Ei2kB`$8A7MX`$bB,Sq+c8IZ^L*H&[=#M@(;-nfo4bY=H9cOCE3\gh:p!4n_SL+JU,p]U7]Wb@Frss[A7GU %EN!LfS450ZI^P(gY"A7r9?j?#g(V'eX>\Helr0JM^sHhA27"doP=8\Igi!L6c%m"QS2\264I1YII!oW+V-Ldu0([ni9Os8Lb=(LK %<%5(6W"nbVlmn07Hs@`LhESWbfa?nV".\+a)6A'!SrX?iii&77iAHh!H=hD$g!QTVc^s%M]`j;&pD*<>%(A,'US?S;(t9YJ*bIBP %U*9seg5GI/OCR?B/:8T?7f./m(haNeI'NGiY58BVF#o">O+R.&Y[UBapbO"X5:]/p7HT1,YSAWa#^Vg`?fgpE%Nb9!>[Ft9kC2u% %@aS(["NVD05Y$)3,%&"&"m&1+Hnilq&m/i,<B9f5l3f3Ta_*QH[bUX58A=kXG*NkPI(ph1fum45,j`pD:l3/7s,mRl1`=Z*P<')$ %?B_VJT)h@7l_)n+ZPQD0g'^k'@]pd-#p%El8H`$FNTe[0.3dNS"LN5u,@\2Q7BPf[7.1,U0#iW[O7A""aSTlgKOOd+R2!N$64;ZC %gbAYOR&tKpWeL%C:IA\aV&2!alrEPD`LT$/?R_i'#HIs,5=Z=$?<<1%YdrD\[O7;H*r4,uA%C2E5'C]U)BZ)%1@qf!c/ec(#Yd`/ %?<N]DRSf=Q?sa6gEJ88t6C=-6iB!%$iE\heJNJD<IR1HMh9hDc)nX"2@=ir<`S\$<:c3N-ep:\u!#5666NJH>XsUmB?1-]'k9%uG %[67U5'rc-c.fbnPWrQ9'k\ng2&@q<bb9%k`nB8_J9dElS*s=u4aka_WWQ8Hp*9lqAp=[-tBL,M0n@[BkHm`0nf],->3,o4R7f@Qa %l/HagrL"&opO=2.R1:^QnI/d[U)BtaZ$V)rOG%U=9p]5)-tKJKo_W']j@Fu&pgg")3KRAcg;`q_#H@7*,0,J56j3*f79n.b\H:Xq %M:m.kZ[g4Ll%.0U8Du*_Tr?%PQ(haTo+M4SJ:)po.o@`85>8;A6j%qaOqTME.!]Z?!HULe((4Kt`3DQXrJWs1Qg&gY.F_L\h(P@, %J/];!d[eP2>6*3RA$GT6Y$2GPZi6bqaCX]f)sN^XbKTk&Pbm-`Y@A]q9a2u"=.C`3RmG%\rmNgSEO+g+AAG/89@;MIO%m^lG5Q/( %TA>&/lO25;<c]=6#f'4;#kj1F?(Lb2i;DG';0>\P?fHW:*BF%6BBT&c9Qe&/_JFBP3@#UQn/:@MV34m`5RBNW#^Ou1IX6KNb:4Y2 %5)kYiLM2j!,4?5<;^$<KogFF0.g-I9MQnLWL:B;r5'r^4+nbgs`sN(;jL9i_0A&FL/jEr3Y;HP68<+@tF;h]^46XY9p+2%&eWDk> %R^$_o7VV?n19BiBLhAWY5Y%S\r<:E.6\+;FqXB<&H45gD?r.$c(m@D$X.$O?H*9D@?A[[nekS4J%B(t!-j.ngJIsU$pW='fn*q9U %`GkSLYA3ecZ&%h=p^/fseh@C&9('pZ@123I:kBMB&6<bNVc]VF#7WMG)"d]jS;?.KV:e7)9Emm[K?J$f&^hQ%b#RHi15I/E"lX7c %eXt(daQHb?6T5!RfnZ6L52c$s$pfP)*Ca-7i:<<LdrH:ia_VqORW^tK`@Mi\(j$$\l+D6jbb]^^aX<q@6h2:oboo+dA<9YcWKW<Z %P:rQk2(^&.7&S%@Wb-K-3fqUarR7rG$#$V-msZ:6[*=5Yg-7sY59nlH.5b3459_o(:**S5:mYq)Z/P96=@bTH\*(k<PSrtUeD;c< %,j(Q;4TpX?`^3_3"ouBB:P8fh@dS:[dtu>pc3r8RdmZ=MV@j(H2a4dO<omk$2+BR4TEo+akFUCmAm_#Xdc;[XPBc`H&:6e?pNVRp %m6"cX%/344co_$)*"s"g/f;F=G#,<<_]\[3ILo\:Gfs$Jf(U2Ard@\aFgejt0JCZ/Go!NFpaKWkRUFuA-PtG$KBCL"E&O<5fGr6. %GlGW$h*lC?O7[3h--"7W_oQE\Z/4p-3V.\Ybb0fB:adNB$J8C2c_tS\Z1H[5de-Gj$k#FHlA&M'pl4_;Hrs9?OhJAhdc1!'FRF&P %T6""]VpXrQIXlm?/6.Ho04O-885A#*cdCn7-O?!Oo#uHlGQH<S+DP7(;'0_35jc0U$.,<9TQMZKmQ@$Sfkdp6/`1+ANq;;R%&H`L %OoFlJMTtjl8+8'oA)<gNn9G9ZS%VIb;'-U0=/$ccHjM%aH"0?K45>pB(3EY)X6O8R5)^go[e`>a<^erJNQR:)G<XFI+oUK]CGIK\ %;cgh<l4e1Qo2b)[d56Qq!9.SH$_acAfPpt<ftku)J\3bDH[tiDhuS[K!YdZQa<DK5'*SV2ol'U]',(=mR1!I.J_`tshb.neVfV.` %2=mgBpHC@6f*2>q$]#(EGb5E'+YZ_ZGUY[M@Y53Q"du(jm@Es8T\hE6Lumo^R%"ZII53kbY+ZJ??BWuunhc2>f4@>[a=\nr^oq]W %V!frS&U+'%X5lFH"1SY>jS"g-JpeY;KP$9*3;0$QXm<3U.,aY%c8C<(-DV@FT+]f%itF!n]n]K.EmY^HMq\s+-,a;!Q"%ulW@EW3 %D_[XK^LgBnm@Hf5#,I.[`8Fe1iC(.P"Fru&aC;bh.8j_FG3A,*9a^$:42-PXB&bOMT9N?#Cj74#IX#=dK\3oZBT.Go*@Md,Jn^T= %jTq92]<IMWGW_h-!2-D[k:.ec6Xb5W8A?aK?Epjl7=XVtYon%W0p9EDUBdD.Yns%==;DEY"p$5$7=7Yej9/c<Vj]1`VfmU.A#)JR %6)jW67j+(JrsU;q/-oM#o-2:V*X=S\Lh)h9;cLk]^Bf`pG<_H'@#N:tV2AnTCHJ2)0@*(9;LY8T2qYNnpc@hEB`'&#$]g>M/hc`o %bS_JbZ0_@TguHY9Uih\n,>*%f;A-aHjPL3q/g-_IUaG3!+7[MXVC\Y`?CVXm]]8O^."q)!\=WZV@oo2`@r=KMa5)mSE[]/7B)U'T %fH#(1>`nA%:#CoAPL<,9R_jOiKh5o;'#k<'dN-Ffnu&C5X<;U3?,7Q2'\!b23Z<2FRn)n/)a1&cn"iVRNhs<4J"n:`m'no*%r]5: %\bD$JCc48M?W&9D/WXs</oMn?Go!AkYf=V[ag&]QU-,C@erO!g&*i,@fJnDVm=T-EgCrq%<BPh-f]rjXFe:c^VUY,1.WZF7HLN%H %?D='dh(64(j>E;=KCnhOnlj7CrA8eZk@Grf^$XmgkdK^(f@s&,@k9.plYS#Q&XLu>F^WD7CG8utl0H-NPLkss>3D;4:1!88i?hqk %9O<@a(o4@ES\/"3=_Z=9gJ2(e]LM/OD'uNLiEAr_D``4RS8=;$hKJH.EUml@HJ?PW\HH')^=FU60fuT*$C,72?U#a;Kbn*+8gYCZ %)!$99A1kC0TBh]_SqV*cJ>fRML`Vl"d7SSXAqIFi(Mm:(To4Fi17?niG]S38)+8+e"[F\,!2*!ZA_Q6G@Ojj1n-HXCfK)<GG>lF" %MS,frbgZ-hgMco@_^s6N)@'5S'DkQDhQJS;?9+RVj?cciOO)@E7m>ijZ)d";aW)q3E]H^K1MLlm'PF&6,Um?)g-ePil-cB%SeL_5 %3UTL"%/3>_$h^"O^beV)HKm&lHT^5aLAghC4VRe13X2!b*KOKBR\2cH)"eel9LLC*`.RkRS0VkXV\>bn#0D`oj[;=/GY<`%+oj`E %&cgcnDp\q!"MW#iPGGg4%E0[3^t\Ra8;S-M/;J5/N#7.s5"l:>#B0"VPRY`oS4Hoj*'q626b5]$_^-%:m3pab?.^m+PJnYAIY*k^ %Pq+j0'r'/9d12+f+/N8^:4:Ljj!2&G#I`JKo$8s4:(jrQ4X0oRc('jt3p=Pj'ViZ1q.DRH,6*%M+-D&%*Z[mK$2EdZmX[P2-ju`[ %-ikFg^4f96eklKD<c)9/Mfk7,qYZh$Ej:W;!6\D$\QD?.-s<s;9eP!o!iFTc2Rur%o.KKT2Rup[$/ge]AWr$pPTUc\XV3')P8BEa %1+(*.MsO(ejl0nh@u9r`KL7aGG&YqjPXH"+#:G??FXS\1Hrk-@q'SupLeB3]0j+['&$<cM7)p.rqCmWM;ZI2q,$,rPcm^MiBP6VD %1og,W>l5%?BY6PoG"SIAY1HQsLKrj?rcHYF>`:Aep%abk$7^<L?<6D;e)A?8TU;eno@CsYYaWmiOgYM*iQerde[k+J?dVK0=-6iX %b*J(uE<IJ`OHC'KApaOOfTgK&;/5Bu3:;rD.@8Wo:E%)Z3COBdD`Qd_5H_GD#r<CbVVJNtrP\`VJ&YUg+6ANVVq&6!f5(nOIWlNK %gKPpb>86q)7=R(1c$m3ekgB>tp#`X>::d9V.CTia6+oQ_Gj\()YW(e#Ru;<"iP59IiCD]mL#^P``OMm$([%PENIRX24:f1P-p#2l %mW00joaSY3"b3&Y044-lQq=M]eG[!@lFq4%]hn,L!aBk'Yuj!*a4qY/Kdd?ONSkBfk+`Wo5%A%qQsk9kbu'=:PYNL^$"0R&$,sda %hOSka-PXgFDD"P:UMM.:Y.C!6+rk7[W1/^m@6V\$h$gsW(hgib@2<7_)3tIl%';_X\/9sUmW&W.'b_$(p]P[]Q3bt/4i9OGp]Ps[ %Mo,Xa"m>srn+_.O*G="Y*D8)b#;gt*h=2m4:*]fL7>55&%hAXq+-4%uGTt?XiiM^Dj.^%2R-3Ifg'0`1I?oH2d9)c'i"\A"pkT5T %$'nZi;g$JAHCB^]Ptp?M=b^"u77Z;mRZ<T,VcaiT_P=PK@R+Hl,FOJj%3Qg919mM\/<#R_Ppq7o0SqK;7]T3%c,@M9N8i?d7Bed% %7PFi7J:YgRQitfoNe]VO[o=mukBY#>I$eJ)#+bfq*g7]f%5XppO9G>+)FrkL_sF\E?K<mPg+cH"q,D`0Za%"IT7O7'*7'a0W+4>; %CMk\.PWNnH?AJ[EmS$+!a`?0Zc[2dni#YV(![1jV4$*U+\,sc]@n\)(,`3?@#mnrY)Z4J,Y`W^4r'T'cNE4/76u85K"uTIdZ-dNL %MoH#nCeS@r)&mtC"$,!^UNUD9.`!f`Smda.$HI^D9O&VCcN!s"eI7!t@nfA5+TTDJ'.cM2+WcZ`8[>O[+i!D!QqR\0!]ST^0s&Fs %)T7N?X@e_>gd1NkK8-D56GLJ!#m(`0LKQO8U'"s1",t2Jf&9"B5e0^2/MA8Qb!`Xi!8YK_I%3G2as02@=fXjL[lk#WRD<!j@q(lm %X=-Lo#bBs[dB'D&G==mb2>E&lLMmal.)S'7!X?/cVSRA9]h]cQ%7DCeT882H2O71Och"r&S;$LSDmfHh`/de?b7i]EkZF4K@o8DA %(ci#a7f#Z\]jNY4#V\0VGJunP)Y"P@&"dhqSp6KD3!V/JA<^O[K4'8!'W2rS4G++u"E%$\4@SjBK?.tX&103L@J;:G)+5/ICkCUO %V2?<[YG6bj6NW<;ftt6:=?ls=WAC@k",gqT%ic[O`H[A'@Z\&#XiM[$,DqCpL&cB?`mGPhaDZD2[_D4GKet!Z3hZ!'iC!\kc*Hhp %JnYG2"8QBb0HD]P"ur-BAOWAl4@$gqa2&UmO$INT7r]7NN>)SA<!js++An5F!!cO6*+i"`!$fLqf`Vb6@g[qM'_&*mT]6)R`.@2T %+%6c?&jTJ%e8]oHW];d^JIi!?,b^;oO9-mK\a2'K*tb<u^a5F0MGg79:;R]dB54aa#-9j6>96*J:)h&<UO8HhUPObXBSaMM(X%Fd %Tu#6/cAj\?(l8;G!>Fj\d9IM.)!$Up@%oq=`neFUi>;Y/:=T>Le^ZQ)&0?-33Au\k8b=]B'X,=_qOWU2"@cju3706$Z*-F!_9UCM %2XuG)4)f$FLde&9i)'RNLHlsC3S[1=q[,/!lkD*B(aO8=$@soXYd<!0Mebj*jks2Ya@r=8!G@C`9n7KZ4KCaY-3JUr"F<<JjV\Np %UWB!``\b&0"_WhO9WPH]n1q9tA@I*<&lIipd4I$\;23]J#q-*$'J8"='kl13d]3FH&]b#"l2bFA.8gg9VYuq@8/"NG/N!P\C'+<# %$*]A&[@'d?n-hdnP0dUQLqBG?SPb2r,P;q@!+!piOOJaN(P%]:":$<6GQPTNMuj(^AjCX]K=^5ChEuPi4I+8[Ji5`MN;P;';5/!F %YQt523RCF(G_/j8`5+8cT^oAN`ILl4[K4YVgF,2bNs)O@\14tt9cSNt2`NU$`aElsGa9JWaM2@VYFGV0-^I"e<dp2J*A/ZN-X6+k %"X%5qCm7tmJCt"C^l%$kX["dXjAKE]Naoa*@RhOIKG0`ZjThL`a%dBe2\:A(D"NC@U*n%B@)*HT%?)hVB,(.Q0GYKsS<L6PcriO: %<pu@_S2Z71TIVbd"l]r8JdeSYL52E63>GD_MBPOCh*YKb8/I>=*<nOraIQ/;i0Ps,--?j=+kJO\m"f+YcqP`Y!'V;gImSB%B9=(p %U`^OS#^?Dar8Ir9d';5K!7npp^n!lXk$T+D[6tSFi';_-o$So.!s$=crW&lO$H9*>*;Cq8]r5Ft3"#E@-h&.LA19E3[UR$N62iTr %^qmW,T-.$NR'Doh^cb:?C"PNdeLq_N,P6k'U"_;@8i3@>bu+ic\0u->/RSYu?MTXY<k7=nm7:<8%IK]%gGI8h=pcfF-lp=CEri`\ %)l>#CM_rX@nlNXWa+0H1;=F`&83DXR%f-8KH'CZ.*!?a+BHN5N08R;Mg;1)S!!f;cH.$]OGT'7,E/4"CUZha8hRW%)P$R8H$2>#- %`dhoVEm8Y?EYU<k'8/UZgHso#TKtFL+f#fCmF0g&I/fR6CX/s!DXKEpI1mHLRq&Y%R`BFCa,/:#L,Wsml&)%<j)b3)8SF`h>\7g+ %&:XF0"["c]r:-3.L#)*D?]<*oT!#&\0O2ig7R8FfWi!qkcds,P7VGJ'6[-*>B\S!@R>*i:kae.'[1's9BlRDW&+B+pV=mOY?H0-% %%<&AGiOqAs]qtU=ZO$cI_S0(?_JD8?X*0ngh+rB%\P[0f$Xc9QDD]qbL,lo'ZX?Bm\:*g7X"B5YRk5k\X'gm^-/9hS0QSt4a5s8. %N#_THY=sb;`mu5M]$0W^DSF<e&"\T4@LPH>`OJjNA(OcJZ=4SK`X"bAY;VsTFD[5#S(jdZ/krj_FJJc_K,m[M1\PjY%fFikB`pn` %#NbfqIl4Rs4Vbp%fO$JiY&SP$H$C8FMnZud^Lgk%C@'0uQ5f)b0nr`'faF;-U>#a;W#&Vq/eC(`[a_KeTXMGmfb`lC4^XlZgb1UM %iWU$-=<M^#'B[d-32<G/?b8oVQk[]\,$dD-Y<U%n%K*uKbaRtWI/COBO(l3(QTm#brmC^`&0W.*'^mNX-h#jbi>F%A.t$p'1Q:'I %gZ'6Ed0V%hd7FS7Z+oDtn-o2l`Dj&\TTRL-QEIIp)P&P`)P(sP2#:GE+r]?S*IR\K#La1c>3J186kjB759`#ePoeE>(MQME.@ScG %c6`*9+OGU_J@+J37XBNf'8[chZ+OUOJ]-!d%Kg^.'6leQ2hFcMe?'DhP+C]Om9l*lV$R;e^@UssA[@RbI+f?A.el3c($I1(rr+:% %g\[?--@*m4]fhb$CT,6m0tr[P0Eu'X&:m'-/kc!;?s>/TL>&^tLhIIg,Ii;Q`'ePRp=9-1QNpVMUY70:@C04Y/'c%Z3lK#]DV7ie %;IY.W<\kiUI.kK:ON[tg#-fk`$r/IFhDVap]OZ*u%\`3c&2kAhBsqo*frE\H60BoYHFC0SDtP9BRN)r`d([A?7nqBcfo:oMEJRq^ %@MIlFNp-K?/]GM+glAn(btP!J%mjAm)%o6^c-u>aT.tfX>i2IS:)>V#cchJElfpS$"t9[R`jk%XQk##LS'@B&pMm>;RUJP/XLhgR %b[+R$3Qt2I).2IF`HN=(8Db5l\FC_h3+qU#"GUA(#d:5;E/Y>P*6:=nL`!qkYn(LrE\N:qD6:[+0Rlb``,a-XMNBh%QRTV\BA<?p %nY`djD>fAGJ+\$CrUG*Hs/d.V^\j-G0E:h@[t"2@)h'gUM">>A_:<EeeUiQ\fKG(q&Cf`:3&Q^n0Zu=]S(U/o`A9E_3Bh;$8s#J^ %EjT.799$?[h-Fg^J07#Sf%T5^`Si2A!O';r`f849KWgk>;&q*PB>f&H.KBMMc)a0Iag1Eb"$9$#c0L%RRsj-S@hgG5io-ZLc9\)\ %]Qk,IFqsALC9LQPP#$LeWa#@eKmWZLU]9Y8mE;.%`L$W#57R_n&`ITiZNWECff$utA@+M,SSHTp9nBc4^^S2&P$'*>%VF=2Y#ZVI %A"^9"\>B`KY1pT0mk?)Om,$V`@sWUk`f_A$eZ9e?j(qXg))-3`Q3k_SeA)4c6$R[Z<Ncc[j%dI,$0loNjYEO5'?Rdp0$1V$KDjci %!IO8<P8&pKMC$,E&BBl?Ba<mjLDi6lo<Fo$fjeY)`!Csfr!G,$Kr5S@2]Gr3OW'SBAD?Vi3ILZnSfV&i((eX`h#IGaV.9:R%k&j" %s8=ZTlqa%`F"Dp6GX/Wu=1<,`ch#ikM];CLAL=+Ee`o52#(t_gVB<OR\0tchrGT;1$_C\ZTUce@;A7&t]];2fG@Y\qQEJn45ZZMN %"t2&#+PBd1QV8hB],j_Qo1_>L1-KZ7\AZiL2Z:Rc!i3.A;%[^Qj8rWel-@mE6_(:3(!])b,>]T*h/1sULoMK2KZ12cJrg?6XV?mu %@;6pk9F4?O'?9(J!eaSf!r;DlIg:O0RkHo?Hf=[d'$,#JE=P7,p4J,")&peU'kUE>k:cs(')pY@?&nYFr5<bs9bfbF<3]mVW0o]- %k)jYNU%?$<QfPj</X"HRS$GTT_X4rIj7!G_k_hnc0V\UVJq2R6Y?"&o8U1Rl/9@E.:FD!=VDOb[hs'=BoZl*X1IdS??m`Wj?j06/ %D3;S;"(R8FN=CR#d26$;;M!N']YY/3$!'.gY-K#M>6?rN`8B@!K-+uRc7cL?_.\_"^!q-+1hVp?<Rt.B5S&3s:i5ut>QZZMN/N<r %!esOEcu,Y2HRf)F"h2<?f.70HDaI"/#EHY:9a`t1P86m^Z>T\kJiKRWjWS@M&QD0+R2o+l[9`;3_j9d'Ckk\(7O3pg)Ah/<;rF?R %hh.J3AdgkfrA>PQ9`eSsVd:FQA9Tk\d/hB,caJ`]74iF+30>U\A(F9m-ng_t$YSc"&P?jAoK1oNRFg$sjHVtu@q7!#V.irrW4CF1 %BgGQ'RR49U"lK34#LQ?m%iXF^]:G8pSDggZZ$;RqUQOs4X^dXq2cI*`^pUfS_PS<88%3^+6C$Nq-4V_l@[OoJbY2?GgUPZ'i?\`j %K*#6&Kf#ohmBIi:#50(I)ZV&amC]%:nGTHl)oQ`n(?.31#pu40b-iW%h[bSrN/<e=jgk?4hIHt$*o:uVk^10-"5,5RoZ5ZD`=CW3 %W&NG:Nj`)^fEBTiYOAK@,i_,sX"HgB=\RND3_N%\,nIh^Zp0oGI>Y7e=F"Tpf;L?81Da=?_%MaZg@+,+kISc?96+hd8%#s@#;8'5 %@^uX%I?%/*PJI^#Y+PW9&DA[ZhLIXgG,K$Fd+7Qd$1s;RHaG6=[I'?+fP$5TrC.s-[IY%4#<6uI@Q0YmW45\"4u[=r#8csB\-2E5 %@thqm-5596^Iem8IP!2F=XhI%%-+4_@WkBc7,42q=_8C1*N31#c?4"hSJ4Tg9uP./*hqNMFf)o2=Lm+F1'XE(H1FC>#SE)N4./bq %%@`k+;PPPoYrpB+@GfLOF!62iA1di(FZh-+3_hSe0`K4<@R5ecN)dh=/%RRhDT+dge@MdAX!VK\K\4A1p_?gM!.[$Zh!^oKaBW_1 %I/M-iJXqUk\$#r/Do<.K8UP>ikI5U7UpWeicHKhTB7!t-cP>fUs8$IMJ,QZkqLRZ+k')<$q%/AN5Pu@Q0DPOiDia41+/Rl`n/883 %h\GL:UJ/cZ*f1W>bAr8h/EF+H;\^D@+p^7'^`G,0Jqcu#[,(B7.9$u%#7i#eY5Mj91,'&$gSb`s]#[GkJVGg#j0B1N;2@3hJC?:L %#q-dsmmTS@\aeJqb*G57)rD$]AJ/504=3"@M7@`lVp2^eS%ARRh*D2*Brr4![VN<-09b6[_7'iU#d-l1c0>?YfrAig8Z!0U8Jd2m %peh1fRJ\=f"<<PCP[kkqQtpte%JIA10A<@`_\OE9i[-cuXKDH=#!-q!f)%SslW2EY>M<RM&mD/<C7UmYka?7;D6#]XTVj46#m5[n %im7&V7'i'"Stf4C4Q?Tr0'5f[FD+!p2HpNP$p#eZBejht*s1;?.EQ1Rkbj*>#EMU_-^FAp;]cu;&ZC=!a@pCk7gHgoaZN60JB'[l %*]1'!_I4RA<hbG7POt*4:$c$BaO;&EKaXr<B@0+uJ;R;eqSgkH+nL@@Y!@#aq!j>"K.T_Mb]U*qZrc\^_F;K@'()UH03uNH\GLDh %T6Yrp!$s`+.s6jSZujB/Q):bV'0LpsS$je[h(CsI.rc6>B)f^;d;!9WFA#2_9+uVY*/WH;n^@P;%#efXbT:!"KM1)5!8Jr=!bO%e %d49^$j3qM:EGht;hI<a"TCGtBk/W2;(UC[c.`Pn:B0q[YpO&?a]L6UY<t8p\_SXDW2!1kQ'Ne(10bJuW#tcg_3D,"h%Q+-I(>#of %[tf"\X;>`>6[4d-<?`U]<gbS-E/%YqpLskGG#5939d/ah[`b-Q.oYC`K921#oP3C,j0>HRa>N0<EFHHp^?i%IhY6l<>4HaQ2V.:K %Cai2*p"i*k(=8A[H@1>S@"BJA=O"&^..=N>H'BQo`A_(0pK?MZD30'W9\\'<NK]8GR#'s)^<5HcI]6#f7j:?ket6g)4^RTin$<3j %'P;>EO(c9e;-GPO6Fd+4pc<-$;(%YUm5,&DJ.$u?rUdNo>Ko\agu^03<$AAUm*=jt,E]0%+mp.rE?*/96>P[kJMk-tH/GO%B'O'7 %0hWC*Dkbcq+%'#L)<^<2k9'JD9qA"h):Y6_IFTuhqkRZWe'A=p:)W/p@Q&rl7bYF&7.OaZX"DC:eQjDO;VeOJ)^3:Of.M"=X;*(* %2W6C5Gg\Xf?Tmm<qk_T=LC^rBp#XFmSr&u$,;u`LhXkML[!NGdnj5:dhNYc&`R;u4\n?iPb,"C*?.u1eI;Qe8*Q=2VhKdp)NRNlZ %hql0u;X$Fe\B@p!K#cTQ:Lg#d.1)pgV9=9u^;uiS#[$WmDhK;I>_9(0&97l;&L%uhl4,MB*3+TSJ?TTcXf&6g%+Bo<-,AalYYYY, %W5>3<-D.c>6b?/S$-%aF+fDHRlH#d?JYYr[;,4@(@een4G`raM%T_d^i[6Z#&-bd4('3ck'NJ?U!=WWX8m*:.7>`SK"a6,>>cMT( %$26fp_gs=5*h2JM]kG=1gQDuj2+p#f5[[LAYkbKOqc*6qF;6ssMd@.*7EB'EJ]'EK'r@it_a0ELK#IhB95BSRaScP?0Et`_DYf9U %]L_7mXDJf;:/$o#<MfT4V.TcS@>e"9M7>m=`FG@2),NQ<&ZV(M^^/'*(-BG)pc(r'cmKhNn8716aKsK4=c(>K,Wmdb.@_.EQJ@6` %)MeH`UFf.gUg/H98`^-%ZGW@L"@T&UK\#TB5-6Cb9M6FnlXmhDA!I"]A9d+*7csq*jA&>0?>'#3-RbI=Z+/4&;+]VdWeB=CE@.+K %XAe6T&*/rn-N&XS=b%QdlZ%Sg3@9uj+SSZrR>+Y62up9apLVKs9ls9<<bL$;TJb9t?kZS"b1MSYg7R=(Xc"1t*BE\lBmBiFW_HIe %EkA;c#(4@fctU>6,S$>F)0NrF4BRbX"?_`WTX^KHejYEY[al0<Q:%[kj8e.n;S(@iLCs.'Ch5%tar:O^]Pc;Y2CfEKPMGfc1^@Mm %5t<AE&$OIZBe17WBX#WKSrOXJr%N12cqu\Ms57`,DDM0YNmfcBCc51:*aZ$gq_\9!`4j*q'][VN:\2mO;,P9XYX#?/$7Z`h!QY_0 %n?Bm,HNP=]f/rHu1l]0&H=GU)gGb_CM"N;eqGeAs,;:"gj/Nr9JcPF8)9ocn3PFe.QEtn=),;lZ6nB_)E4@;CR[YhXWhclA;/-`S %k-Zku>#LJaWO8gY?JbEjb@sXAOXY7R+KlhCO%UqS"g8E78pDQR=5S+p.BnR(,R!W0cHACg3JmGUAifAe!It<1>=D6M@__aHlUDP[ %(&\VrlALJhA*.4c+Mm]]T@1<mMBK^qb&1.k.=]^qWot''Apj8t<Zm*O7c]H<S`/M3RWWU=rVXCU>%8c<nO18VPqqp];af`m,XfGM %Dj.t0QKu'h?6=P>X9mEQI/!<Zq`\kial@fbbdF3aU.KVX"KdDb7D]6/Hlm\BJ<.B8&]MB0jIE`omUrbE@TOP-LTR7U!"BfEU-s_k %Gb1acW9>'agDc"/b\iW.!F5\R#SF\+JY4\R:PU6f,G?t<RP?Xq9op_7aTjFXlqQ5$S>*+XJmP\OKmYmS<lG7@%/P[`)6cFAf'DI5 %%E[YY$`P@a'8e;t"C!@>$)J8/PoN1d3)JuHO\U<O+B?t%=f%Rj%]r7s@f:G]'8G&u!:r\!=.rnP8j+Ks#d![(<A3&UH-$)j(R>jp %=-:KNCW[p::@1ufe"nSRfJ5$ISY+gG1(,N&r)q&k$SJX)@p>A+OsUn7/e)Z=M9UQLFO)$tE,[#d+7Wb'Y^e]s,ok%K@E%@"QU.m% %/Y^V")R8G$rRAmN]k-^2@K\`PG!qHj3QTu\g8_[s221"`D=e`7nqjD.%'b_\LlENtZrG'P!l9.e7Q*?O5lR;<Z(kjbU]9@&P@Uns %AAT_G+`m,J_;.[Tk:bX4;IV)1&I&<sA(QmhTWQ2a][2at3:WNP5d_B8JQ9kdOnMkT&5`;A&bu8LiS!PETZ*bRo?!P&jOGJC`TRjh %Dpj%9:?IA&lVJm6\L\Z?X(,+P/X%5-*mO8%kB3DRXZ%G[M-//Vj"u#YQ8)k%26U:C+g[mT]\!t/e_L:/d*&TKT3h8+0Hf'cS<A4@ %"en:uA1(l:XiB_7G%J/)0LK)YJm8N9([uTL6S@j)7!.8\-KUf>.rfZZ,<Q8"Xu)PJ/TSqlph'0:[IqL;F;ZqB>$(2Hn,#Zk]Bl@D %ijQD(jA!!N6mF'T8qj;h7!9W7^e&RC?o")4L=PC.T;F4U&"&5dM((.U9f-,a$:4%H$443ZDN)tW&fe18X7XZH]^M$gqUKRHM)&#C %daVC%iL<&[/E,00pq]k<SRK31EWM[<=R-Tr6NSEkm_!knP.-4SLWT!!+92RpY7AY(]s_5P;3ZJ4!^uqqd/pMI05\8_'eWM:1u)4B %^K(n8g5CaQKU7IGMQD3/SbDnV.&&&YF/KaAYJf#L*=0GeHO2IH,V)iKU'YF<71\c]<QWlj0mf>nFV3sWBDG#D,SK(U#skm2?7q0- %qHf$/^)nH@G"/;*s)n@AFarQUs1!CnF<ga%N]!GXpR;\ZI*rOTpg3qG_>F7H0;R$+e4m\P7&#YE2K&P\2I#_?]u]D!$Ptgn_X2C, %JCM#mlN7kR]$a;T[DFs<q9L0[KN3@sG[>Pcoboec%o-&\H`*!G>Wn)uR#/7gW`&n,gcS-^G"P;1>.s9:=F9[$+H^J&hPG=P(QE24 %_@PkAnc0n?'YW1?%gb1PjEi"8':\RWi;fB+dq+F"4U^_dj(JdmC6(+s'3N28H[Kp:$&F]oScG7e$07%9F!`lg%cg)sb">ckbU*0a %&8^V+1;U39P+?,j7Q,9!&2Oru4la.OqHBlNeNJ+%$fP#CI212Yo7ug6O`mp1JhO7XVV*DqCdTBSP]&uN6&=DJ8hr'&&D>b?K!)>\ %]mruO312,trlK998bO'M-lDK^aT0cKd&#*llUIEW/KWm#XaB;=F;@nD^@5d.Ztf4!9W_]:i'AWS'/iUn2uqqc<H;"lD86h1L-<_5 %#R$h)8ma"RRO!4=g&p<)njZp10NP/J*bbp/q7VBJe+-87Gs@u>J"jd,7%p!F-l?$7MX,_K'ps,l56^/!j)d*a2(-\6]^DoR&T"Hu %cD%dj8NM3U@)A;WEFgRmS^P(%r*j=cZ8R9nT;3QKYk:%@`ISGf,\;0"=C_>bQM+L`@"HID%\uUoJ-%SXGRqtf/[M8JBG+"3@!&o2 %6?RegRc#O<-PUc$huoj'E?k+$d<UepPJa(OV(X@>3rAY7lQ#XL20JO8;JP$][NIQ."l'H!UaD>%cZ@\S6N>89o9C$oXb>@RcTuRi %Xp5#?n3ZD7e=U/$,lrXu8SV*n)'bIM[ZRO@/uKhWOEA])*&?HU5gugDA/X.=rNTit<g2.t(Ff$j"$Inr%^r\I&,[)C77dl=s,/*R %,cHj4:Wtd+^^ue+CtpnGma7V$&]lPQq<Ro%jt#H4(R$@p02WLnlk96`+Y-6qD?HLT?oB5u7oK$\V&O1mSZO)W#?%NB!:Rr#VYWHB %Dn]G'nLJ5#"f4g5\.CXD/Ocr(&/G_>Kt<LGj`(bC!>Juc:fO9J+H)J+%]_k*-WRM6;?d1cq/:jjr$Wus.>oM;/2n<oi\Ooe=@&Iu %10]Q$@7nWnq+MBALf('$?Jo@:DnB])V5Nm69cjeZ?cBpLS#=bmKUMddB*DCDPlX2u,#hPelV4`SBT?c8EhO5LKak*.D+#$fL6f.^ %5M]Ra"Dl&0_@[CFJfIjNF5B:?_V-6t?Z^$^;GHa\(_I)#Z0Cu(YGJ7(eCkLQMosRLE"78ri"&rfqus95@'[sqH)5gb#_U)m3&'kf %Ta!07hr?eTp0*<D;RQisVaMQ+g(2kWSif9V-kR&c.'X\OAYqSCnos#m?3?J01kRp2RDC-Q;PC%I?0=M,g:o,:AL)QW=RrgsE)C/D %8WG.F2Q_9LnGj=./M$'LH!X<DF>V0R/7p36LEt.2_(%".\3*ZHpfmtf_<ra"mpT+YLa00lb4up]R8mTWo.;?mGP0ZKS!Tk"2tiD5 %X*^I!D]\J':DI87,.OY#Vfm45`oeC^O-^UE3bkH<(L><7S;o_6eBe<'UNohP.p`fMlld1uMi%;7]EI#9#dRb_R$qp??e'H+$p2rc %g%qOH7A3Df,;-!hPRn-HP=<Lij$:K^;+-`-0d9<#*e>m9!RPED#>Oq^/1((PZ79.(-_=7WVZ^RnnN#3ENG#188N)i0"Tu7l;0=FQ %#IZZZ&Q%PGV(Nu=oWlX!l>)mX2L.klRs[Kl.qHfCE/gYgnseRhJsFQ>:dbrOoH(<p;3#I-H]]$1g9q0l;!!,!S5H*`?246,GHdf. %PQE6[a$V0HhMg#Q?8ru5%OoOKNc%&q@T#h^3>3Bn7Kn.=pHU76duoRu5Z:,j1p7DN[(=^7UF(lbRc^b7VkflHZJOJiTYTiqS%f>7 %fkFGtVt"%O<t^.PUi%53%6Kdl>i_!#ZSE]C!#5[cBI/7SkCFfh)HmXpiA#'.>5bI;93!ZN-dG))\)g",c>!SubkXaT^6.',73\l- %,&#?/B?bE!QokN1G.I[BhIR4)FB,@hi5)#?kGJH!Dn+8BB,ZA&?0?jIa>b>04O&hKoI^:I%O>jf;J\f+@oX1uJ\ofNb"5BHM`kDP %pA?p#PhDD7TRed9Q@fKZR^upcmR9"0&3ET3O/^Q2ldVXD.?W]^.Y_WS5.'A6Ybmh;`o+Fo&LF'k`Dk'WPUuR0$=MsNDOoV[cVtTK %T0VFbVT;L4@hG^5Ci((h9tK1.&NqUsKM6GSDTa(fkMeGKAb91!IoJQ3M1#:el8=i4HBtgN%4kE)k]\7e;9q0s]I(s@lPrkMAtXjL %WdL:b.)o#)+)fW+g+d4W\##u3+sO]YqRX3,qKs;'KB<h9T:iCg%=[1+$$@djh3IW6>]c6m-1>qs&efnE"i]s*$KH]VQa^Q[H3,O@ %GlgN=Rlo@SfomOohq!>:UFRfCpCG@)q9IVL@[g5&nR13V^cbT!O=d4)G\qp1dI<maqp&(f5nV'<.JNi^G+/PB30?_Zl&20Ua6^V" %#>kj@P4b-LmeJZC15U5K8U`di^mKVV443-j:fF/,49-LG>BZoA]Pk3IP['VV0&Nu:"Ze3"pYqq/FrWXI%c`t78$M,PP_6%C=SuX& %_*"@_9fX/E$N-kYc=KW%1_]2TQEp5$"`GS6mL5dTn:saq$0:A._!TjgXi9!+<74^O$R&?o9j+U?oiX^QE4Cm8s)-g=TR=E),LLSC %YZEMn+XfTKe_MYeYsj_S#,8q%@BfqHS%9e+l<,A@+:<gT)Y(;D=d9Aj^CCA\[uK*^8\+PF.+,d\/-r5Tn="K@j86,3L`5t\l282V %N^@ZTKRL5VHtte^A@*19kYu0+.*Lc3'/<mi1&NVKU?:_5C_*4HZ4&2#ac,,A:#t!:'M_cK[W0iu<dE'4M:<Yq9Zb512QRr`TT#Wg %S5=pu8DmJr"3b.YS8$*d<1g)R_G!%FE<EOE;+N,'=Kal*Oo5\0Bk`cM_d_rVrK-8U<GYi>6&OHjSfZ*Y;JZWO6IG9^lSD(k'NF@> %P3o0#%]=PPEU7@t8GS2,.;l:CMo-/kY-^aVXO)PH4f75h.&^JIf%qtd=:A>i3G1qWW$kta!AEI[AW^@j\IWui82ml[Rt\aK(DOGg %*4=<A]MYg5^.B_M,u@e6nHEJUJfU>YS,*`I^'fILd06Xo'/lPWlfreh_$+uOM;C@W(hP`30PX9j"^=L!Bj-dKf0tI\#l2jSNP1DT %eH7MnT+hlAan+1d='D42?^jk4&:1/17@B0854r<-H/=+$dJgh(3=K\'WMAg-Lk(O_[i9-X>X[OKhdC5?QF0275gW*q8k_"RRD$J[ %Y`di5gKZA<hHJ(t"YhI#W,&)O$oUoIDQ=Gm7FY@$Z;&l:RO9IU#)^50.aBeheo/&UOWX;3;&MCV%W9O.=,[NrKm@+_Z(c8X?laQL %[1Wb%=C$RRYOR!!)R7qQE>;`'_C'nU-M?4).3jC22?JJJM*3i.9>fm,f:E`HZNqLb]dD=:@Ut](V+6*TT!,=2X!<e/k!@Y5M'i10 %d'GhkYI.6Tnou[0%PQ$U_+4-OpRd%,rNG(bZIMh"N+rV18*,@/T0s.;@4Ne3DDu8R,sa8SlfqCB15/M%8A<eZ(j?5almr"a2]jT> %m6CM>]a[`]mOaq:n:/2gs4m_rB?gJD#>H"n38hWU"l53X-X%e!G:XADXc/1%reeh)HBcZb%=Fn$n:RT']iY@(&A;]_9NlbVX/3Sf %e'dso\8%jYpU/GGoP-_rBIh)Al00EFC\'0,e'BRnf8K:g>rR6uqNaGD^7;$<\Op5g#N(ZXBN().Sl$s,CM-`.2daOBq'#8IDrS6L %nJaY9IUDN$hr=@DI!sC$5V:TD*gX)Y1lSk1c-%iJN7eTYi>s+V(J_'K9rtlm3KcA@4l]u<C]AfDIbAlAdWPJ4dID]g`K+XH5M*&q %.Tgo^<T'[0Oqb]"<ZSKjh+&%/Hri]N42^/WeDJ\3*NZrId$*J*Zg'+'Bj2j[iP_W%LkhmqY)Q#LS6@5/<q"AQreJ#VC)3W*T_J3< %A3V;"2ae*.d0j\f-r?e*9r`(0,%7;*c-L-YXKQ(%X+EV;b<q-'FeHTL<4m%;I(2f@)J/]udA(hacm3$\]:Y<M?cj5U/%M:^X/\G: %U*lK^P[[M7'J<o2GY[4>It$uE`Wpk/>ZM#^KCU5H`9ll]f#p=[Ab[:$ghW8`[HGtD37Q-2H_!$E[uW!jIc9:fM4gEh%r*KZqmDX> %HeQS*C`LC]FkOOjmHIMJ@u012Ud-AOj.HuEYU"K]D=Nek.&L[EGUM3Vq`qNHm(f59g4_1Sd4Y)e[*-YkBU?]Aqee;'b+_ME5dnf@ %'at,L>CC=2dFOnq]-bi7;=al^Z#./\ZNqD;`ZS;8#HQ'Q=e#3Pfn3qb%R7]t`2gMF+F#%si`DJPFdJq^[k^DZ?gSB;H5*aHJaE7T %??VqC/U-h,38eAH`k[/<pr`N%^k'aMAH>"=pGd`^RKH@h!>4ThTrjS!:<@>rqeh&-&-/G>.;LSaVW8p4%>=?8/HV15@IMnGr?H&E %:`I<34hF\H1e_UtZ.BDBV4U1P,fWC.j:6h@DdI1ZGSj"qki4%L#?`_M+SEdoKB.-7#H;:m?msqL5Hrb"MIkcNJEU4l7[eX\Xs6Yp %<F#M,2tT>m=5Q4&=+C$r?Th]mlLj.<hl_G$ne&)%bLrp;ms3Gjms3I\mCG\Rd%rYrT0NOm9rbkico1R2kl%*7_$[PFdT-D*8;%QW %+`9YV:Q;5[OpV_.3m%_]%=lZ#Xbk#$>5$!/%rGa7PK.1KjRV<.-ZSnQ.i#I.]q=5\7?5$N,=`qdn+S"r`oD@Oms08Q&s?]ca29nB %mPsSR/G+6A=D7`e`MZ5TX3b^<8kEEoi*SS$,qiq3J\V@cmXA7XT%uK0aocgSpZOHi'\/s]Hg@K^D-C/)V7Ua4!cJOSZ!(,24qAVR %&$Issh@?"S_[]tb^9^0c?Q?XSfCqWBh&ga8k.@eGf6aZ"^HbjZrgVmQ]]O)!_WTSs):C]\GOC],nN9_R$IFhEJrU)0"R(B6k_=%( %\tT)$k_AqbkQWmHs6Ag&Wi,8Q2s:PI>&j9<:O_n35@/\Z)=X<\9A..S;c:YCs5QVEa87MSgbAMe"3=3"?%^0H)'[<);(5,Q_f,*o %Y7(<5=*MDA;d"KuVKQ'VDfU\DDrtr+hK%f0hECJ$q7JYQIG";78f(g%/l`>NQhQ!+:-SI/.eo_>)LqSUOPi2PU]8O+If$lem=4#A %kS+H?rWkLYr@Od/eiYUaXfu)*'p;1ipZ]3gG'@mg<C>"EGaru,FsE-\\OsdlSn*4-<ar6S$SWp^8^1/%]=3*uF+$pN`]ho8lf^R0 %8pLp7Tt2f^K:l5onDua1hAttO*^iQ0,sj1OgUr2(T`GV<&JGgk_#[%@Dh=9<14\(SihJ!RgADUPa)q)S5sA%B:pUC6XRC\0pTW"+ %OD.i\$"8e4#e>l+JTbA.ce+-`;"s[&`UfZCm\##1AFL!L5!<.J7^0B1(4!kLn"Q9FYg3tHH4NHXK=,%UfR'PK>MD21/m?I*c;<h< %,&l89m$j`^HEmiOEu,@<p1/J*#/%IQYXWI&Ya7T3JZ,J.)"_miA,H1G#k69AR17Oh9'bGA*cXdT-pW_]<%M%HbpKhgc=P[Fqe;dT %Z*TF\ipK8Z+6/bfFA8dQP=U24V:H.-ZsHkOR$qe/%Zi,.L5YGR:[:`l=U*2Cl+'UkOiJ0-FQme,F!Xj'IdS>FRlIuo,P=L1F^/[: %['JjoTRG><@c%D.\oaO*/c)Q&l#?pX_b,K@IJHh]VE1;BV-N\>n@ikCnNpCE4c`.En:Ws_HhE$<c0MKEeA$5j"L1+ZkFF:JO&oLb %Gu5=-L`oTuj5AemXIrYC(e>`RHGlJL=b;%)nEh6PpAtER!K,32nc`pFMb%2?lSGP(!T-]<G,"L.V)]#]J/]+3_fkX@IrP%E4]Xr4 %0qp2+D25OhYojV5d,-si#<o).aX);UY+7:neIiV7^@=g5PFr<u>G[,\0,L:mBr$Lt@=mG^JQR#MVutr,<jX3-V(>s;!`YVmb'Q=1 %Md,5%hd^-+T@)Wun21VIn9,nJ]a*ZeW9*6=VH'g/1IbR6J\>hP%Ju00*$Zki.2'j'rHH4rWee(jH7.NS>^tD#dj.+E_!P8WEV4.: %@n(CZ$$3'E2G8!WQ*<Jd.U_G%9riJS;8>71*+]X,S#Gi)jj*jpfQ@bcG&e0\E?;3GiiLKf&.?#\LsUs8f7^#u[fF$2,2THM[;$sR %bo+7AqE++3$Op<:<BRD?.p$mNM[49qFK%0'KdW.Q:Wp,lXO$m5r5@O]W[gUiO3egh=,S7a'JT'Q9N3mK>C/Rm+m#c"Y[2q\N2Df9 %GQuur7FQ<M]qa"&8s^a6W-\\\8@a*6[-E19rd?4m^,8n]]YN7UmToOWgEsk$:/B)d%?Z0cF24'f$#N4q[n.I./"DWE6>FP<ViQB' %/U9oO@C\(fXbYFf!imNg877IA$I41d&_rCM$Yh52')5)m"AX8QE#]Dh9q;rUQ`(Ym*7t)_oGPQ\T\T:'n-`EKL!qEfrTOeGs86gH %kIk?@=2=Tg.c3O`n);a/mHP/"<[Ggm-_hhFA[l1!*lF1>:TNjGTs6J*7J0cu/Vt+g<;s/t?4()i"ubrK.bCCQ);P<5Uos,h]H/2U %f&oFV$#7=mU:BlIA_"Hj9l;LT[559heq"+-h=*\@#94DdV(d.-hFpR!`D=M9EYgu!\P<K+f@"@GEsGEiDc>u"jq\UE8$cZCpIdh\ %lc3EbN\69MAl*5UFq61>K;i3tpG4f/oPhe=!UO+.'!oFKXlM)8dr67U;t<Ql[uiW38LU\XT=Bka)fbdK*14olcOP-)p%VW=j"<*o %^q%R#7^J@Yd%P@oSpB'VoB`0Qbd)F`N`+"R6FWP)]Ihs,cb[dl;9I_$ZLZuYS>[4%?p.A+GW[Dm;O(KT/+-P=n!9K@%*?,<P\8Vg %hn^1:J(E6dWd4d+[pH0lm+lKB\X.YTW"-e149Mb%\(W@<dT!n/B!(jQ;bnI2RWHiVA?cp('2#"Z:/IH.eBOPLQd,<$RgZYXFSVeg %d1aQq7g9eX[I0@uBOUWH+'81,[SPD.Y*f'TYkW*E-SL],/D`1&<emN/g1I+6F#!/:PO`iE7&t[29B^fSNsV,KfB"#*"tdR7>,JmF %9bKRlLZR4dk`D^MD1)\tj3PEL&-J3rLB#.)pF2V*e$3(>!0p8[[o=;4mP)hgki?+FOJA@gcY(Vu!-MtH'`lQT,9)D!o;jsP-T!Y7 %2pX9aF.0g8P<)s62pui(Si\I=D%fn:,Bs1=RqSDYVd.*GO7ABRGQI9,>p93R'B#IWi8RMAGT?._-#1c)3.)OCqYqJGQ2AIOr5!<G %-PW"od%HV&%QmmiOY8?#[q_[hd_n=c]UPpM(K.osjD7*K@RQp:")K(mFK`aGriAOj%qdYE#7a$+5rd)2]q7NE?2XQVlkim>W*/nA %G)YXo?c%R`EW,T\Kb$78]ZK6$^O=H_d+5kj&d=WGDL!mCp'Qf6#.r>eL&8f=%K\@oG$qi`hAUp?8u`QiT2f$W.'_f.Do;s._I&h< %krgs,?[@%Ns-?[do"G&DH:R2tD4,\mqhOqKG*d)rqE<@?q=BuinY-skT6`QEqYB)G%tA06*rc/nJ,.Bu`fABKrqPli^]+1Mra6\< %^V5!jp:pV+2rFUms8@0!rS`h;])V^N*mR9SLG\`W>.XIh^HJAGs8;B-j\o>t<G[ah.R#=<Ps!"9e1SmuoN5(jhBpdcT6:i%A(6$` %fPN(c(*C*H2<$]gLl8#OH9*Pgn$.DR.@(9L;U3piH=;E$*<UW$2bFk-rS`fZE/Lc8dhIl^`lq1FUEj,rbt^YN'UM"g2)nGf:Y<6V %,EgLk:E4*6\L"1BYDb.c&\#18Y;Fe[-:[=L/5OD5%B8\n6kSIJr0KBYE0"#JA5(AFa!j&CF9P'2"]m'0#B-J^\P.ER(FbOj0Wc\^ %DX4<F!=Zd7&M[<.g<t<]2EA8:eu;tE@^HW*2'Ys--\gDJMQh>)L^_Q<-O(X2BI3MSWG95K7sglS##\eBPkIWc"Jt3;UoETGO#1m@ %:hX07&sB_KlJlHFqNIdEniPQg)5GXs</74`-)Uu=b[5<qEI[0[MaF'<iGoY4XO9T\;)UdR]-n/"hfqO42,2Y.(Rgtk7k11]6H$+n %+%tUMBZuc%%>:*2CQAfXT`>gJWgNVRk`(jD8_DG8,Rl#65-`/(d$-^RrcP!M'_AdG4aOLCOYXn?R$U^9l[%<-Q=Nir@N81\,:l@< %X<Q(_;Ob"]&oAoKF&S.,k_^7WVK(\0q?k-'lu5qj]XDKl$BPH<jZp8TSlG__VOggS:YM52Ua?Gc-9ke0B;ROJAsKYT^4CH:N25GF %>:0H=6Rp)(rH50MiA$X89=_Dn!Q#sqa@*N1NE2si$MM.;Ikj)<_MYO>=oJ7V>`)N!H@A6tG?KdP(B5e!)(1u2lcS8p:@oK.ahV#L %Zt)c2!+a(&G6)5&"V&b\&a^#eDKPmfg-&,(:)53(LA`jGV_sQu/HpWP/"#flrTU=hadh:_bcSt1'3hEPm/eVscC[&APkcu1L-:tN %@;NW^4`Y+E.=4sm0$JdL-l:+e3m7#Z&UK_CDJ>hpQ%#Rf:#5WDlUP%H8dH*DSaH:MgD7im)p2YA3\iPX2J)mG^lNSZZooMl7Gkg; %0^i*+>d]iJW66>?UZ!a^pA*e[dsDrl,10oN%cA`ae0(N0.9,D0f(Erh4ea60$,<aOn49Q$?8",]W9W=g'Ddh4Q_k\58?G>WaeP:K %/T"t]f.i::S[AfA(]tF:N0Z5W3`W0^LqTo+L%.:t>.V?a1lnngF4`?+'6G'+5?tdu2D(EF%DZ2e+]g-.D+'[$go#*>&n[%oUZlph %LCm23F;gojFS6ON)<gi?GdZQ%FMl<4Z$c_]AeJ*$PEPN)>]9hMf!QSd9id9'kD.'<*n:f-Gr,"Yn2s]$*;Lc)YCHTb\Nu:,g3*OT %4qT'TBY+kB=>U^rVQBM<qEc'@XIq4Yi:+>n[&IbKMd7PTV2,A/Ckktq7M%SGdAA>)YkGu!H7LErWSJsDmXF#ii9KMN=^po*("UWB %QB^U][ujrq:LFa^iFZ=)$J,86s%t*(FD9Af+VIs1>`]lt<rKtVDR$[)`Wll,979r?Wn8m;*.96nb(C.lk\S!.M\kH,?%UEdJo+.k %M5<[2(asCV)75AniWFF0/_-Zm"Lp?LE:r&&imaPsM@!WAhmA='WuQFk7#c$i3`E`N\7T+UXcjGIU7(jc"bnD^*h/ZqT&s&f;f%>e %bm\i"*IVZX(2JDhY^Frh*(/Qf!YusH7sdNAAEqmUbsIUDmVHrBmPAO:Qod%)^2.Pl^rslTaC9"uG(i\ro`^Dg<i9g_dJ%DGBiSlO %f8[Ob7PKKc"nr\63HE0=:>agE>H"\VL,mYUf<cIk%8@?:C2cuM%j'tJPpg7@"'ph+%8*rWnQB!3C_NV97_F:3MW>eE)8$@`4\7eY %[\OK,dr_qGrD$Q*4N^*h;1YHZ&<a::B@_#Z"^Pn.[8@N%j9):C.bQ&S`<E3K,i'R!7?nJS<0<=F8fh]dTqD[ITk,;OH^7j&f_]fR %TD+789!5gO9uUOB?[jO>&F(_(g>>S#Ou-g-)eV="lBO4GX]SV'4URd](/rCa2Oc?;]cI0&=IiH5UjM'pJ?B>+X#e@0`inKFf2@jW %kd1A[%j^mW#nE@TD"T)Q$[(\AMfp*cL[ZB+femUC5ZE'GXTU`+>$B8>iumD`qm9hc8P1C\,Z358OciQ+,'.DiSkmBg2)!ZE*Ug5D %$ZA)LA=]7pC><#A:V1mtk9-kVk5oa>r#i6P!oI/#>35L-<#LP#>=,bQ2K=;=6@*L/>@r-pVQHT#:%dOK$DN"1#LjdKK'fJ1pP?)a %h*`pR2GT&u9=mriFLaqFYi0$F4Vbc`-Q;8\aK#Q-CEubk#`j3Te1+MYX.^9N%AOTX]RmCh4mMBla=c)j1d81q;-5V[l!P0e3ZC+P %eB(tO^ef;1dLnqVnjPZ=i]mt#Vu=2Ca`71lR^+MoITfRqb=@^"<Tlfg>5WFU&8DP:!SqU`R!K[Nh#tU!3lM7b+_gp\h4/PQ0(C&6 %9pf_C`2<\GRj]%(,\kpU*lb&[<frP`+;p0^XtQU'2gY!aZ",eUMDo1q=4c4Lm4L=,c@h3")rWDCTPa\:*jMl)/tr)t40MRInos-* %k=g2ZY!3\eqePM>/`8p;#(:s."'9!pIC)f.#ZK,^'\X9mmd5RoA1DAdLe=[VPCRb#UQ$5"&j0BimOU="3$);o\kuR3'G;C"furF? %=g(sEkZg_(Y\9%Nf'&AoNhO,B);^?#G^Ke1;hgum<6k,YXN-;%N&MZ[L/M1MHHudoCe7ekbp1q)6^6Z*;V]U?ZbRgh;5g(6nu=m` %gnH/^L)uqd_L<dj/UDZAo\JSV2q8]#"/id`]ZM_mV*S)4E*S7CCi:i_P(Qe-bsT=[gR4d#6uk42U0B3Y$!lI`lA`mkRB_>m'@APN %G9qS?1G'7:U+!TfFlt,9&E9(i\@B&JRQ4:A6U@TV8s?SHrVhn8'S9><V[=%g9-;sg*K$B6':&PK*rOPN+p-Z5\#3,NROtPS@HcUD %"?4mI0eJ8_p(ACOX=t(DSO+6,(r'5\;rCo\#=jL';0<nbG88I;i\O+Z>S]!e;7siVX4)1jOt*+V<8g<Sr2HeGiH`O=FifNo_jcn7 %N^>"Kp5cRTe0^H[3-NeuPQpdI@@-5YW,nhFltV:)#^)oAmG^-h"MlOCf#*]70.=)Sd0k1lL(R-m$fp7hWi:op<_HmK/>%o?KFWrS %9gs<#\X,B1^#(BqKaEc?X`etdPamhg8!X''PrpAH`#E9%keTW''UQ_/QD?Xh\-LhD@rEX8)AAg^_)1[#rK=,1=`WDf#f6DMp/jnK %LmUVFp8\oB+g-Qs2(6nNLR*7UVVK[-\`^Z,E>(7*,)-XR;!cl42+b4D*P7Q!mZ!N("@bo=4<(j*:F.DGGb<l"hNT>\8@$ZrA=qDj %$df*[dE<Z3H_*8B\%Pk3H6qThm2#sBU8??K0@$'*]);,QFnI@r?;-t!$pMP?9r74PJtA5:&!CW0#aC-)PV*d(ou8l&8'j<dee`8m %#m,J#HEY7F5+%h[kjh#n\6\m[c$2"S6iGLq13F"W\oh/LL_:5:<;/)=QS5*d@[Z9hI0XjS#Fa)T$"N,N?LKtU0Pkfu<u/dD`3lKn %$uG]"^-ORSiBA^jmD2H@QU)TgptokANaj=<!kr[$;XQh=g7p6E4)%IjB.#uO?dsO"0"KJae()4(;mL$(:^04AX<L=RKj`Bh9_!AQ %#P)1^\l')$WCNAF,W)]UV@,jF)+9rDPH.WoQa<OkAW\q[m`/g\8d3e/+lLbY#,^Q*NHnc-Y+FoL44A!%2cPpjCnDK]/qn>YeS]Wb %p>Ya^m6%&)EhJ4K[3/M,Bf0aD^%lhJ,s'AVQ;aD%;(">a]i.2,((LQpn+Oc:Rn(:N!-&glCHsMbTn.5+Oq8U$'c2_]H/$E`$/"2^ %cW]M/0FmPoVGP=[fl>*L@jXPR5,BCq;S8-CRU6VQeVa+h<rHJED=h0'0IjrAeX@WbD\Aca@VmNl!MEbkm'\jU!@*fS?8Qfi83N&? %HrZ)h]("85KR\W`D/C@.f8'u>8PFlPXA2T)>Knbp$K;uCc/Qdm@mg>&O\TR$hA(VR+,W"^4,]PR<tDu6'o>q9[#De)=:j1Q$oS2h %pks"p63e`*$RgTBBpIg*6;m/Z%uf+E]I&/aHRZQ(7IcGAC,$KD;5,<n#KEh'?$:D2MeM(L.-,sH.EW3cA7Q(Jo=[jT9!0\UpRoXG %ZLgC5"nUa$MY(l7=Ug:ekQe<-U][aqpq<(X'>Y.$0,3fK]i]WSi9!`U&mjB,^%VHZpX',2S[,1+-jrVkg,Zm+;Br)DAFl6Ibbk,* %l,CZ-M6;K$MjIY`gSYO!:cL9bMP4!;N(CcH?'+cS["B=$^+S\gTJ@T8<AD-WlMm=do6YEQl@k'Wi6IV@;E[lQCIM;eg^P_taT/`g %W?=p@#7Ms*-"B6jVca?!hL.M5>WrjOPMG1]>p&a#EO"GKM>^a[J]$RIlLC@Cn*Zd7UF8TX*H3Q.<$W#b-u(deF^7*YGQSkTD8f\^ %4l"71hYj"<%Z24;"AujbbAtjH:f[nOQH%CS4FA:+nYDoLc>kPd`(cMoDYnU*h<f8d/r%L1bG@]o1<a(9<agQ]>9U"ARg[qUEks.> %D7A;Q605?]_LP2Lmg!k*G[>t<Pa?C%?"Wt0Zg_A)b@J*=`qf<N@0ra0l/_p)'_d[(X1FTsWB^T&WJQZ?b$BP'l@^m[i_9H$[aL_f %bSN&Tek9Sq_e_jtE'GY:RT&'LUS++l^Iu+`HO]CL:3G9So=FBlM*MQSVGZVbnq%-0(JCS`hsi*SYNNd4RiF@iBm-&NX2C6%<p/cU %\C5N"S!_k4&j^\5#NTDsZMH<^plbR!$N/(8[;MP?99!ANZJ]pSZ)&;'rn-MM2Udc$Lljk;jUfLUou'gh#ql[kNipGWDB4a@]u76h %QfZ#sY0>LK4"WOo590@%or\qFcMZs_,K>b2.*DK`O^M_gc&lBRrZ_Q(5DD_5i$H]rlkY*<JR-<C%YDE:MZgr%*@&D]iYWoV,,l)C %aB<Cj,Zr9-N!/1e>F=%AU)QOnH90B@`P4i[:"U9Pq.K%eD=(-OQY7c5MZTtmlt`><lq>ZrYV4C9m->M2l^d"j_7mp_GO0,CqMot5 %Zig3blY#QWZkN/038bJD($,%ZYqK[[T!0lo7\-e;VLQV"-m*`O^;cGJbk;P?jVb$2p*J.GI76FD"88Q/:Y;!^,PL4%a1`te5%@q: %mq:u[q2l?aKk3GX?Q.]+qhje^*j@:uI)`mP1-fL=9/X(PfN7RJ70E7[N:7/NicLcsY9Po6^qQ%p5@@ha^rhI]d2V&'I8P6'`kJg0 %'D?S8k^\'j]6n!n5q/!"p-jGRN.$Bo0A%'m#\NF]!:Ca%@_udE9=,B+KstX5^*puX@p`&-fG?E8B'`05SgNf^aQGAQV)=jK03s_Q %q\!>W^-nEo06*Hnqbm0A'D=kgLDfsr$L\t>0@o3CI48rZ`4e3.1\QN<m#6@T;1?BrK!:dHqgr0KfU&+)-g]#ppl'X#Fo-i?klOZ5 %(KFbdfU"L9_S-M_H!jtaA\c"ig(!qj4h,!/C0<`/?TZ$6K7+2&rP6-(LD0CCo9uqfOjidOf0DF%0;W<RYV4C!f[monYN*7"i<.Rh %^3,(9`m=+Xej2B*/M6u*CMAu-Ya1#'^fp*g$u<,NB3<?\p^Cr;e(=e=l0aM7<WLZ0_-/P#):m5Nm','VcOO&m=KVbWEdfp`=tm;i %f&H".=Gn?JYSK0AK!h!3$.`"bfFt?_Kc=I&.'S&K[DYI/YSN]b_cjO/]UXK[XQ=#/B37f1c3`'"jbXT#nffe5X9B+t_-0-e.3kpj %%@pn/Ybs;gYa/r9XQ9fC#]&[G1T[E-9s>DNSmX.pm0%5#nXO#>Z*"Da&ec6n/NMQ]Ya-3O9X*)SF5_YWS1q`^,##5,hQk%&qTK8s %EeZ]n>&gbAES];l@',!T*O+,9(3WeqTH18f5s&I+B,)YmV6bK"[</'3==YkNFb$lo7oiBhQKhnK?nLit1;[3EM))nNb-aFL>,oCo %_-4bkbcmCgCJ:su81.MT@)LSb]tdgOXaPf/NdBF^X<lR'CJ!ia?nHKr1T\QIbchkJ7:oZF9;Tk:Q59B$CT/T'"D^SZ:U$.LKG1HK %ReR/(l"j/"Q;_Btb9b44CE:Uk%]hOXh?2=I:MPZm7a_c^%Jt<sh%eKZ^U1m^.L1ES[A:l;Ya4XQ$.e*2S7+#>mg7RVh6%6'%IEtB %[DnX%Yh&3X*S/Z^-Wj$nncW`BTG+E'am?6tAimn6_g3?-ek"P(/agk$el!.W$.^$hjLjms=A/$I:U$/7f+Y6^EM$VjNqNls1"?T] %iaeZi/Pc!JCPe<NYa-[nXQ?5if$Y;$?nHfp"D_^F'<J$M:U$-sGCm5_Q2,F(eo9+L=DQQWYCX)2b/aj(eIYN\(.g"]T#;]QXAusN %>R."uCIb@apY6&?"D]keUCXS0,D0id[9?^NYSM]sYSM]uYSM^01H8]_UZbWPk?39FXAuO?:U$/@]F1eeg'Q>F(u?WBCSGrR9@'2; %/^\04lPRe1S`/CU[Dnna=DRj2%VlN\"4lJtB37g6'<FW__AUq)Wj4h+>#j,AAlq^5'<G1?Ps)re<LMeZX>R0!A[Zej/[Ca=Ya.g9 %XOU\r,HR^Z:U$-5,HTu0LUA&"AeV77Y21&IC<B<l@4`+lAlq]Y42G+C&"$`VOpGZ%Mkm^9XAtN+42Y6e+SH,mW\p>TX\).Y$.c+E %?_:^X@sSfi<>Cl^_HOq_0<eJGgR_e)mGA%^*BQ<t>/Ms7YSOSPeuC0h@',m?"kK]@3YSSp'p_&#>#iqn$u:]CK!hVq77UI\&n4&@ %>#7tu<i$B'"D]`F):kfiq^5K=CHTF:\g/N%-,L(+M)<%P]Oui(pt-J81.Cg<CK6'^O0BC8Ee^tO8Zj;><L%Jb_HN3-jqFgbVWeE< %Wi/Q8X@6=S"D_ulcENVln/9el$H!`i/R@9@enQ1n'<J%;km>p%\E3g-*L$TU3bUHSlh96HCGk32NNh!ZYO920"&hEl/^<5WC\bVT %=DR!i401<d%TnX%c`i^K-Wk.l_q4F<B#'Pe^V_#2=)S)j3050=3bSc6V2^iB/oB2Hi6l!<J;\9:!A<KAScCCXlncE\GFJUch4bM> %Wjp2H!#P!=#.V#m42<^m[KGG+(@D14S?n1T(T_HT\G5n<i*qKu^r7=c!&!D[!k;?q1Vfi@)Zd)WQPn^r-F:tt(Rm5`>do^*S:D!_ %V/`"*/r"]W\14t!"LtJ[X%%UIDL)Ao.U+_1>h[O2i:8Ik!A;bHJ4n+-!k@m5);rr1-@i-(=r[Mpc0YXQq=0sU0%>Oli*pmWJ?(,Q %E<`r"8nNUSoq"b\^u^4Mi"BH"\Fc(-i6l75!*;7V?[%#nj.-1Q@qX["\-Cf5!*gaQfE&.+FoYbPm/XYd<K$pEcKY_odX`G?Y,9?W %"2LbH3!!:,o/m%Y8?!Kb6Bo^pQcdLD!3V324TSfQ5.qWF"m#l+M0&g/#)7M2e-j(2nBM$#BIA='ZjGZj<0s'S/i&X:!*<1Tkn2ht %M09*5[#cYcbA.U3!#LE)#.Pr$-\.+bGm:c`-Q`@ASa?aAElnf0\HJ<#Y%,$!!P!m5HN7=28aQN08D4*I@Ge5k])l6tQZdn[#m$Os %/s^/T\<thUE,d8N!13KT"E<17<sQ5>p3cpGj32[slh96HE9ZHt^nkgl!k:)6$/j6BG(<5lSH5m%]afR.V!S-upZ;m'<>@im!NpE< %cKfo[\2YF?J4kdd$/j7A:B22$HNq!Il3)'GZHiLe-[Q'-`6'EW99^=PEmb54l&&.7QTfTp\2:&hi6o+_J4m41!F3[fr&B4B39gaa %2=/PjN1+r?pANSc?5[<n7(gaB4s=7rH+-s\3K8hrmJp':_F<LlH@!n'd$JX+=&B.Q)ralKAOa>^om$L5;,PbO)#QB:?Mo)mi-<Y/ %U/*qCB0@JG+%j,3@'NCff+T]9kYZGR`C)f(@YLJD'.c&h3\7.@:U$4"1G!\Xjn6pgm_E;lcoWd:IXR!j#20*9nb"[h-JAbA/#9nM %?nl>-=KGnaSmX;#:9YQOq@&:-KujW:)cu#SgH2WAU!30<Mhs:.@\n_q(=S3i=A4qk(3>)F@KlC;K#L?=(Ken?R1h,P#Rm/00b*OR %M\T5g(h'\D^/uU2<eMO=YZR%#S7/[s5(+Y,VS6(E/;@[s_d`9-3l>F2mL^4E$YNQM#(20E&@aMIVYuulZ"$9/=DZXO!u?MI_.)ou %)&@kbT4'GW`=.YJ?tNLl9-]s81!rb#(c=<d=A6,$-Wgf"#o5l>cEJ-QQsm8$d_7LgVDXrQ0jTqS()(,2`C-/&1#=_&@XRMNMlGk) %"H-->FG@b:P;=aZiP>g9j$_.r(qS-5(8Crj#o5$jX<(fT_L3D40s8A2(@rJ/_dZlb)&C[)Sm\f)Y<9X1Kfk;#(-B%g!K.t_!>[b1 %2d#G?i!t\8_&4$Cq:-KfCgcN5/>bFt?nn;*%#^+8IYYlHg&[-%lkpQPm0&=VD"p'*mtJ`@YMNZlE?I=oG0g_$9H,_&@bRsu/>g5n %YSc+Y_d]_:)&Dhe5/UiK[i#t1/K/%P'^db.#()hJ0s/V/M[c3DJAm7s4('f+Ca1J8CR\]d^4(gU(ubs^EJGoDN4GNf0p^l/MeV-> %=H&N9@'NUr$S9:Ec*5i;,;1G&!fLb4-Wl>dSmelt<6Y],Yu`_4"ue]]@akp[@52W_"H3'kc`idM'.bKm3Pf2$g^K*T9G8tCQ%M'3 %@[c$X(A$QH_d]PN1G$Q69X#B1`YfOZ/"'g#h2W'_F2@p8M(lbTHHQeVkqa\h9OjJu0o^C/`K$L;#8S8'gB!4lCgi+<#20*9*OGna %F&k$4@QLP;=A/sGKZ0>""H-tI:9[hDg@>B)+f/dQX=0rXKZ/g*fGPIBhO.fWJlnLM0dnDO9V`=Q2DF4XU0_64U3e]6@\TE$1!q=M %$l`u:`<nIp:TtZD1;dRTgGH`U>0%@.V?K3#@N;6_(6^/=?nm]')&@:aI"]I\[O52$.5NO;&nHU5NobQl()p$;!K2pb[DQGuBnsZ^ %ICm5]$B'mNg0l]Om0noX6o-C6Zt<F!4)p"o`4m[%lup!%/2ja$!u;hg[_lR`#Bs9D0:uW,?-<m4VL_LHQmT/W@[cZmM[eup^g\O* %LW-b^B35Sr)&=1cjLjms=KI=tc*3QLfb5p6EM$VnNqNm>1"?RGj(+cj0i%ENMi!]nYa?gp/EW`?(=O"d?nm)t"H-tf'.g##:U$3u %GCmeoQ2,F(fPo=N=DZWX!>\%?^$VYsfUVheFT7C<Cpp=Y/sG&2Wm4moio7m_N0[%k<c5<Ye]:$PQfKI00<_0%_..4cJ("e@(9%#M %eY>mBLs8T#P5="5#qgXdl@:)@SX9Xkg`K>$a'7:_Pl*nKELV8$YY$*V4sc*ZEEd'bm_l]mL]hnbnWA'ad3l>/:lScK=lnG>::p@q %W,h7EXUqau+otKAIBthO]gjp-FfA,p_(3Q)@7%r'Vf`Gk-P#G\o)<mF4eC7'6g=<<b:n@NOlLVc^1:CEaYu<2S[^\bIjudaXO+Ta %GH[+o^^J)bqCc>Sr_g.[/bFm;hKW#<d_(Z&fTACiDi^r/E:FDDa+l;-eF9FGXI`UPXsBr=.WE&e`8jXP<)sjhOld=AH@an?\9-_L %Jtfh+SS@8*J)[H%OeFVE%(>-L''V,;].-4!/-H\#eIHBp:!5>UA-V00g?>OH-r*HMVeJ`-IU1kgYs#"a8"QJQ.P'no9(b6pTY_L[ %cT3bBXg.*m`LErdki&C.N1H?f)t?$HhoNLAW1$C'g6jWPf2bmi.pfJXU]:T/8c<so`'7.@A^0*'ouS:u'l'p]U/1!tUr!N)(+I^5 %R1fEI>5@/FaW.q"GMWqRCU%]ua`0qL9Hr9C<'4N!*cN;79ZqlYQMoLLmi$nSr<pOLY-F1<,[L[Q"5/"B1R\r[PfR.X&LdJ%.(.lD %0X'5hQF$6Fo'@rYkM&b4oq:\bJ3o-f+nqNQFB'(>QJ+pP.1:m\e"&/e2ARU-DH[fI\2Pd]R6Uhkk`YH%Kkf)R\\]15W_#j-MQARf %.^-jFCMs73h,&t^ZXVB<6:pe(U>JGU9TWVMC#ju2qqB+#G_`AsZ>[71@I*Q^i\bW**\NP4HtLbBHD/Gi#*E*@ePG$kUKh[YU=gWb %lm^j>'AnuHLr-?Wi92Z98eW)-r--TS].;5blpQj;I8k:X-^R9PK>"[=ebb'P4Sb1U4@2+?28[iZ$>&kK#;h=NIkohD8VpCg=uqDH %p'K5n9OR0"AW-8=dc]!oADJ%)1Wl&dm)uj1>3"TDqspaeYI7k$[UIoLWt(WL2`:E.1/ktThu;cms6ORKNsYW1rKsDZ0\,,9l-N:s %UgX;gI;qKC`=#0$IDO.=?9`<nmFUf+*;CpP,.?%7[,g4p[U6\'n<-bcd?YpP?!2=`Naoh$WRhg;`Jb;sicY2ig#FHl9.BN;f=Gd) %jcVsY.[^]8&]4]J#?p#1cU+TI&\$okCHF8]ATA?]"".Q[qj5hlKY!BG1K=>Z^h=dMbX>VVo.C5i)OJ-@dNBKiKn8Hg5WRS/@FD/e %%Xh'f\%GA/\4'd%YciIXpDp8?A,Zt5q7P:H?8,RX)>Br<<WU,'`5RQ_B\g>.["thc'[PEt?*CZZg;VqES^&ohY!1@)G^XY-en*A2 %aE6[b4;%JNaWFSQF7NX7p%[#PHTgZE.j7^ONT/h)BfZmUeqrFA`mPs$Lthp&jn>CkN':)jU.DTeBt02*G`?NR'XIWu3r.tK<P-*m %`*Hr;,H"iB!,\O'*]gR<p-_ksk,g.6%C=SXDV)R3-d@G;U:SOmKfA-@*G"iO5.]mOlP5ncmqRbad-.3noe9<:,&:L^a8mo;g?/%D %[07*UFX#s3\CQ")Y.]ap=*nhL]0u9:]oTm!pg),OG"bq:S?k<8Y_U_6d#3C+/)7WL?1fHT7W(Yl@o5hDiLm,C#CKn6b1/<Gl)OcZ %#*9c4D!C@uGbii"Qj,se9Z6)DiGn:0@QY7mSJZ?P<$pc_W.?gp&NeKY>J*dYp@INY$#1)Vo>Ib1[T^!Vc7qnl^'YG9B'KcfCP@q` %DLIq$:$ZXjdE-h(Q[S8SE8R@0lqlD[14"RcD=>pI*4`SY^%rs.&,g1+rFgl_r%,na3SsleIHjG'_p#,sd7]WaZ$,,IS8`Tr(D0H* %PEnsX?<8,h')OOgIE^kMLl5,Y?9CsDg6*R),9$TbeQ$Q'S_'/U!^qe[FNR0X3cf8VoAkt4*OqE4Gt0ZH_G7Wd\tAh:[lSJ-n[_)[ %!@I,\+,JcMVZpjL$&+4D&9TMTW^`cm5oHAle4D9P.%%1R0Hq-,o&sp<UC2Zb6gk=3RSr_faFV/Qej[gpTXC%k*)I!eZEq3O1gPVW %`Bc.-or-:l:g$Cnnm_U?*I-Qf.28uShoD4@nZMc%dQT=#)pM]-e*OQJCOOBCQ0?9TMqRr9DL#UZEiaNR4/765ES\/mho"f?-D!;] %O:d&rg]"obJtptAd5<n&$fj:]]psHm^#Qd+r^E[Fd5C7P2P)F&f/*.m)M#C`TGgh(P$Q_oJS&rd`=ibeH3hYe/=eaS)321t*b]ED %^N,P0QS3htcec]-Jq@qj0b_SB6=^*5[mZ193K#"tN)SJfS/P5OOSu8<Eu>;ZWnSnAI;p5LdY_)DQ:([X>B<#JD0(kJIUW'/!K<)n %or?gd&c:>SIIc5(l&eHFID!\Bb=?PYqTP,KN(GGM-p-W=TLm)]Si-A(/`)H\cGDPN_p;SNbP2pCc@Le//:n^cQ\VeeU*,\OR,m$4 %IMm5gA7df.'frHqUmm3a&[J2A0mYF]=+4Ej^DRFD*6F=+1Oo%1YJ#TA&XUXOZ!XJ;XV`?l/*hh3>jd`U-JJEkg:QH]:BX.\=9lg4 %i(@D!(@=3K../tcoV9YT6bss6nDOoK^3].EqW=^chr^`o?%opI?Zb_-HA&5Q9><8npSkXrG`a[<_\,b`dYX_)Vrj6c+,Qub+"F`1 %&PD.P.R#+pe@H1(lpFkH!Y\N:@OEc)6H%VF/8\au\hD^!pLT?]Z7`+05Mkttk,h@PD\Oo_D*K(Mhp?C[B\^(F)7I4#O$"En[2;f> %l67Nf_*@0VDa^G5F/7caNs*EK4F!++8l`G)/Ut2]E&/MF*iYeM(E_D+(/5Y[,<7"e[bfN]5#.+.Z?ZhP7rgVV/o3<E4HJd&e7G`k %`7qcK[&o"P7R*s59j@Nn,!n8e[<!JAk39]R>ODd.RU?1+Fo]E2e'KPSRqX>DYBceFYo<(f7,];KS'0@3'PlGnR>t,W/[KO"lZ8cq %Kg-CNHunsLd>7XnXS^/BqoWdQlB]/qAa+P<U@3ZXNq/n`@7uLBn0;2:m#Nq8>'55kZ@C07l7F>qm4G&G)chh<P2'(qDXj*eWqmVf %?(=&u_lqoZ;aT>S!'m:S;;Jn8Ue&VP5LK0p;_J'Th#FPUjgeSiWIp&4^Dgb=h^qalUh0#BK:g[o=e4ZalmpsDjR_q+iT:f>h.%'T %\E."J9XiT*P<IbFkddiS7VD`s&),XCcD&#EW7Qll4)J@gg]9Q"ZD6-g_%uDN.dnT2qag9Ag1;AnGn[%AB95VO7Sr`^,ZDu@;Ul`: %)\/Wj/kKoY_8.GP>Nh?QLIi'?\YaMH`D.@!+[iKWbdZ+#)tj!GAU$FPa7DOmRr<cQmGIs6S):o.qo=KLrooo%qY&)k^]46S^AI') %Du[$>bEq,cn_69VpP1t^CS1C>5=;\Gp7MB<TDdsQri:hS#OQ[)Du~> %AI9_PrivateDataEnd \ No newline at end of file diff --git a/testopia/img/confirm.png b/testopia/img/confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..873b7ac5d8ccfadac8084b9a650bd7c3f8315be6 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<V%*gMwA5S zr<If^7Ns(jmzV2h=4BTrCl;jY<rk&TerF>ERP@=?#WBR9ckX3-uVzPq_J`@sN@ik{ z4&72xs9+4NKCe*0!p)!X*zk?cQDK%XLOFY!xg4cg?Snn9^qh4`x>D24yxYLo`u(48 z@dstY{+w^S;L>ud(Ntzp_p;#ItEOxU@p}1K?zG@XlaryE2RNC+H6*iFF}!%l+yBDv z=xRpu9|zv~?2&C~o>KS6JI{_`b;ZHADfjD{HgxQr$(nw%_H{qo*_2zyi}miEd*b)& zuO-)h2HPHkW2vhom+ZgE<?)>3eP!(Rn}7E_ZP?FfRT=SEhc73D*=R%Gbsf2dm)Rm_ x)V&up)L0txfN{B?;kBfr=ikQ!Irj3}GuEG&y3z7ir7F<-44$rjF6*2UngHb)k0$^C literal 0 HcmV?d00001 diff --git a/testopia/img/confirm.svg b/testopia/img/confirm.svg new file mode 100644 index 0000000..1dbab10 --- /dev/null +++ b/testopia/img/confirm.svg @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2236" + sodipodi:version="0.32" + inkscape:version="0.43" + sodipodi:docbase="/home/ghendricks/workspace/bnc-2.22/testopia/img" + sodipodi:docname="confirm.svg"> + <defs + id="defs2238" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="375" + inkscape:cy="520" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="1019" + inkscape:window-height="754" + inkscape:window-x="24" + inkscape:window-y="90" /> + <metadata + id="metadata2241"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <path + style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:25;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + id="path2230" + d="M 385.09183,642.47321 C 391.42485,668.82681 411.78793,693.03058 429.05219,715.40372 C 446.67233,739.69918 458.72864,735.01703 419.27409,750.40772 C 419.2143,750.43104 422.63543,734.94557 427.32009,721.20215 C 467.9511,645.48669 516.15826,572.61795 565.50702,500.65965 L 594.12596,490.08904 C 537.58641,558.29153 485.7585,631.02927 454.67408,710.24793 C 454.06129,712.31229 451.83556,737.38415 449.96296,738.4927 C 411.81595,761.07505 419.78994,753.0487 402.93795,728.10717 C 387.10247,703.93257 367.81633,680.49016 354.44546,655.58373 L 385.09183,642.47321 z " + inkscape:export-filename="/home/ghendricks/check.png" + inkscape:export-xdpi="4.0148792" + inkscape:export-ydpi="4.0148792" /> + <rect + style="fill:none;fill-opacity:0.75;stroke:#000000;stroke-width:21.0187397;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect2245" + width="337.64706" + height="334.95798" + x="317.17648" + y="447.16876" + inkscape:export-filename="/home/ghendricks/check.png" + inkscape:export-xdpi="4.0148792" + inkscape:export-ydpi="4.0148792" /> + </g> +</svg> diff --git a/testopia/img/csv.png b/testopia/img/csv.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8892cb6471571513494443dab0c7ba711b326e GIT binary patch literal 1295 zcmV+q1@QWbP)<h;3K|Lk000e1NJLTq001xm000vR1^@s6);f+K00004b3#c}2nYxW zd<bNS0000HbVXQnQ*UN;cVTj608?*dX>f03X_Vs^&;S4gsYygZRCt`#mt9DdSs2HE zGxIv*lsY=vm!H(el+Z{a^o2wPQAis?8s>u1Wd)U_>_wOt-Gn9yO4LpyLwV5`E(VL; zIDOznIj)edwx%iNjAo9`hm-U1&YZo_TwI+pc9-f8=i)ujbN<i&|2~{^-dDja%F4=) z8jZ%E;^X5pG#X73-yVd|=X>vRxrRDBI~!_iYk&P1P?*i;TVAg>EWQ)C-R@9BLxTx` z%a<?zEX(rO*7U^)27{uerlw43Fc|VwD%Jnkcri1+B!3Zvr>EyVOOk}aVE9p)l$4bD zZ}cq&Pirf$3kvAjuz?rJ$-LUXe_nj@?p=mTN*Kt?W4OGWz?(M!yt{OX7pbWP1_$Tm zk6*t|XIvcbuU?%u9~Bj~UQ(%4%KuXQ=*5fJDl1WhLTIzH2)=qX_g2F`AN{$xcq|qG zq!lZ0Ha9cb*oe_)10e|7?TlTyLTYt20HLWV?3I-$0PUtt|177JJ|`$>xAVHNko5X` zv{_l7%yrzniS67u)T>vMZZe@xO~w1{8NPu50N$QDg~wt+UsS}Z)2ESEt|aXDLpTfy z1u;8!0x&ge5Wsow9znaEg#3JBa&i{b{H%ef<Yd-VRPef>fcX4;)>KrWjE-KA7Z@JK ze*QcPrINJzdUUzDGwV}Rk@R}PA3orpHKI_d@DB|U_WN1BZ5s-;dL}m`gJs*dGu_^f zJU)(;l*HtnI{+jW7cVZ*YPGtTvg<=$uXtNlCb}~-h1+6T5Fe|n6IKv|#l;ahCT`yr zJ=xj9s#FRq2rG!rxHvITP#|RYj0{_4rLcl{S5qUVo<A2Ik|h2x8W-hjX=xc*(1Aa9 z?IP^)MC^zN2I<?kkF|}B=#LzkoA<W21E4P|inumDFOTJ0w-TP7#^2wMJT}JE)2ED^ z&8T!bGE64o4jf?Q!UZOqng|RIB4nAQl9Gs=3k<A(@F3z*=C)X{m6x-sw3LKHhyFGt z%P6E7s-VL$H}C81Wwg4QRcFqi)M^RXY{c%~4M23}?BS=;Fm5)_okZ%C6k>C7m}+ao z*VBWf*P}mnZ0QD6I^BY#kkiTV*|SV{b@4+}6I!EjUR)tb#2-9}!))g5@#A<~Tag_O zoGmSgK!D|2w&1o{a5gou;=~E`g@yS0`|&(}%;f$10L1LsGh-kvjhMZA@jQ8gJTbw_ zlP8h%`iKTTy9WX`o9J4%PK;JniSQ?GZ2#b(7`t{&bgf-0tROlx8qvFBhj84wCBm{S zoXyR1v5%uel0>)BC`PNQM9Ax%<MOn%i4L_|{I1oC58d4nYqqqsj3}&Dt2;Y8J2tXK z2-<8!rKEf+1pwLMAnfrVJDsRvW0CZFR0#<)U39q!j*Q^z=^;2Wf+js3wZVXL*)r5= zX$yEfj~*cc0rW?YMy&Vn;loi$mgUgrge^rpfRvaBiHWEeiK%otR5~5e8#gYAC*knn zrIZXQ9S%qDlGJ^J2nK`w%9k%+Hp#O5wY7XP{C>aa>+5>}z>OO>esQ^6-_1Am#Kc6v zWHQwPC_XwWEiFB~dGqFD-})b!)9D=Q=;*jsS6BBNz+ae`)-wbl^mPCL002ovPDHLk FV1k=FawGr% literal 0 HcmV?d00001 diff --git a/testopia/img/del.gif b/testopia/img/del.gif new file mode 100644 index 0000000000000000000000000000000000000000..dac9ab7cec48ebbe1a6d9457ae2a4d5c5778a5d7 GIT binary patch literal 295 zcmZ?wbhEHb<Y3@nSgOqMLR$KToZL$#rI)IzuM7-c85+JeGka}e@!Hbzjg!+GSJ$_` zzHb8q--U#{kBRw^o&B-2^kZ4sr{?C*9UY&0dcI7X_G8bUUuVz$zH;UF?c0AIKK%3S z+22>M{(b!T@9Wop-@g6({{8>&-~a#o`A-|5_)pZiC^fMpHASI3vm`?yBqLS9-P1RK zL5BedK%Qh^Gj?E0;Lzl8<Zoz5W(;tf&vGDfM$fvLj0uXn`t+h0pY2i%QDSg$Uu@B0 Q!{VT9P~*|opuk`a07~V#8UO$Q literal 0 HcmV?d00001 diff --git a/testopia/img/del.xcf b/testopia/img/del.xcf new file mode 100644 index 0000000000000000000000000000000000000000..440861b94e243f8449d2b13d46ed2726c774b4b1 GIT binary patch literal 1310 zcmcIiziSjh6yD2S^m1n~YK(;z;|1gbuI{O5(w;>S6~rHycCtIWH)el?-8sCo5eqAu zwE73+Pq4L65Iey-h>cM}t4KhC<M;M<%mvTF!Ux~XH}B1RGrac&GFoLl*Jr*Ag$1h? zAbtoam9QKEs_iw)BEY7B3a}qI3Y-Nd1C+AeB#K0=aJDFM=5i{y5+1uRRfpZ~2)20T z`VETC091l*p+xBx_J1rfmA@z>9tb-~rH2Ysu2gMisvim_V<pl|xJo8*Hdkx<ft!R$ z%9{CRr@=C3&KW1S5u{aw=8(EPBGts%-wCDmvQ_TNIAAUF7M%T2&cbJRW2x|Yw<GA+ zy~Ou3p?-gmvj21qJbP2AABB~^quYz-gna^-0;v6COIWNiT44JC8jJ==3}#4_L7c1x z7+xRZ2Zs3M5I+b`wJfdm4mQ$_$v0Xm!$(3mg?%ttC3?yZd0(V(<&&*7$;TQ?4Rpaz zV$eG`@3MB1tVBF!*G_|mo(bBSd>~lsoSEYwCHD>*wJLieq#k!56&g`L?>NVShmvQ- zIplHBg~(V##CA8M^2<CEwkOkpxLBxCI7g{#!C9DhE?{^q=aO^&;w~|wA&K1UW=i^f z77AZc@uX)*i6@xXk9j2B!j;Rye3?2@Souvs%uLbQ^2T0Y`750tT5F$x<Aho3=SyAE zU!Hx``qjj`-ad9!Kbo{^@AUHzk0FL1%`N@9Ok{pbZ#!uJ=M$UVr+Q<`I{Ef}rM{_O zOz&vD{zQ-ISt?GmCy>?K++7LMq#Jv5{I8Ot2VkQlWh9Mo<y(Gh_nVO0xQQ2EA3scY I&>U^>3;ojyb^rhX literal 0 HcmV?d00001 diff --git a/testopia/img/env_lookup.png b/testopia/img/env_lookup.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a9cc77e668264516a26cb315d91da54804d7b6 GIT binary patch literal 598 zcmV-c0;&CpP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$R=t)FDR5*>5 zlHW^{aTLZsXUcxqTI=lvtxcKIpn)+aAru<eZGVC{-9#iT=pwqP8$s&I3&GGJ^A9lC zO@UCLSH-R>86vz)%DFZqXQ^{r8=fwj;pW>9ANXFJ^PKbHIq(%#1wcejb;n|l%wRC! z@%jAaVsX2$zW#MBm3mkymA>!?iK^1k(=!l?M#pYVPq+Bn+iM4AX?NH0EFO1Q$>c<4 zdHIDMz#$@S-F<zd_Y(;{ST?{L0K@O~w!~*=YrR85cU&INIa@#|8XdhkIq5pwtU&b= z^bWv9fE(lE+8v8MwgsH&>^y(EqoaDbS%k_mSXHQ*aMI~^@0(p+0Xsme&om8SzuB-L zXF=|uJ{u075D`OF3k?Z=?Cq89$j$n`u~7rIkDRcT&lhawkEoE%epA(2bKkL<$vl5E zGvoZ*a%y40l~1Q%*?Erq>gwzHsi}`vGU>7#$XS;2>BvYiyRvdkL@qS@qN<391S63L zk-@?1SBHmN!u|cF&r3_5w{vs)et!PlS}IirE(4puJylIN0Dc!DhR-wyy@qk6w6pVJ zE0<eT)trbpfC+y6i!I=;s(u1MRsZV&t-utp2qb`@sx~J0mqf$~JORS>B)5+Rs6*WK kBq5-1Y(O2-R)@U&2{_Hz75Tfc3IG5A07*qoM6N<$g7kM1cK`qY literal 0 HcmV?d00001 diff --git a/testopia/img/env_lookup.svg b/testopia/img/env_lookup.svg new file mode 100644 index 0000000..93dfb24 --- /dev/null +++ b/testopia/img/env_lookup.svg @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="744.09448819" + height="1052.3622047" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.43" + sodipodi:docbase="/home/ghendricks/workspace/bnc-2.22/testopia/img" + sodipodi:docname="env_lookup.svg"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="375" + inkscape:cy="520" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="1006" + inkscape:window-height="770" + inkscape:window-x="18" + inkscape:window-y="69" /> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <path + sodipodi:type="arc" + style="fill:#aeffff;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:bevel;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + id="path1307" + sodipodi:cx="332.85715" + sodipodi:cy="373.79074" + sodipodi:rx="115.71429" + sodipodi:ry="115.71429" + d="M 448.57143 373.79074 A 115.71429 115.71429 0 1 1 217.14286,373.79074 A 115.71429 115.71429 0 1 1 448.57143 373.79074 z" + inkscape:export-filename="/home/ghendricks/lookup.png" + inkscape:export-xdpi="4.21" + inkscape:export-ydpi="4.21" /> + <rect + style="fill:#000000;fill-opacity:0.75;stroke:#000000;stroke-width:5.99999814;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect2182" + width="34.285725" + height="165.71432" + x="-38.006138" + y="624.91003" + transform="matrix(0.707107,-0.707107,0.707107,0.707107,0,0)" + inkscape:export-filename="/home/ghendricks/lookup.png" + inkscape:export-xdpi="4.21" + inkscape:export-ydpi="4.21" /> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3.00007892;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect2184" + width="46.62291" + height="45.402252" + x="303.11337" + y="-241.71384" + transform="matrix(0.451795,0.892122,-0.983414,-0.181373,0,0)" + inkscape:export-filename="/home/ghendricks/lookup.png" + inkscape:export-xdpi="4.21" + inkscape:export-ydpi="4.21" /> + </g> +</svg> diff --git a/testopia/img/error.gif b/testopia/img/error.gif new file mode 100644 index 0000000000000000000000000000000000000000..87029e3e8edc2288c706fc81452e8b1e1a16c225 GIT binary patch literal 177 zcmZ?wbhEHb6krfw*v!MQsy^h*xzqm+dHnms@a);MzZWb19dZlu5n^Cq*u9;tp^8UG zP3-^w|3EGTDE?$&WMJT7&;fBlW-zeCO*rZ4pkVx5OXr%10?%Dmud4<U_fD?#{F!@T zfdYH>rN^~v)&?AGV}2(w_0R=#jVUc!jZUE#5-kopGEH1?%BAfM<HiM2UJnWs3q3Se ZFKzH}SbsaZsG;t>J=?#AMr%O^YXBWEMG^o2 literal 0 HcmV?d00001 diff --git a/testopia/img/folder.gif b/testopia/img/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..346c1e2c8219eb7a9cf264e625e79bb9737fb269 GIT binary patch literal 165 zcmZ?wbhEHb6lM@+*vtR||NsA=Gl${axnv;y|NpuF=jMF>{v9X?mP98Mf3h$#FmN#F zfFwX>Ft7v(ob+71*W&fr-S3?wnC29SusU+2sPPoobR?-RsOS@N*1o%H!Gwetfep@! vE?GFL@wz<IS8a)^v}-Z0&`p~gyXboaM>Ox_WjVU1l^8zkh|%k0V6X-NrMWr- literal 0 HcmV?d00001 diff --git a/testopia/img/folder_blue.gif b/testopia/img/folder_blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..55447c25f1ce4acf96b76949abf4a9a22790b354 GIT binary patch literal 163 zcmZ?wbhEHb6lM@+IK<8X1nM@qWo@e#tUmVe>Dw2tKfQhb<^TWxivL8Ni&7IyQd1Pl zGfOfQLNZbn+&z5*7!-f9FfuT(Gw6V{f(&6`_OIA==bynT&(&)c(;b`**&JD7L^v|E zGNObV3V4K^R_;k!C+vLof%Uu#+Zou{Z64_^akk3b)@=Cwjcae{yszmetk`ca%39MU O$M9lH)LIV)25SJaYd&)T literal 0 HcmV?d00001 diff --git a/testopia/img/folder_red.gif b/testopia/img/folder_red.gif new file mode 100644 index 0000000000000000000000000000000000000000..925eddbfde7caad9f666d4b23dc24334291b64e5 GIT binary patch literal 163 zcmZ?wbhEHb6lM@+IK<8X1SN`!>kA7{&6)H5!Gq7wpMQPx=KufyivL8Ni&7IyQd1Pl zGfOfQLNZbn+&z5*7!-f9FfuT(Gw6V{f(&6`_OIA==bynT&(&)c(;b`**&JD7L^v|E zGNObV3V4K^R_;k!C+vLof%Uu#+Zou{Z64_^akk3b)@=Cwjcae{yszmetk`ca%39MU O$M9lH)LIV)25SI|gFY$% literal 0 HcmV?d00001 diff --git a/testopia/img/green_bar.gif b/testopia/img/green_bar.gif new file mode 100644 index 0000000000000000000000000000000000000000..319103f30ae1f28a1d73d809d9ce95c74fb7ded7 GIT binary patch literal 118 zcmZ?wbhEHbWMtrFc+AZZwUjMkJ$L#p!MvlQ#pfhTFG|(kR%m;!*7HfL|EtdQ|Azlj zf#N?==c3falGGH1^30M9g^-L?1$R&100zaMEQ}%y{0uq_KmanFfrV?rjL9Na%XkDG HSQxAU4W2GO literal 0 HcmV?d00001 diff --git a/testopia/img/lk.gif b/testopia/img/lk.gif new file mode 100755 index 0000000000000000000000000000000000000000..dc7f1e78fe17575302f51a88f231052d3a9440f4 GIT binary patch literal 580 zcmZ?wbhEHb<YnMzc*ejmGmYWLbB`HwS0-oI+<W}u^+m0}KNjrWcX(wJ!{6_9t6F*g z|NnpH%$eq{>Hq&<-LZ4u%hL+~|3Cl#ck7>zS@SCxZrr$AQ9tp+Ew}zD3tqhW`2AJ> z>|%z$UmN!xI$c)Vw_)eu`O7w~>ty)*W8vTLg+ROh{@MNGMflfmKmPsdoHT3s+e^k< zC-L38_w3N&<J<NgJ%0A;|NrmiEMB*;hUd@c)VAK)UmrMb>Sg%<Z&~luCBNP$ELpQ{ z@7{B(TNxJDF#P{N^Y6Eu|NpBe=knCHOuBjd!T<k9|Nreia`e>Jtw;a;Y5e{yc;>uS zuit(8@h0NkHOn&>Z~XhahGCEa#h)y!A`ILNIv{s};)H>HVFP!Qte%3Eyu5Q$w>*oa zI*T`pp=h_Pz8>!^Cq2I@O`5V!>`nSkvL^aX7A6wi++MsAZcSohChM7)<#f5V%@hwR zavZU>HR3i?H8^7+cwSId#7&Wnk4@&Lj0>NVw65Z9PGd_oH9H}x`-(oQ!i=ULmF>ju y+xQA;DF6QLp~b*1AW~8ExUFBwW5S;XhJZ#xE&+3oDH1JL8rda`vup%77_0#~S=QnJ literal 0 HcmV?d00001 diff --git a/testopia/img/orange_bar.gif b/testopia/img/orange_bar.gif new file mode 100644 index 0000000000000000000000000000000000000000..5da8da4818c80f717372da9fbf428ff1ab2fa63d GIT binary patch literal 118 zcmZ?wbhEHbWMtrFc+Aakxr*gRBm2EhuE!I3pHJt1F;n2(0^u(!#eZy+{Iyx?|1R18 zs6g?bsB=+jVo7R>LV0FMhC)b2s)D<xZvcbhPZmZI27U$|1|R?#&cMPoVa8+;t7SZb I4lE4T0Lk_+HUIzs literal 0 HcmV?d00001 diff --git a/testopia/img/pb.gif b/testopia/img/pb.gif new file mode 100755 index 0000000000000000000000000000000000000000..949aad46b7f3e06ae18f192328b8a4687d686c7f GIT binary patch literal 93 zcmZ?wbhEHbWMtrF*v!Cic{%&LJ4%m_i~stncW;l-mlqm0HuAi<B=i5j@sCeB&(BN$ m|Nox>2`K(#VHIKEX3znNfy`iF;R<Lq3ebAUk>tR_U=0AnwjR0w literal 0 HcmV?d00001 diff --git a/testopia/img/pg.gif b/testopia/img/pg.gif new file mode 100755 index 0000000000000000000000000000000000000000..a4e5cd337dd5938f925bc810416e19111c298f1f GIT binary patch literal 93 zcmZ?wbhEHbWMtrF*v!E2`Sa%wA3nT)|NiaUx36Bkdj9<R<HwI5J$iKi{{6dm@BU+C kVn79oKUr8s7`Pa8K*At17+APAOb~1kSR&CJz`|e+08Q5;)&Kwi literal 0 HcmV?d00001 diff --git a/testopia/img/red_bar.gif b/testopia/img/red_bar.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e9d16c683141703ce9a22c18f81d21f5cc4e23f GIT binary patch literal 118 zcmZ?wbhEHbWMtrFc+AakS&jXM7Uw;Ep2wzq&n*RBSPQ&!5dPvW`omBBSAfL-Fsc8j zK=Gfbb5UwyNotBhd1gt5LP$ocg1e`00E6OB7Df>Ueg+)|AOIQ8z``|Q#$*wzWjulo HEDY8FWrQp( literal 0 HcmV?d00001 diff --git a/testopia/img/saw.gif b/testopia/img/saw.gif new file mode 100755 index 0000000000000000000000000000000000000000..6c9acddf63270aab4c32aff85ba0db799ca4316c GIT binary patch literal 570 zcmZ?wbhEHb<Y(Yxc*ejWE1`G#U~E)m(DPh|3)T!Db}v}IH10{Q!~gvWSM%7zgRQ?V z4fyx|{)F<t|Mx21-mLrhw(Dk;!rN^NzBDuZ|D3jSYt@&z4$VaYUoY;rGO?&g^ZfT@ z|Ho%3liQN7Y{~xpKK0n{qT7KC_X{2V|1UndEbi>8gey)A1vydwXEOZ1ocn%~!~MOP zd*{Ud|3CBp=Z62A9loAk|9gAFwC3=s{W-tx?En8g`%yfDj;8JBdkt?(8UDYnaJ964 z`Z)7Jy2Af6X>noRHx3r|RE1sGntl0X-1qBcKe`$I|4(bk^1c_raNUz(=FGJ3SN8+$ z`txA_%XXj}YHk#;PpJ<2wZh^1v*e@8lm0)-zke)!_q_P|?U7FQmjD0%XP_@o{K>*9 z!Vtxv1F{wrCk*V<8={(;^))z}J36FYdw4oKgIxVx4f~sYh5dDvh5M$71qg^TadJ;H zv1C&>R=2S<>DOXbP&fC|W7g_4VK(KrH<z_AW!}*2XJ+LjDK6_^W#-px;9=@wB<|?w z#AoW^-DIm68X~SO6)qPMrpO+}>M5ehtD@?zsl#9`;wd4hW~x!}!$76Mfi*H~hJa#Y O!{K%Tc`ptY25SI#OU*O@ literal 0 HcmV?d00001 diff --git a/testopia/img/selected_value.png b/testopia/img/selected_value.png new file mode 100644 index 0000000000000000000000000000000000000000..4b01e526878a204c9cf8f0c08dcfdead0ccdfdc5 GIT binary patch literal 1104 zcmV-W1h4yvP)<h;3K|Lk000e1NJLTq001EX0018d1^@s6X_Tb000004b3#c}2nYxW zd<bNS0000PbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$T;z>k7R9J<@ zmrY1pSro^A_q{|X%_0L@qEd_otG@VAWhl~(FtZe@yIGEff$T(RYamn5&c+dGHraHe z&{>o&W;VKU*HjnjYQROUX=^PVgiIF!rN-nnzIVDX8LH#g%d5<RySo2#&X50loO>@K zLbVI%2W+6<RUJ3UO0fWlQY`#05M>wS#tm|SxN*ak3k?l?+}&llp@ENX+;HVWBEh-{ zsYHTxH*UCc!8Ca$LdrCG=Ee;ThoO|}7h!l}f~}ew1fZq{nV4WpgkhyrzvG%^d(R!3 zrWS%het7?$zbX&_pFW{NA-?<Yfv2`DBaUi15g+G5CEU1iZYPvd4N5T|3^I7sg-U$k z#)=3(i^xCcsqHz^s1djdw3XLYua{2CA`Dy-fmn>paR6}OMl8nG?b{3iSzT9qy3S^) zL<V>RY?Rj<5y}4B7x=^D!LV(@wvDf{QCCO4wG}fQrr6d-p`(Mnt}Y6FeH3*4cnAQ? zLanaiTU*2T>J^tZHt=n3^3A(<)aG*dD>_Z1plNLG@3XFSou`(?_k)AvZrvgqiBRb7 zrr`HupT|lkk<X*Oc!BTbOMH(W(YUfgovxG8EQ=vcV=0{`;PoN{1LQ9P0Ko6Z9vC3+ z^&;ss0Zn7cvKZ1tq-fiWSQd+;qjb&9arq(uDls?5<<U{PEQ>|kW<*4a8i0tDMEFsJ zC($TIGD+|v0Fp_9(I|!pPY(J?3BH&UB4UZ~lL+(U<8;o<(D*e0W@cy{AE#4<`GY=U zRrU@ID-p3pBnl+saXKa^x$-ptCMUTPkJAApMI<UBhyJ+}hm}%l8i?Py!{&nr{9P@; z-Mcg=5`=-@MC6xad!05hl~VVCsf7hrhlkmA3b44yw<9C;0l$jK{gZTOogHa_=4MQ% z07vrDr|Hgu==ONn@9Cjf4Ma~5MURJlpxYHhD8%k*WBRnvbtDvG*A;}WbImZS`xKQh z3`||;T2&BADJ6mtiI6`@lg;9to~9|A#e0$_5+N^wp_EdNA%GU!#@E~XUx-`|&)66( z;V{?l-J?Am=K9zeExFv`s{uf7FZuH6+;U>4Q*P8Z0m)=|E<#F#)Xokou^4ateu_$A z0tvtX5=vqE{S;#{-tO$MQpw3=c+SC1{HEjEHW06^#S|e`D6l*=#p^(TJ*6lC4}qp5 z`X=C^Qj`J#_NJzIT_~_DLaMeF6Npy>@wmO6?b%r}_4VXAcys;^w4U)MX)WvQ`g-!S zvt-)a*#;gvhVXb;E8A!*#h-xT@PTBM^K3vo9@ZQ|0A9e<G?sAt;)ecm9TV^#r}+$a W5w;ivh*j?Z0000<MNUMnLSTXl_yY_8 literal 0 HcmV?d00001 diff --git a/testopia/img/snew.gif b/testopia/img/snew.gif new file mode 100644 index 0000000000000000000000000000000000000000..65b3417bcc1f7e6365439bd522bad016b1e7280c GIT binary patch literal 296 zcmZ?wbhEHblw%NKIKlt||IeKH4<tiF{{w-f<o}s7|KGp=Uqj=6Ny&c>j{mDy|Nr*w zzq|YY%F6#+w*3F_;lG2!|EpL33kv>MQ23vg_P?X!|KY>`moEMP>ec^<2(Xa|Lh&aH ziwMJi1|5(P$W8{<r3#K7p$j=OR;^p<6gtU6LOA=r=2n65*a)Gv91j^ImA)ni#Y_%? z_C+ODt1`2!SCw@LUSXNAcE*Ij-s5S43=7iM-)||6(epolx5A><f5YpKE|rB!b@|l= z<(;*fM(xFoecc+pO>H@y9j&?LMKk7VC8mc6XsAmp3So;AWMVa3;le1w#LQ^N$>_9* ghmlWRgpq}x!{Vs6u(%OBr-=G79WGYRg^CQ;0H^G8MgRZ+ literal 0 HcmV?d00001 diff --git a/testopia/img/square.gif b/testopia/img/square.gif new file mode 100644 index 0000000000000000000000000000000000000000..eaa4e6b9b829fc6c058acbcae35b340444754bb3 GIT binary patch literal 301 zcmZ?wbhEHb6k-r!SgOnr<-zd(48#9xMn~o{{C|+Lw1wf(cCN`~3|~(x|G(|^|9M+$ z7DIIs!^b0ht2!7itzi29X5s&v&j0U4|9@QiY_Ir?Duyp7<+e>?_<zIt*9EofYuVSf zF#La*J*Sr8%uI$)$EE*2t$(tU=gKOk|Fi)*%nZy7JV4067UaOhab%*3lAz<UOAL-8 zN0WsdIekSM*O;vqEVQ`&HbG%x%hu`MN`>dFWKNVV2sn`NWNx2>g1w9pM-dOVyoeOD XI3KGlJJ2j%HvW#T9&R2{M+R#ETyL%Z literal 0 HcmV?d00001 diff --git a/testopia/img/square.png b/testopia/img/square.png new file mode 100644 index 0000000000000000000000000000000000000000..ac81e57e9268153e0aeb2652e6d5d97067b22b41 GIT binary patch literal 27882 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 G68b-!!u>`7 literal 0 HcmV?d00001 diff --git a/testopia/img/td.gif b/testopia/img/td.gif new file mode 100755 index 0000000000000000000000000000000000000000..e51a0893497b6a1d11bf0c7de2201e68448c4dd2 GIT binary patch literal 58 zcmZ?wbhEHb<YwSz=wN^X#h)yU3=E76Iv_qshJi`2r+?+_2mFp59|AfbRpop;FT!9A E02XZxcmMzZ literal 0 HcmV?d00001 diff --git a/testopia/img/testopia_big_picture.png b/testopia/img/testopia_big_picture.png new file mode 100644 index 0000000000000000000000000000000000000000..736854f77b179cc4b7a4bb9abf67e63725217de6 GIT binary patch literal 44411 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 bw^{B~-GmJnj!Y_)@P8(TW(Mc<mu&k#%cE9} literal 0 HcmV?d00001 diff --git a/testopia/img/testopia_city_128.png b/testopia/img/testopia_city_128.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2dd92e6d2f0f9b9f043be223c13193a4e1e5ff GIT binary patch literal 10376 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 literal 0 HcmV?d00001 diff --git a/testopia/img/testopia_city_256.png b/testopia/img/testopia_city_256.png new file mode 100644 index 0000000000000000000000000000000000000000..cc1b928aaa85320b6a3c3a82908ade7fc46ed838 GIT binary patch literal 22869 zcmW(+bzBr(7oH6|mhM=jLs~kPZb2F)B^4<FL2?NR0qK&KR-~kJ0THA_8l*$IJHCCt z`D12wW_~+!?!D*S=RD83kvdOR2ykg|0RSLSQ&rRj01)~V1Ym>FhjAiV0rUZCFQ+93 z0F%>yw2cMPzo|Wxj6L*R>^!`z-r53kHZCu1;c8A+_O`mVRyOb5e%nd`fbpi9qMW|> z?5;naslM&s2aZSB;Cv2Ba!fs@LKOFFw%PKrBKbMC=X2lIzrPdp^wrvV*#GL(SLgEW zs_xZZ%4b%yiPzmV1mB_cQAKPuuX9<kKL&GLeCvJi8gkiKPTzb#lrGeT!uQV3(w1bf z8_E<vY4&SxpBpc1Y@Bg*FT1_HU3m2>Jw5#R_~b`*^`YgPH*Z3JlQGI3{ViZg{B1Kb zrB&B7kB<v{X=h`#y*dB0OnN}bNJ1~}Cq>8exO_lT&+q7VqHip-Z;WxNJr|;p!jnzL zSP}K19LTc&Zjw<g!n*#+*N%12f`UpAd9~Bw|M2_j9xU~$r1fp#(zpK2^Wg^jzLdcV z>KJ7+F%OKbL&uIUN)~?pet#d{VAGO(KmDvNdrN2vlEHc+7I@qWRD5IHod<2HrozlX z5-q2Efv<|SwF8q=4N|7sPGU8$u`h%A@E#=M?n}!dSplAVWfr@IF|-#&j5VBhmA7CY z#f85)G9*&2uPY)fwA30hTy6dTG316+{T+3)PIdOSz_=R0!#*l^vJk++d)h|1V&Qk% zYh|YH0UH^Oa8d88Ji?(VWHhvlW4r`ySQ?)~?1#)S2)}DY?t>)8xVX7@Xz7mICEJ&+ zWw>^}4F_D_JIH9j)ZKY=0`@eAU_Lsk7XZCoVc{NV&L#D<Yn$@#3j_?D|5+;7Vzxnz zk_>IrKwsa`rvyE-??wR2&pACkPq|U@+*J;QVamHxZ9}gL=fkB~S_S1by+YFKG4fmp zkM9wzT&80M$qD3@mAx@DL^tA^#umu(>N0$DeRJnR#R&PdElCO)UK|_Xj=rhNeerW@ zNZQKIu85br3G5MFNO`!mQ)GxlZ`?{B2wSR(+v~y5?L54X<pBMwWOFXpB{RP#P^ONi z+%4P@tH}a2AC1&DXJ?p>>qddQc1gILC&m^(cc;zQ(yy+Mpn|<;6HR64Cj}@7y<8Dk z`eX=;Ch&X<M=u}0`u|NNgH5VrZ0*=x0QU4p02fC|S(zp!CE9juf(ZTzi3}`z+Z~KN z^rw+wV2e)Z8*a6iw|QW%Wv;J}tE7_u*G3;>V%&CP)QL)bV-f$in7`jaSi%riTnt8A zNQO&9v}7!u+1J-Q^5VY>{6wlQI3rVoTESN9e)e7#X>T=<f5}U^QCdsT(-dTeljn}` zVnJCM53>;IW-3(-2($EY(MaUxux!r5*smB{+x6;q-I^a`r#4x)ahG@<2WOLFGDNP< z_83LPn&1`HWtYW$V|3#j_Qy+mb9(v8(Xmt#8`F8#Pu5)~^~re5s%<9vWVc_B<Qdsh zeQLHG{nGjmYxB+ug3WRJBk$g4R#N37pJ|(af!j(=^R5JWy9s8wT)f#qngm5X4a#IY z7r<a&Y_&yR1f6Po(vOHE`zf45t9<5)Iqopuw@oax(|~Gf%UX){#8C9I?Vf%9dcT!v zgX999)n8m3!J=p${(Sf*UCc87Ju1E&;C<n!caL9}GlPk_CiYS_PH$+DujOJde`Zhb zcYLK4?ACQ7xGfx64wRdqe570MBKC?YIS~G4);qGnsR16~OXw~B7E(s$xe-9giBPti zj<Zrvp+z-8Hf?m`64;qm|HLpc<MO3!t>$}TxDMhPrG*l{Efd}~Yz7l)RJ0*sHd{YP z(RY4JRLtMZu}?1wu;<3pjy(LlMYefhI82dSRgYdxsMCzRyUyn`17%if60;>&+XMUr zXHzeJgKFg9tvd4PcfSYFSNUADu{0YXxVfo)|8SQc!QjIv-LF?}(a;?YBjl%=wT%ie zE4IFg`CQ*g{XPDF{z72%Ml%{0_734k-Ja)xxnaA$?n9>f|Nkol5vltIl=8(?1#Z~- zJkm4*rpnUNs0xV@mIZv-?Oz{$U2hNITI$e)3QjEjJ)dJtXQhY;y*HfAmgcGek=gJO z93Gz+Jd_H=eNN7jwtd|htQ2*c1w|VbTkG$;J^voBm09`ouOV)3y>B=5Mj$HJ3f5!_ z0gqGvcHg2Qm(Di602+Ex!%YaigQsdJU`X+1Z+l9Xpi8~MxyVp(c9Q2ZBK>5eBXRDa z#D9}9gfC|<Fz~qSN27St8*~W!Zm6tm_b1}WDn(+XckY@q-V7zAgfTUH`cipOoGRxM z;}o#PW)M5mRjW0p`^t@=<+baVNM6C{QLRkzihr$h-QCOBbb<Y+r}rQ3NLW<5|F^Ll zFxyN}u#QAfE|xC3$C_=0Y0^twxbzM9UQHU=>j43H{Dtvhyy@p<l;PXBBMedRzy{== z>bS1!)eA4W#WH2OM7Q@qo$J{dWuE#NmYK+py%Hm&3hqENN2v9L3a=?1#p4x-p*F8Y zmA|Cq<_bDcU;X1d6kL`QgSfkTJ)iAVibea|K(g<O<6~VyvKbKl)+rfy_b90p2VV9I z30yA?teL=fim*xjiB6$5K4S&m%I}wmtpo-7AXtzRcbc`1WY<}AABwiX=xg=aWMpJ^ zUJ_ifzmw&<0wLryVa<9Jehyd$v1Mgt7*Pz}(NC!JvvP9K&B`OC`t$i%VrX;vyoi5X z2`(4xn)C~oD-phITHtkN6PBwC7BFhmc};j|8AAu;-_w^{V?t9?UtO}B{S5m4?r@mt zS$#qXwq&}|ufBKmFcM*MtM`(AMC$E%<h1qwaN#S!<UUn_Db6M;=eY@CL0i&gy)Q3H z3SMfNCZPXegOM<}pi?fBKXPoC?k5Q4P2`7>u7uMg_cJ}j6;n#}Te`3F+_;()pxTH_ z^QthqE=;~*0?b1QEWovY&{9b*!d;5Ou;fO<wOf4uGTy`XM8&C|yp&>qY78?%bC8$j z|178Dwt8~rUc0VpeUnfl>&?x?#U|L9=o@|ukNf=3t`?zcGgYKYoUs(7hZSpXYT?@r zhZ%K;=p|4F7nsMZycxktZLb+$4)K~7ay;9~S&_T=DI4~wO%78GBuH)4Jzyaf==mp9 zZdSX$2I>)pjKzq-r<0L&MM1sC{!D}MI^Hh2X$wl_HGi9crRc7vU4|e(*zx&Oz$h}s zS%bc~CYA$EJJ6)GZxEIS`i~`ZiN}9)r0@U<WB~tdK+rSqmeMLrR&pNE(r?}3i34(> zp9kc2J4qSv@o{`_8y~O137ubxWe^5s{-`Mc)4@Bkl(nC4m9}JI#RnKaA>SPJ4u3ZO zVRTvu%k6Hz@%yP9U2hK^Pu!V(_phu|xj#A6X;kRI)3UO<`tO~0^0X~CIpW`*^QWXb z7i}fBk7KZhb&K&XA8TT=9aJ31uQKQvPR-8g5dISb@+Z~zBQ7e*{CyhXh#?CPNvWd3 zP{WxZ9;y;jH_mN2mL@~_$cXv}a9`9qzJDj1VlRl%@S8?qcCAdFRg3X>wYfDDaLORX zF$s8<1>jx5f0*D9?zz7>S*(%<P<=EXbAqG|OXsTU%Pf2iVDtf=YDb*f?>i3jPcNcc zj5zKd8-`R*a+D3&>2XYEUhyR*+XF7q#^2*$zj}Iha7RQKmhg8#ncX2TeuP@)`%|F& zHQT`J^kRMi?Y%6^{WNP-C9tSKTyGN<L)7aJJd;)--)q09=8|LQ%>TgtlBgJj!imdK z`G8e#FW7Hz2N?SxP0U$GT*9256so^7!xp5rv@XJZ1S1kRJyfsP0(*GF;Dbs9nMhn{ zef{g0qCbQzou=~d2b1yctwxWAOMIE4gR1KzR%;c5smtFK;Z8CDf!Lq*kxpDs>^ok1 zVmKsrYyL8L`Hhez<P~A=n)H15al#`E>t5{2y9M9VXMz4&9}vMGNZD%pn{=^zvkKew zypcaXOCequyLsidP#t!Rg~(WuV#b=6(Ic-eujYR8W2F2^qcE{=!O9-VI*QH950|rk z`Lb=O(PkV{BZTEJjD%UN=Gt0OL`P2li6|Oam6Mt4KEz5oV|WAo{XGgU5srmzsSA>q z!@_XwE1GexRW*^F6mv)o=me#OQo3}1I0{(n8}Jo?lJTmiG&&J07B2x+RW%E`ucE3_ zq2o1j(&6yipJltdB6lm)>FFGI<}&`kDde<%XOEz^P+o&is#j6uSy`7712PZS*&I5` zDTP1)^ccFo&1;o33UHO2$8oTAQTDIFn0{eee!qfh6#NIt^Q!ET1S!u2UizDh6U<kA zgiAzX<$kC129nisv+`T%n}_0$gZI3ghl13+txO}9`=p?cYSJbdFZhDD@Nq3iGI1U7 zXi$`0wf~IC1gkqNOWj;Gud8rXqpB#uw116CMqY}>2EDuFh?8^YLj8?ng`|fvvtM>L z*UiQKT1LhyTf4|OIPH#>k5|#_^4S>BdYu=@<%Q{A0DCK-nnLh%A@+s!-%F_?&Yj5N z%1hZ=-D?5NzEGaQC&Q1dwe>KpTI2Ykp`128ZE<L)uTIlCPFlJ9et`cjoE(kPcewW| zsRc6~-xJgL+A-;pr1*{XDSU*pb^kY>CmG-f+e9hu-8plJUyC0&D`4pMWGn@nA^T~s zG#*~i2xMe}z+pFijdzx&j_5fPbnPCRE5rfJuXF2%)agE}fyBhmG8Ye|JEg3MeF5Gl zfW>TgdFA0nYaM<U4d+OPI^4VuOmM$+Nh3Kg^tdKM{!LM|3mwfioZKtn)()p7?BV$k z?Gi*%y&2OQNB*-x8nVyAfW$0Y0ww*ddg9y4fsrb)BJ<NvsDOXf*W85L+j`j0pciYQ z1siOna(yQ#C{$lu^oWXIDUD4lI!Drr5HlF4Ojtyy8P7eUo@bwK582PNvF%n`h^{sL z&3+6uWL0E>U${VbEO8MqYLN=f_hSC)eUpzftgT;e#eGm`(YFn*(XpCWY3T3k&w9&X zC1mrx7jjr*d?}bszT^Tj{9V9}{6Uf4JgD1sd&{Xux@3-p&+r|iyk<1>^qp}UI3Mdq ztS)pgF5;a}gsyc<zGc*XvOI!52=Krs1X36Za$-xV?`~hJ#9SPmV?Lmu!AVOWyQY>9 zk9Zb+_>8>F9cEu~^JZfFtXKIOij+{qud(I;mgp*v_{uDL=wj()0*<02DQ}Ouv!#79 z#ZLKxgY`fDr7I5~|EsMarJ4PL3)x8IP>HC1Wy(T_*-@{8tAN<_gf0C{=BsFQ->|W* zB0smUZsX+R{Fp9f{dP>jGJMQ@5g~=tF;D)){dn*9D&ds#FLLjX){^+M%O*i$(9jr5 zVz&Q4<j5yBR@Ri%ALQrj1_mzD7rrAPk3I|kYDgAR_XR$kOMY7=p}xbQr~>Y$)o5Ho zE`2t6$&=t$9KnE16pYdt{%@Z}j9I~L<UWR0v^qBMhux6P+qGtehtCNuM3rqipq3Wt zEZ$Phf|By4>TPvrYum#13YS@xhXIKI)64RENCAfSuTQka|JZs#K=HubN(NK+nNu~< z_{_`XI<IW0Lnxp~*QR8*!DM;zzS?NBf&j@2uzS1s-71dcoc}9u^TL2v*(`fYj|6?( zetkSl8ZLu@fvTgDnH~RZHPq?N5#jr4x%BgwK*p=h@E$KCv!Q<0!0q*e_M80Jn#`HS z#lS88R|^tvIJO{MVXoqZ7a#bbBowVjWe8L1j&NjI6dW<)Rb1$#?T?ploGY9Acs1;S z$7GUvMB)}(pY{@4r$zhW?#a2-d`41@&F_^u-ePz37wM2_1vgc&WC^I30?onV>L5L$ z)3Ol8%^V43mbNBxi^?xwRt`lMQIH25T;Mf7s}<KRrAIyioan_0TV{Co4{)2H{5-ZD zXE3U4{d}(!zS6~hzj8FAfrc$F{(arj*3M+lqJBedIg1{tD5jRm0JFJLxt>E{OCXVi zbUFL$T@yv-S3%~{Wo}TloA*I;<01nOH>dom;7zKwrdHbLYP-k8i<1@d#?9~iD;+7N z+5<NRECyRFm^I&eAGzk_VAv291{u(FjGgbAWF!PPhb_wpoV%T7-yiaNBekc`=L17% z(8*gU4Dy$b0c8WGt(0^co)>pFH*ROxFQe!zNZR*&^Ci%Fy>WJ>LPVx5fetk4*X9%e z^YMo}f-ghWWSjdr*~vr{j$L!=ch+)Ckn(Y|ye)p7R~nMk6`kLxui#d`G}&}RCll<F z^)09P4M~uHITBe^9!Sl@dGUv{wPW%nD1y4q`LAE#+v<<&Iu}4L6>_7NJtTvs?<?N< zWNKE*=#{4MfJ5=z-cFZ&YpZl^ppH&ry?cOf-ANX0#3Kfep?FI+D0K7vIt-6RMLN)A zrN#D?7H=p!;elICY5_GE>1&)b0z!}=SUWLc%rw~Lz<p!Dt79~<#yT%v48`TQck0VY zeQa^mF+{JX7Wtz7jd`UjF(U#PCMtdX7XKYvNbIg}{YLTN*+g<+;NC<j4h~=IrRa4< zv36EM)s2<6JRzovqR-7WMn=Jd&&_#g;KxyYH{ulzILTO`Hp7oQ$@ktKj#3s!t8)Rw z7hXrMu56qXV4O&v$1{F|u|#B}Oz^ljL?dHgf+s2haf74a_h`54yW4kM{>iiqwt&K_ zZys-TMMQdOjL9nM;<#csZY;LiIrVKDaJ%qg0L$jJ$FWOLB!Cn|F^jOh(^6OeTqr^a zd>Q4~^OAhI!l#NVu5K}mxO_6XfAD_Y#IlJ+hdJcFYOMl(9XVd4F*PabvDE85Uil2Z zqrSpx+|~O-Db%=YRo9$%nW__`t%TF-Th2eD1wVQEhD2j*GTvDrEL=cyDhk+tA&=m= zJG|wSY!3>V%YK1*TYJ_n$<Y;*^<oLshr^3;kJo0qTBN0s%Jc3K(Kc1LD|`h_#El$k z;1bb7{-WT?5w>0Kmj_9qP?}iqBqbNJkBuh!RFv#Nk+D(7`104z-19FK)@<otRFq=U z=|)8Va9R+ZvH!AE^|qm|+{<)<1z(T48B~`~ktMG?KT+mIb1|1xCHzgpu#lw}LH~$| zR0FkayH|&uK-h{0=KEzBn*&#bVn;kWNQh(|k{<fLp^*%jM00cN>zg5jZx*wgUQeh; zM-k9bf$AZdA;Q#|)wu92@kNV~r=R{M-~YlSYKsnJ{Oqx*C<XokV{8BN1-$D&e~OjG zanXsv9-DCvm*U?~$~tm0t4$sg5uGsD2*j4K<fA|bLq{~^fgK!vN3A{at#blE^fE`z zD0U|<V95aR0QG5U%()A30lgQa%;9pA7K_!kN5@93(YkL>mG#UPY7?h+c7o_a*iZzz zi=wnrA=gDSKp*IucFksQ#Hx#E@jzP}YgGGsA+Sd?J1-y}UYdI1PCWL<z=$&-wJi@M zm-kmDV7mlI7(^%Ucl?F<=5NTiFB8Bm;;ehvH%!ZM-HiPF^4K&zC-dn!4rbz;IK8+% zI3(8-Aykw2@o6E@fQ|=4!nqI4;n#J&HEs@n9=C1|WhJ_C{D^LP(%DimXydvuG<XT! zm6icXWE>s}vX1t6P)Pv|j?2}!eIqcF&{xx{mtq?ju22v7yJK`0oA+Lc<ac{h22L<v z62|Vo%e5K^7LZh+DRW%?$qJ*xQJ#{MPv5J{ymzCoC_K|NPwyB>m3g~g?PX<^$2pH~ zVkf*0T;<VJBsP>dyv3oHc~}h46PU5=k=HQ4d?XdUxmr|y7oKpqA%h8la!`ZN5U54& z_~Y3Omh4mC^_i5Cr!%Dta$eK@pi5qrwj2$Pcem$LdpvheRi;G%a@H-Zq19x+ZyS?h zhBh3e4iagxKCl;wX~iYT)e=*cMZtiTQ#{0dwV=$eR1m_)=Ki*7^%uka#vyG*`+nJ6 z@I4fOd55L_j?BdoUW|w*XFi)*gwr*dyZ`=+9-iwq(y*xS(K@d_x&40Y{4K_j49JzD zkYZ}ck+dKBnjGjMR)@h4cUs)k=J8K^TFrsxfo%Bc12wM~grMih8W8TVOhb4;N4CH3 zAg;+Mn<0@5xBI5!AwVCY9gtK4;sC@7vvyK6C|Wx{S;cnRshT%jovS8qP&KD~EQIKl zv_6vH6sWT124;R{Hh^`)q6Y@PXIQu!H-a$E{?Qv-M?rG2bY^w3c`EM|uR)u;fvX>A z&n7f-F8%vH*WO0ma8J2N*xCloiC+qobo>cVWuk&uVse3+mPZ%FPZ-|2x=fsRKj|T= zeU?|imWab5WB6QvCd<#zP~?`6Sz((<=QYQN@prq5#)gIzs)4$?Bx=^4Cx;OX45>Lc zIX8*+^wMvqix|Zcy#`T@ZV0)D+e3u{TZiGKuMF4F8}8a}@0;@^XSY)hMH$P>i<V;^ z4j?zHe(@%?z5Ri<!i8Ch2pPX-b7<8>LP-66P}9|{w(%W}SPhvNN%zhBCrED491NY_ zMrWJ@C>9u>q#xTNJ|~@f=K=8h23oBINTprEu(!roHTJdCJuF$ECAd-mVXh$3WX+MW z-g#!eN*uLcBke%zfRT1RvU0uMC;D*l`$H7NLhZORN!8b;jvfnSuwbmss3aR_Z8udC z_Xizw&@G$-D=jFk$HLrUHxg{gMg?6Eeq+;_WTI+byNH!!EkPO$Vue$wr(5cfH?Y{S z9X1Li+GR?)%{W^h^!$~y8^EzR{dEIv68_AAbl*vlBSlPhOoy2KGzW)d!aRM<Jbbwk zc6J-BYHA*V)@BM_L0;zOan+tn-vye-$540T=d4lRZuu-45V{~PCjs?Sz!Mk|!G1(E z7*xdnoI-ZKHY({3Sr|(vlpZ@F*0QCJyDO^mHBvRu8X^{Vxu*2YE%9k~W&R2>=i?A% zD~>;Sm{fH)B2!DF@%Sh)b@Aa6>mcs$oy))Gz3yT85WnKZCk`EDa|VCGb;k&wYjkiQ z0eKTDRtYHvMgIaeRL_rG?!E5+^u3K73!2h<hWz*uxA3$$)otr63{#?(^G(z<ZA_Jz zbo?-py<~g2Yol`Wvk?dhMU##(wl>i=as(n>**`6ri*LEH3`)atCCo7gPWg-$&URnJ zuuxPSPQ4#O%F~!TTd2~BK0XH_4b84QUb)O1Nvl4ry{admqxtMrL`6tJZshV_wz;I? z_4>-u_81t6O9s%%zYtbyV#7^JN~^JR!oAu=BVk@sVTGug8fi@1G%S&Z7ce(!Fo$wZ zCC+9kB93U=`@Qei(+@%V^fMO>(@WT22?}-0HHDRN3dICS@%eEWfEYn9XS+W@FU}#T zx!Tf?iAeS?agjqUjnewM8-bW8eDL}P1Kc4Mw4T0!A!qnOtroX`#_MlLPyXQJj;u7g zZ`M51Ge-BWpP!$(xeQ$D&_TY4Zyl?;nhp=^{l!NSQ`sWtU4yWEq}i}|LVVVdfUlGf z84)CJ%X)toJ%9JM@|?aCT}afd<n&>ww!i<nAti*{0>YLSmzA1%_=RVtz)+0^t^x%F zT(h@xGqgiQLL$P@jM~k)zD+sT7_7b9Y<$om{8c69Fu(8hcVvWOr_TM_@w&;(%+t*_ zUOl8*;!0JCd)M`u`uE3N?)>Paa~~O8o_RaXHe+Byl_EEth(@R>O#J`&qhmJuep@Dw z*~WZhC2bimdsDq^zq40xJ+9RplpYuN>}tZ%zw-qK&LtSDZ38QrC3EgRzC>%R#dar^ zO*{QFAlRoE5OLadGU`Rhb{=todf{brg1|=cqe735kI|U2ZXs>-JR2|c6Ta(HUEMDU zGdd<fkklRKS8>pT!%Md0rM5l~_)8?{B(t9{?PNgK;UAVSjLze(C1=mH{&xOoAV>T2 z;ndlV;Jtru<OP;6Nap40s#->l568_?&p>U*8PT6V^ZNEK_(@jvenF6&Me+%CW6z$h zx#EH6Y4Pde63#p#`|(CHcYbW@?G}jGIh71nszaDd8h~wJLUL<jGUJ-v5&z7Rqr)`& z_f?)&F;5c`QfA)xcIJ2;`C+7Dw95SQD>Cr8kl~!9E7X!I>G?c)*a7ay81;ZE?X+2L zw#U&h^T{Tk|H_4vSLzaJP*ibyqa1Hc0Puvg;^R5w-Q&*-=*;fOljv4TN3J;<KNF>T z@KnS1)vEF(amT<FR7)aYZ1=a?l~Y9f<}ha1Zs486vVpAK$ieK{fhp%DiJqnFSKq{h z6kd~g!jnQXeriIrRwZUB8In0ARw+wwDu)i$gc72^HU70W+B+dWIm_g+!x))^d3pRH z!?}Mcl{I9Gx=;+X(%T0);y<zu$o(WZ{-zW&JZi$45^?PI@g43GRX9GW+||WtlMFzs zMcIRcK^CM1fe#&|ScIvG%`x*A$BpBQ`?HrD-}p`s%#u&eEHv=i3uL#V_}twvH_*sv zSxR@trCHO+ON-25YKUHsWM6p+`vT7`URas!iRXlRt)iDfYxrPds?k+&5cCM6Es9ul zk_hvL`-vu)6@!wnfw7R0qhrXE8-WYjzJ0whaQE+D0pDM^sPew{qPBf-Vc1fHYO#HA z5DT#NXo3g<TY5j)5nH?H+D4tg=+XTxw30lHkvdeyssUgBaO!r#<-tV%O?C>I5SzR% zB$n5r?Lw49{|QaZ=F^tHttyNwSeW=9Zw?QJYuh=RltD{3kRR#kQjVJQS!zFWwr2-# zo~zxb=Copb(rz8gmseO%_gd;jV>7KJ(x&tMzvLtJInSJX1$%3A3eKtU0=Co)&}qk` zNaAjG*{@_>&v4xO9@-<~Tr?ryl8i%sTJ-f}OhI$NM&8@gYI}<s!bG3wJ-V^{lD_7? zZx15E&gmWX|8WYVo_1U_Rs)4yTwI;0Jg$ShVa&~9Vw&PL*`jK}VCXc~Vb=$K5bkQX zyG*XK^I2BEb8uZ7s2v_M3Y?0?s1<o()$HxP`Cv0inwO3>4A&%C{YWQ7UHGu{;z1Op zd*hl{N#qghjE6~!UqMz^DOOp)zs2uPKoXX=)b6K4uJ;FfxW#|>(o_>Nj>_6>_Ctkh z<MA`WS436g7(%^wJ{=sr*IwL*4KcVi&g2)T_EZvmV+4DHIZzQ>OF!0IhcbnxYABNR zYumvM-Vz@FQHMYMP6oZQ+|3V|sN{+3P;;u7JzDZ$TslhMJu4?)|G70u_UAs#IVNp; z?qwS8A5Tw)Ku_De$M-{3Qm7l(Li7u20zP!;Hrh<B?A-s0V9%ix(#AeJF*>3xVPVlZ zS*c5r8u;41+7jJXeRYs`+T0WSYLxX04*eWt_o;@4mjAc1vH>!y=V+<_9Ty};ay7!n zA=&OFc=miNuatIS++``S?f#M7G5&INAnV&`I>g7Z=W(#cgz@61uioJOdM3M_ZdrhZ z-u)Cm1jJGs-G%lD0L~yEBU5tyZZ2P-jyi$QdgJ6}OTr-&T%R^kZ5DNT`MW<|WxyYN z<YvWeeY4lsgt-yu%GkYe7hjJ-8rxAX;VFdy{KK+wxesrNU6>rqaN|>Xywl_*Y;2Nj zsbMtePV}+DJBW<J?2u@(i<1+9&~X@w$G0gYCr?%t*P#fa#>*GJD*lxC{ArJ1$6HoY zvPx{LNMb*afdXpdG%Z5AeZTLc?j^By7)u#US2S1*izkJne%RP@#6HOH2lYrs{s;St zKV2ss{w+!6T%9&F)byJ7R|~&a2rB@zF01+auG!b;ugJ^YgH+z`kz$IV{SDIVN#7g} zPQV-3>vE05js0x3c#B`zhiw1d(*Y?U<%d~+olv=$uH`4?!MS+q?&kR??RWg-5^gqo zg)z*6{Vs-J&Fq)zcV;Gj%-8EgVkdk&KHr`l;<O|HSil^N0f6yldP;7gW`0a;<0A9h zK^LTB^Y{I~>EPVlQM@r987@w4D5TH+jB9g0xm<f&c`$G5;xi3z<>Kb5)$WwzGPTfS zrQ54W!pD@W_*VJ|7tl<78qOsC_x6thEu%KrBpUl)>)W%h(l_T4jz}Rfq7f)yxwCnP zuPO6|bC%q)BDfXLI=7~3b5K?mPqhm7vt%$wYHlFW){KyI>vQ+kuWg(yMqWt7b}Hp; zeKDR%Ng_GG0|MO<#Kbh$m$zr8>Y11{vau@hj3<+~tQ&smY<zznU%=Z|Pnk`kLT-@I z0sVzM9cN}joQg_kL&qWw15rqjOZ&w>db)toi<CVMpmOCa4ZPOc{?VQ{0Z?J{uTJK) z7zP1{k}oeKXgboEyR5A*0**+lR`Bf9=2lG(W2Y@`?dx|hG21$;7N_XRbIV#Xd2LEc z%Aacc!i43x-qt1Jo&+}Oo7ytAoZv`%u9b}OD4ywxS6=Henk#!hj=1lrzjrxup(J@e zF9Z1!bP!ClYg(UK!g>kPtMOmJ_7h@}g+;mCuDhdx{{-!dzI^%e-2aGF;9>lrNl6!( z(6rBBhJr+_D>?`DEd7hac2~17V25`cc7wsu9{qgc<*gGMk+>F3vo;4(15LDf$*CRF zmGK;wztl7ALbgI;w5zA@2eLAP+=5%RZ+3}PWwWkZ(dcnXtscXg&G@V9{+zZoTSLp` zm%#*Gl+snyftGm{p~>6Mu6`hF=4SkGFz%GNZ6iGP<1yOlGH4g%KfU-YG<uuUJ~=Y- zXW-}kg1fj0Xdh#AF|p3-u4%yV%^g<C%|S)$Fb9BbVssM@_s06v+ke0E>EAp2F@TA! z^^=Wq4Zm1amx6#hzM;6HbMc=`P7gM!Ifr9y2CSFge|}wlvV`kujCZa*>3FY<Cew9e z*cbWivQD_j!V*5+k9-h#$OX1fDdXgCc7vw=;#PY6Ub#t3TwgGqTpoDdGo&|b365lR zTu7Ptt`Y$$=4xBP2uq3NKR>;|bSTKiFS1u;W`X!>V@pK9w<7g0*ZVpcIZ5eqTCkzg z7jyW60Z}Gtxv1=c9~jREL5uj2{a<C%xNnFJq>Voyk-#5)1MjO-&hN)XgY9L&8Oq=H z#zPM$rRHqktNa;YiBgMH!=vEs<f?z-sCRsFlFDmR{pRYeH3Dgtax=JhFop|wcU9$G zqQ17vdLW+x?MMc+Xs<sY1ZT8U7G9vhXInJcJ8TjB+3VD^er(Cpw(|IHkf4De{5(Ll zjVOZBxo9_B|B@(qX)#!d=<ZP>c4`)xC~_&M!@rqUqVsJ4oA=q*WVFoQB>SEMVA6q9 zW<9j-s=dN9F8?mqTD{j#YG8TxyDqP%dRT~AuJ*^aP;o`Dlt9sQP7>U&!JYPTj!VGR zlIKhPKXxxFlL)_+zVT<Hl3_*j2&f(bA-4`CB;oW#^026aV5b?JBY26LpO&mo`lvR% zSbGVHbEyr;QVmx{2D%QYWz;n`=z=Vr7Fwv^Jn-2KoDkfZ=qb!hv{a0}Ywv2;e0{K8 zI{kN@T<myos{YRHjO%1i#%pk7u4CsPu}4oHtbW*g_tj@8<IS;3;S}TF8{S5FG#9Q{ z9Qu!+gc*DpAkK$nuQ=!H<T^w|J-&)`FegYbDzm2v2GJ**mv345Ojk8`49k=*Uns7y z6&=bkS^oCt8G|{VpS~EZ`q-!Jc^mS$0(1@!CM*KBuw*XRGK&`x+953Up0%~-*&x%~ z9t%3N<ItZnazs0yA!@3PjiviOTBB#PkG#k9EtF$>Pq+T!Z59T-_B`AEASU-4ha-J+ zH)JDsPp{tyr2<*9`f?EQr;vKI_>-j0J<1zj-Y-ZSl8%Y_GOzb>9M4*X%YkuyW=nPH zH$!`lH(@qEvlanNQB=M~*EfR8(4`j}D<|=z9mc(pSA1ue+5y=~<S}U3kusGNnfzFk z@NSD)Wvp<jHD7kR*75J{)uP`C0sqpkKKC=*V%ol^`9D{sFsN0d*<3jJ;=g><HD$eU zC%fAZfHc#F2gzDxA|J(2i+t3lL&r(Ix9caARxT`lP}C1BJN8(5(eu;N@dD{w1G%+? zFM{t$I6j53WyNjbZrQ2o1T+to@$TO`UMhkZ!C%XE8Rqk0GC6Emf%qx6MiDvB$6sZe zQXuLO2e-I@Zo@@X4uu}l91jcSy(K9ri-92)*Vew$Ll@@@;5<uANZ$VCy~?$kXnj>Y z#(lz7@!lIoE&fTMJQ!)M6{S>Mm}6f!TwxLZeDCz}f}8MZy#K*5K}QC~qGReX@jgCh z&3;S6w`i^KdZJr}Ej|(;`8IV1l39NY@RkNKf6KZC`9K$sm?kt;cfSpyhLUG<;{~b^ z2$yE-&V<x)io3HtbS6*333tH5CbHaGpOe9QM%ezuXR~Qt(=Dhkp^yLZSWct+$*-Qo zmYwpl8rOt(#?wUjB-)}-_E{6cpJ?b#%^P4OWj>!?pOl<JqoBOx9v4v14g@R_ueexm z0P=9X;&6nFxu^r;VSgVIJ77Pqw%zUIS-5Dh;SW?^T778LpQZdo;nw$jJ0}3rx!}^< z+IciuVy65)kT*#l%FrMwwE)7$#eces^nAf@`rTcqLyR<47#e~VGH&?9A?x>058?`+ zQjfL=>jOVjQ8H#$0&cXilH=WXtI;>vuM7xtOTOT^Q@}jm*2g7!A|@Qp_4Cas-A^(x zeM9}PiXx!>kW*_Vng=6(p;rH<p!yFF0RhT86y##I1TQq3=*2&mNtrXrTs;dZ#2{wE zYKH;Nlt_7T!B;_MFEE7CE#c$9guVz)5pD2twqJUHygPo9Q<%-y+bijKZ?{ba1SQ_! zBte6VU*?tmW<OdjdjqsoSEI`;j)%XHxVKCX7yB0L0(S4O32u8Pg`b1;zdjUXA(X}z z$NQOi=ckHdsv?~bq=@SF*;+X@tVcbX@^g&7zQO{B9xwR&TJ;29dUJU%v30<A2AqXM z$53Ygc9QH-s2Ss^LStVJ?CJzREeKKAom`L~p&F>5cT)IKxkjDKC?THH=|GJgWIBy+ z>9Cn?37no96O-RUHWvHm68~6tO0&j4F~2sDAL2R%$~Y}|-i*2uzd2uM4CqGaQKbi9 zyhhbyNJ=x}tHM-=R#L~8m_rFVmYR3pgx9|gThm}rJbAW;)Gm2RK60V*qDityTcjrt zab3H_SoX;+kp-ETRV<I538z~(g;t<%hbX9hRM6bw6Q#7np1|N!*ujDOw(etBp8Ia; z)+Y1s0%E!7AcC|#c53S&eufr-)V4+*b0AadEC-;el$6AzpK6^?N5~$hTe3WMrT*vQ zoZBVi+Tlvgg`>!X1+VVcmROF;yy_Ig1ZVZPY97Ks`_FL@DJ?=PEbdH13)qYI%uM)u zvJ~q#eipjxhI)$=D$BN_H09Jcb#Ls=3<4o;vT5lW$uXK~)Kb7-f2>NPB?7D9-NQDo zbmPZ$7$??nSA_7$jE26t2GO<7v=Wt2$FaxOvs>Grs$E8GM+6;a*SCEFm;-aZ0az?y zEc}=32buz}3gMS3hDe_R8xeWLTl^%lFoVgOTURE37cj=5AmKvIk%10yMhru1E3b%5 zC*aig*$dK04UN8~9&Z5F!;4AaYVuo2`M9^H4)4Q<|3s%oRxf%|UxURSrJGJo{vygs z_{-f>tbaSiBG3zhDKgU4Z%A+7;awz@H<$?rpS>u2FaC0P;`0s)RO2cX9YjL7^c=hd z#sKDX{L8sj1JP`{iWhU78S=(>3V0}FXE3sO^PX}=11UlEW`jw`kvFp9xe#W0Hy&?7 zdV*t|FLMWG2-)?`jkcC5m8A1-QfO$rz*COBM;Xu%(TFVJkYCTo+AL)PPI+et$M`>3 z)#Ixz36Q)dp1#jK;7fC9cJUG%mt(${Bhl<ZM3wN$$}SF(V}L`MKdC|&jz(2{m**xa za!R<Ro#U)Gi>&nA7RiLlIe0twUp#tmd0B|xk5M}L^^B!~m7hi$SLTBnj5OJ@ASXiR z-hHdmYItszs=tcW>T6=p(vKpUW0ppd0qf}}BuOq|Ye&+&zy6*y|7M0h+FFEfwm;`d zy3H>!LZ~is=X?h@>5r{|BwjE8V&&RfI?Fll4sNQejx%jG?PN(gGb=<iU*7}I9G@Y> z*r>tjS3oP^(+M%H9Pe$ac>fdxXKVp<NZ|QXxI;W>ZiaF98u7~cgFEHW&u%$4@2Db~ zmVqEM@ykgS<%S7y0eUdW3L`!eOjH}GRE68?|1y^si2&aAy{&(@qkGm*zBAGPmTC^a z-rGA+n+ckbiF6SSRXgX+uVJ_O6i55>xkwjtUK(10+LpCM-JjlhI7Cnr#YlIc9Y#c` zgNnXd{3#x7@Zbr;|8Av7R<##7*i8u*IHC)n3N6_lzokIQ)_{p_^96v{ab7oq#=m;g z$#X-45m}PNc5>%AA*bUF^5t2_U~h;HgWpzpnIp$aN0DlygFSJc30Dw&t%uN58?hK* z%er!j&lYk;Jz8@rdx{b*`GynA^TY9*<?|~wIyEsOO0}zvVusGXmNYdX8DIO1U)rS= zjh#fM8yJ2=QC2ARORR#NXdyYUCFw&PQCtGn)*B*KhkM7U_D5N)$OXBwgO=`C5r$TO zDIE|pa_nY;>G&BTR9rkioE9@gaZKn7!K71%ssZy0=|`dnu7DH{moK)$HAGt>3@>Yy z4nPV|veR)w&_olodBr5rQUc2IQ}!_wWf1~4_5wH9(D444<s!u=>0<Y(m?C3J@489$ z$cRsSmp!VkF#DA|Qt4-EkPr5=xGpIwnGdlev^VEbG(yz)C)q~Xg(?=TPc!c4R2aXN zlmH$zYwN;?)`w=9l5iU0hhwLlkcZ{rXh<;1@l}k1J~jY50QFwJ7`sqK#FN}dMjrp5 zVk-szvBQAkfT&9(bR=+=NKO{R7!cc5Mp<iqwX@(?W%&|R+XBX41wpK&rXUHxI46yc zn*m+aY(1rR$!ncJ@U{(S0!9Ylx6AQ9)XY$r@(y0NsG{jA>!k*zW2HBC!H=8uWGWv9 z32H=<?hG>*=KflR9ZWR?+U<fcM16#0yBdBFLiir^TEIg!koz{j`?eoHjRDi`RyNg4 z1DJ(?pFBwlT6Rg0O#8gu&;JE1>!+Y61gEZ~v)9-b6V}eyTvc=)h}U@rSH%O!qduD& zb+L!^Yw(i%?y}+6nfuw3v;0h^bUn%bhE5OWjN2$vNiR+`uwNTA@eps#Hcrr?a^AW_ z%&*+<hcEnK==m@YSGOC(S>#ccN7P&~%Efq0QUM=4<@Y}n({^l8m1u0kXVF6d-gh>@ z`10mUVP$dux`eEyuftVbe;>JwD0W0RJ4?~;PzMwQc!6x^(ucmsj-3ldU_KMPOeib? z*(-)1+4w9}@HkXibdn}v5x?Rdh#QaPRk;8%>YOXAbT!<Z9mX%51kq4L;b=Txv;qM! zg*>C?Lk-3wpIS?=JtlY=SnxweDE>67Cy`Sjz_>emhSsD%XM9%CN+%{4jja2Oe7St_ zs}+gJ4ac}ZXi@F1clQW~Fn@W=)72MQ)zOX%mNPe_*8vL2AHh_Gjf?U|3}!rBSaS1~ zz8S^Pi}KnIK9``HrLjd}^AOZjzDpKXcs<W#TuPllw~V(+rH(j+{g_%p-7iF{f%OV8 z9;kRAZfew-a({I~jsa=ONHFqLw$%^gpXHbLT=RVVZ&i2{RF-la4s3&Wlvb(r0libz z%wYwr;3cWUsj!_vDVVbo7d*8?1lqyOy{^PKC2Q`R?2`2At}o%m>ObEI@mF*>KKXKb zhoLTEHe=?uyQE<xaYRJl0c4qTR9lG11I>|rwkJ)RT2Lb{SX>+z>UuToI5`&5z1rz- z|LZ(}rCdAnH)SNe*RYYtd}D6&pp*(*F#Upy6@-<};<0Y6f+?P}WJxAil9NlPTGyuh zUV<F72oL=0X_O*!1f}17-MonD0hG!7Ge%L^he#b2J}G8BHhaN}DW#A9Cpypp)70b| z@^7<~f<Fcqc~Ys09q}~ClYu1Ksd~Ei_y^N{PEIL2hQ~W&;N~D(Dy%~XAqd}R=lz3C zj`-^|6)Q44wzG~PssLF0)=(?s+ElMus#G%*`s*<)IC%V4&!+x?Ms50;i*16JwO<`S zr7j6S`W^LYcf2VUuF4g2nOs*7XFv{vR*4m+0H36m(H*XIM-9!iUqFd2cFB(qa?czp zol-G((t0q+pkzY7Nbp%%o!4xIVVKlh+`L~xibHOE@E~#?m%Zf}v#gn<Ot8)P8hsiT zCIxp{=iA@tEQ)B3Cwi^q=gn_-!8WB=iIz~aE&XM^zCDl+KGxwf2T1Mum=HufnoPo- zHqvZQ|M-qZh~LDS8vM2m42S<hu+PJjE-5hLI;64b^6KChTaQ?@a-}$zJEA=dpUk7i zME^p>q^ULS6mNv5#_spJ%oufO60p51l1aJw+wr&x1Zh5R0rPRYJX)qXufo<8GUe4# zqOeO0<#;V+E)DnntM@GifIcl`XgJm9<e#~B6Z8CsW)?IPg4v75lU@K&t+$x==aOBL zZls~I&Az{?K3rvED|f+xDve1^XTnk@6#Ak}G8orp&TqbDuXj_v&kJ2WRNA5*1-uiA zw6Nw~k|ewsYa4C9Lb4MX7CTEora0RL#W`$*r~`a8T5ojnQDgv2D0~ih>Qn_m7m(b< zwNe8i4)F5+45m3;Fxs8=OH6;VO}Si;2x*{IS9U5MPIK}2fDlU4M>DF*YSu{cK%Q^m zx5|zTyE-z)@+PK10(KD>?MJ~uUxT{tsqBm&#m+8&8%?)d>2NiV>qx*6Io~T@lW_IJ zYjGRyA0C^+oPx-xG@p(~rH6M<VF-K&Q-K9BV=cWga8@1Iflvq$45bfh<iZ(Y!zB`R z=J^y*see#20_;+^zCO&?YdI8bh(uGPpe^=zx~50iAqkgIa|o<VvZp0`^3mhqPA z0}PvYvTL;P%JANdfyl}Io8_`{It%FlWq8+}$>mi2zc9;&?0hVlqt<nSn9J~#gXhok znOoB)`GW(?$l+Mu#h8HS!7dK>F~=)Mv7sVnKaq2apdvOFDJSEgjB0ELB;6@~qywiX z+gl!b$|K7n0pJH#CnC;zu!Ch<y%>y=BCXOe`9V>TBYJDxSgPMu<`%EX{}k(`vVye& z|4gZx;NBo%r>!$XN^%&HqM|TV8Z$jGVobYJ>>V*M02+rbMc0B)Pd#UxX@)8=&n_+) zCEidOD~1$K2bG&C5Mw=KCWlhtuquDp=ukwwV$l4fMuhz~0t;_d1bEuw??bZRuPW=D z-sHY;JobZ~Aua3nV#?g<Za`<`QQTWG_Dt&2AVV%!$*L6X_Poag1KLWP8&)Pv0mP5E z3JNXGxi;0PdNPwQMs3`x*XUfO$RW0HqE-vPa3jEY^;b-n80-izlrk3CwmA;gm5BC+ zSnF_@xmY{nA097BBOE`6T$xhM2xO!LR9-Z^;Qx|uF_?+-1@?3}vKgZ*eSC2mQH&Zm zVwCh!DdenhU`Qcf=^-K#qEkW!@)*vS)A7s0o5<66gI)8kT(~g+8l;2qSMtWc(ZZ+! zJ?SRouKM}JRP3}TR8|wNS}K5&dZZK@O!pL%xo;&4z}$Uy?WX!zYC}f2IYy+%jt*Qx zovw+-Xetx;?}~_2b<VA0BI20hns9C%E8>W`pa>1pN^;1jC)_YSC^7YD{|DR=wn+X= z-{in;G1b`6;D$G-nQON3%J|0|s@a?-1{MmbA4o7PX&@1M#F)WU;p2U|EYvE5skmQY zb<`t-)4mB87#=mU(szjKfHze9#&vs0jY6Rg<Lg+3Rs6|x%M9{A89W3XV}G%&+14Kl zB3<|g<8GyRk|$OCT2r-i_EYZo;tWKeOy**_!U6Rj#H$k*S2Mx}0&<i*<dYh%&L}or z>Tk@<R$Y5D@~O}(v-G8RoA3D-sdCA%-wxnlzgQ(mVahv=cCc%a?3I>^Yv<DP%3u9{ zn*Q5;0LpD(xEgK#C#Xaq5s#1VEgZjZz(;46EqV(Ae}wt)2Mpp*=a05#1R*dr?Exyx z-PM^HGQ=kgE&qp{oTb5!LRVumfG%06fg4=lkS0_)8j<LSelya`LKQ+sm00qJ2DXG1 zKa9?IUtwULXlM7R=i{-@&3pc`djuBhP|weMhQ;Ha_k<G&lf&6q-n61lGXy!3_}vev z@j~KArAOlN0YS^)Kq&rYoh2m~;>8&hf-BEwVX*jf1Q6b{lVYBe`u9ZZkOo#KJ+@+l zh6WDlaB)i+qCYeY1L4cdRcNr5=kFU2AJ*Wz-$Pe1u{d=AanCvL@OR+(dFj(+x?tb% zXF}gwp~O}uq3ZVd2>36^pQM}~enR#36oFh}=ojl;eCS&%dPQ0vpa9gkXon;w9{~cj zE5`vUA~s@%GJT3ZVazzPj9iY{Q5$~$0Gdpsnw_0uf5>f)ez1fl8`Z-rD=-T83qFk? znsE_z-?VEwCmqKyYo1dcKr{71uqbLwCMs(G#z$g(;h6faPis~R9;>ak+KNDz*yS23 z2|GuMq&wiEfD<dm(ko<60pNjTgcL1dZQ(Mu2>^FttR!4oO7>jAbdH1+b-!rW7y!Ru zr;gsp_ld9(rCGtVHGvE?#d4PIDxb*~O3Nq^sP1iJqCa1dwPP5Eh^rAtJebhnAp0oz zG+kH@h@zR8-^X-{6@}nWuYl6%D)EGXy<EV$zP(jJ6T&kCJhD3cynN>$M?@OLCYAOI zAI<>OsOk{gJftaFIZC<VS)R#(E?cV&-nox5?66oPf;NFHz(y%B)RgQLCf~8#9zesj z%#W$QN<FD$eDJYH49f6e`8?)R&}&1W5jNeKO)!=nm%7k%OFQcko`$XkRds()gM7kb zOdkFe_%;tUaBF)!12hRB*J3fGrl;ZwtnuGEwmiY2QVZer`Aq)_fA-RwM4G!kS%cyI zqbFGcH^wg&D$T~jE2$HveLL7x2g<!CzoY!HOR7)9)yP020g3S-Sg|}J8q3v++BAb3 zg)aEJy}J__(sBSE7aisY&vbpkfy(-k<rveH`aD|XVl2}qUgKfVblO@`G3K1MB=c`B z5}vDF`c!!TPc#>Eonit^U&)R4i^q<EB0Zpc3nKn@?=`75S0#4vrFqP<9Sa~pajR#r zuw=*tS9oziERs?lNkoC6#yL$FmF%Qj8fB;4uq-SX(pl+%#hYC6sJ++R(lSl-aa;YK zV$L(jA!Y#$xFqRZ7rTf$;h)EHv4sFjL*8gONM93IvpG_Z5WyyQIQOVY1o~&=ziIN# zed($^%(4ii+ckAW!NB8)@txhz8VEwD2f<^GUWq`dS+Ye{ag*gJI{5304#z=Zap!$M ze0lQUS23I4yo3itwbt|AEc<@o=58&6<YMrE4yOtLhx=EU1E-*i)4jjx;z+sjk6m9x zvoYg5s7gONrYGnwJR0{74gRMD1yg655wno(Ppb*xPYQjRdmq##M?aG7ipnJj62|{& z-xrXE^N;dm2))$!$R5J<ixYwAdxQK=RXO3uG-U{?4F>}RRQ#5Ju7n4;#<fe<?Iqna zfRlcszfOguO)0g^<gNWeoNP@tgr6=XH}H*)NAf8tJ<4?^cl7gTegS;-XbB<mEGL2= zn5qOZZBn`NOl)DwtMo$yQa|}E>%W3KC(x_d8?|JYPD}O7T758~9}-Fl3g!vQybTmc zdu!@r8J#~ty(s9E6vhdzDOUTj@0s$bNHBthgtCC!Q`3xZEe$2*MF}{+thtK@rFmxU zgYGFQGuzAam@xBG6pIGo_O8O15<$no>T!W76y)ZO`XlTt_@bEQJQb`NmKkP>N^;ta z+DL@%!&j*!L^Bo#H(xA&dM^)L8FYQNN4@eI8{LVyeEy9m+g}&K{{Q|vUnuxSputpE zT;#l%t^U&LdW^C?At3=>PnRia|Fn1oK(93xN=)<|ol5<Mfm`X>zcB;}nk*{V8mr)I zMuB@Z*^dCr`x{KG9oesKyU&&LtJaPShn7Iq)jv*i^eoQj1_e`dF{N<}Dl&Y;EkMyA z<-5A={vajop=}f$FuByrF;A9KbVW@3DX?{zFz~|m+8iyA&5Yc}8i`C8rU><DvFW{e zv+Mf$xtuwJsi(|A1bcVS_>1P5=71KDv%SHJ{{>ALvgh!};nQPdVuW7@cobX)=_lkD zT>QgxwT2Gid%@Y5U&Q7YRJw2UyWkrbjR6jPqVOA?&CPLv+BLVqTK44fZr#1;$KPJs z*qRd_y<C6i{g1$TcJEGe;O#3v_}VWph`ydRYu75h_}aBH_$&S5`3n}d^5W+`x0ycS zpdpb5Gcs(xF)uG~)R;KtPU7R|Q>NN`8SoPbPo;EM&y_dw_YEKL`@&t)@`=K?3m<UK zW>>5>@c>y_*`wp)7;AB0zcf2-{QYk`aKaIBrmzu#s}n~oU9#kb_3KhLeZBXKpR~XI z$>;C;%j5r*eQ+QC^M&>6mo8ZhPcn}bZh1eOpHw_4Zh)`%rDy)%Z_xg=^5SRQGqi8q zkjKaLC5Hb%dO8@+qT=eUJF+v56joJ>2N?~C=rw2N?JvLlr@cGb&t1K0<*Jn{x9<2J zu3yVF;Fr36n8%!1iM&w<(+dWe`F6?k#`{JDJ(D=H^x}CsR<mp84!9w3&F}Bc$v9ka zCQrO&WoVG^^t%T2>DM^tm-nc+5weaRIYQ44>ewV0zKO{i&w)b(w+>I@;~d#k^itlH z-u=P?`-LMa7-8oqfiq`H21MOPR1u{gROspFGx*;Rep>j`j!$YH{_mH2_ysrzXd0S{ z0DZ7?2S`7B?%d`3;DeN;-yly=TfIJW#{J9Ve<^N-Vfsr{7JjJ@_Fj2@+dug)1wR&3 zrzz=7Uw;r>M*2Z@;ReEm-S^wwyzQVDs5iVI=Z71MUrg14e_SH{Z5Rc*Hz|oZlC~#J zR)8=E&IWh0OLblU$lDO0+dE66v7&a!s0sKSe277=%LO;0{;nT#njihk>jujPw@z80 zd+=k!*ZJM*11h3VudQz#pFU^RfXLfg|LGvFd1snuKKW<HIUBfvwcs&4{d*MV{)avY zwjab46lw00`!rtsN1x<G-a3-peC^WGZmX?ofq<>Pv~eSSWOv#gI0&*!i*IFh18+s( z?(@AueqEa2J_3vZ9f02qUPJ!|;BZyCO9Q>TdiDxO8<vzLZ87xz$3F-^G&k=WIW0Wt zdSlRCzkckCcV4|%Ej1)eylV*Q>29cNyn3meKM5F4=Afrv4`M-=ESA&{bdM1rsX4HJ zK+%PAp<o?KKYjo5KmYB~d&v=c)_%)Lj6U!%UtVSH)zWJIHJM+Yd-C~T?|bd9#I$3t zBl9c3#WXZEpE>p=4Z6_w^M+$cq=fFy<d%r7Pi5`6#0Tk938kg8DFC7%Iu4MQmNx${ zTgE0n5HqV~(3)3WonP7sMh*OYJ?Yors(>3kS~4V=vI2~Z4gv&E{_5M;KW0{(%JuZd ztFknw((i>ec6>za^x^Q6$249){n^RGU+0;@@rm<yJ@^|?fY}c(oV)68Q4=DgEVis? zmm8TM9%rr`RA_Y4$QvH4Uv26lb!jFgCL;J@@J4h@zcEQ844&P*nwoZR{r9B{Wh?@` zP<HQv8Q=sMlgylFV#3hiXfwj>?$IS{?+Nln=ym?bD>0MrfiFdVDFeT0SA;Ydx-jQI z1fl@t0ObVGXa!xujd%WXq-UTsFJthDyiYz7gsqOBEbbq5n|tCPLz`BEf?s2tK<b|s zf3t_(=lRrEpMn4V)o=gF0G_>XzjWrPmDxZpbwZxC1a5>D;_4Eq>+h{UEuk^1@LuzB z1J*Y#X+&ki4R9~t?0FAlbjh408&gl?mH2rXV<u07%P!3Mo<`4cBV*s#v;j`_`04|+ zL=L~d+h^}@CWPAxY{;QThQ5RELg|OMfKZMcJ#I+E1OYQCsTiC1VBrgYR8#Umsk@3e zil9Ja{GCe~RhR5b_b%{_hyn=jN$(Kpn_jT!8<>B|ZSKvXky3YW&tE)pXT68V)r$q- zQYtSO+&yCz|8YR&flRw6{%KnU;8BodX*gGymbM3A3CIC`bAj~+hKBDu_E&)umuUdg zP73b@^I20_uI_4uL3eQXDE+TJIoJG?+&OCcU87J^^M5RfojeWx%2?l$A5R)KZ4i*E z8#ijJ#Ft?fHEZTNe8OOqe*AQJ<DR|KpZz<l0Qu*y4WR7kBoPDxS-hP4AM(*>42D1d z;eRrZ2<`)|$#5!$0Kf_#)Th|OfF<0Rm;~nkJ!{;UJa0UFBHR{GIkZhXQ)74qfNy70 zPF$z}ZCDDy$AW|lc`ZYZuNIUlF{iS!vaGCZo(F@Cv`Mzmd+-?__%GOga%6jI>g*Y} zngcjBb;8raW!QT|Fh|ZtU1iSj!3!(Nk=)bA`B+(1O(VmD`M3=LFec!5y|G3ZFd(NA z6M!J!N`nVcB;Xt16`6n)fFI8g>Ekv(ITt?^^dwX?<}GAk9~G<QTKr>Z>slZ!-feeU z8Xwp>nSC)NEIhDZxbQ7lZ^yjl{EsCAqHKgp%0*J^XJ{h$%6$H;EFcxrW<<jS{6p`4 zVM_5(KW=|3AlxbzL7;w(H^7L}$gRA*EOKCPmf-q$+KkBpQwKC+^M+rkyFp%t7K%{- z#6QI2-7AL;7}Fkpt2D&mi+5ioR}Ol@&%GKkqCa?7m8)_s{%Las(Bj?l<;B=MFgDf2 ziWWU1Lk@;oPu076sobUqz)_Wq)WXjX@QHaPu->3CgW=&bq(5ykd4S6tv3Dv_Xy2ZU z*%rD@dM8~W{=q9LEjrJHIEzZy&HsiB=}TUQl_0t2uJQ^%2v}@PEbnjzM@tHDm~xw- zCp`Y?9Tq6Wy>5bk+FSuNqM+SrdkkET3}}F&0w4{r7QXx+uc$~WjazuBz4p^33^9=f ztoND3k$`UTA^Zumva;>E8^YJ~qtTS^7^5f5kg0l)Zv1NuT!0@wu9Wfs7*1t8fH?#t zdjJ47@FVhJ1J6Kz#&LnN@rgNf6j`E>fIHwHLpzj1Yw>Zy^cE;U%;bBNoJLt$`N-%X z#%Xk^t{V__yOz&l#BSe5+40konODNE3v!PSu{xCt09DbI8b$Rh*Gd~0lZ^0&Vc{(F z3iP1^mrCpw69vQrM3_u)-<X$y2LKI0T|y0El+84#kCY{#VsyYIy7%bAC=&35W?yf( zdrGAcF2_IZp#WNZTw0nSNena~D6p53MbFI4<R?o43hHkwV~S>&aRML&rw?Db>(`Gt z@CBJ|Zi_Bg*+gPCS5>vzU@u{5D#k$R6<{>-_$Q>lk-!_U?qGv+IR-4pcD|?K7Gv56 zNB3iZjf{T^gyuh6!Th@e{%H>d(1?Q4()LK%Tx)^8bnXg+Ow^r*6bKqU!2xfB`gZ%M zWF^|IvY4bbDf`jB)I+zp_zPx)vc9Vab1K01{C-5uKHdZ=VOmg_0wd=^1z?nfNA^jH zNqkhwq5z+`E&egIPe+(`6vQ|I6&fI{ijx9CwmblM8$eLg@4AKmQ}&UfUq8L6m6+b) z(Y!X7dQD{{H)j)sl253a2K6QQ9zBUT1Z06yAfsof@(^?p46s3-z%XEVnQsuw6Wk5| zw37m8@pQsqs7)Ts{OUy)%0d2YB9Jv}QvkQ{IsiZO#hk`p{`P5&->Y1N=~cp@tywe& z5EcS4F;KAFg9hK4VJ(#Ktx+gxw#^d&V%>%Kr<cI|3*tZUGKMF(A^vG61<-<mgu&1= zxg|!Qo+>&3P@ab1Ai+QbY-R(tr>27OUN9@BCl|%fKVQ~=;I!6*_|`08l#^c!<N(`2 zs4bY}ty?y)<x1|tZw;Y^QW)P1AJm6v2)YP%q_a!_vcK3z+j5=&;L8qkl`n3Ee+=!` z6t68KrVtEOfc2SXG;b9PsxGb=5NQ<%66TK<ELsFUdf_ZV$mnq9*#~~JMtdg!la8pY zv2QT-mAV`J!Afhv)l&X_wV?ElA>pf6t(<Y+q8%S*zVcokZ<WXXd?+oH2yd9UO=;bY z3prM<=D2kTDF4Tj>b&CN(c|HR@ZlF2#m7m*hlT=1Qi@!;3H~v(X)O@r@A$eP-l8vE zvY4rIQ$ayk*AO|dH~sogb{y;J8}R7UR=XH^1myqy505hxVr@#ws+B9@y*zvS?9&Si zSG~CLsd?%bEG(?Z%`cA}6RrKu2sgA;X*5xC5&!rb)@cre#~(I)%fDdaT|)r71584p z#3G2?bHW_(_jDkYaU&<b{1F}oLrb|X|8b^4edO}0Puv{;w4Vpif`Wv>P!$D04=^G+ zh==kZ)AYkM@*Y0K2}}S~?)j(Vc_7qK*H}>&GA_}^mPF+W<v{fQbIu|F1}Zgc5ETNc zFEH(cCP-T!?6TC8n)m!Fu_6Gza$yoOU^4-*^MmO4k2~kT+FJo&X_;cc2SWjrdo?x1 zOrFNSSg9(GUrJRK3l=WA-dMY8@p%4EC$lfcO<v$YRMZVucW=+w>BF(+ltksx126;^ zV?<^KJPA`^jw^st2EcvrPrE9B7Oy7^hMxbSNHG{Hs)`f9jLO>HB2fm~{p9lHz&ctJ z6=hsdKVJ{0-?|~T3W3yZ|1aiE0Bi%uC-qNDXrFB01N@-@B)lV}$eOM;vTwbIhnwfW z+M5Gd9AB);tQ(mJr@gR#9SAhtvZ%s?Gcq#aZi0NM|4!$BESWIw4yA|?7^ElW-3@18 z0)iwe`p>^Vub_U}PQOdB)Q(zY@inJRZ35j9N=P{Xr)D4Tu$VBQ8FbY?k#G2dG`^1> z8U(<-kYd1aL+E<~x)dGL-|E6VyPU}_VdF?0A^+t91whq*QdI#g!B7)J17fF7>ERc^ zXM#`!8HEWS)Hm*)+n59`NCUVLVa|2IqD5zNa#k)LPxp2a0QU2HemP{+zlCpfpe4ZO zG6o2uPgiQ2f>aa6_skk~qp$h<l1&JMEF}Bzp7#Ly(|1qa^e%u6-N*#sf`uZ(3%;~& zUK>0-JZRKF`pDhk-fwOH)^O75Vg^Tt)+-YLx57W|tpN8XB?9EI84O*zWHG=J65GKJ zN$iMc6(B2%uZru^*a*Mnk?*n?g}GWJu1W_vo|&9{V1N3;*)jZ>ozFfwHRq{ye_5z$ zxDBkF{IZ}i1|SdW&6y-z$RFgrSpyX*6&3<rsk_mmvYd3Z(F<%pf8{uYkZ~iH9Psx9 zXbG!CS4<v6PS{vq$6PIViF$8u;fJ~*{%LOo(1L=5!O*J(rP!A!j0G_rm0-35y}SNx z{U5c|*pLr>Y2zmNT;Zgrv!|->`t@V`Uj3`^y$l1XtZD3e<3{h$Ff9t8aid(mew!h$ zfxUfme>kT7`=S;xHK)Eo{svMd!R3H4i~Q5+?}=pNkO&4hVxHLj^It9?!5R&KFc^CF z<VCx9@cAFF*sO|U*4mVmtgP%+OUCn7`TP%;k{<r8Fg2F%ypcgF%g@)7JP#1f9_}6J zV;|Fy2`(+W@U6iE&~1=a)&np266mC)B)$P)gbZJm2!Olc9~US9_Se}R4E^znQimjV zhcQ)gTDrq{AOvIpY%QN222m&}tQnX10RJw2W>#Pi=igF5I4!{$*@DukVvyZZ>IK@U zb_|1Xa1anOU<*Si=J5~xDc}JzxmqL7K>w>33zWQ{yWt-fC;*}$dxN1W9g@PTIH@AY z{!wa}9-ckpR$<4zFc-luuda4igVJU-z$h^Ae72YwM&!V+z?A?|830iVj8OmtGhCTa zC|qiX$bY#^0koI_rOHsH1~I-W4qgn1#ep;yriWK9W`WR|+!7U+V(+L%l{H)>A~Xl! zw_m_Kv6gmtVz~_pMW7exGHI$xf|QZc1c0wKQqO<kP)c0^Y@;AyWvI%alq~b8td>|1 zjtT1T&^*lr3#B@_N!Fj<M=o;aFM#I&MI}|uU0T%=!1poIc>pk?OmPmT$+U28%NYct zQ0P&(ya$Mm=?A8rmTXWGK?jUn0H*}Tw4mRcLIJd(Aigs6yYDV2bx2xJP;Umb*sP0I zQa{irhK1vg>S^0?6WPF9o;qbtS9<R5mu#&A#mP5l?YDyvqIO4Sch&H^zTV@)F~p zqt-28|6vC_suaM%FK%+h1~BfZ09sIxxJ_Q6LsD23cmBr`bsh|MZuP2_5B%5TGwxf& z=vCUDG=5k^pm$e|8r4PfmJ7mKXnuiU)mE8@Pw{`nK6mw&d7c5&B2G8KplxDP1lCP3 z@S56&Zj2AXMqwoa;D+?ql?q_f8>XeDm6eritPCwHD+5bB(#}8-IPq00S5ChBkxPx^ zR=%-^CJgY=eCXXvxz~}I)2QARNuSxTJNwFj0Ao>cmD206gp+BR=iA|JasUQpnFh6t z!sRmnqz95d1CM_~hJ+ZD)79>Ye_W;jT2K(!btV`p^WbS3JqFG$SBV8-{1nBjw#qP; zigM=V=L?IA0z+9=otKwy;A(Z$yCUfq=btZQv}M%jaZDehp?f!#5Rioa>zeE_{{jM_ z9s=S6ph?^eh>-q9EPxXtF}KA(1{ZFVsxcNsJApH~B|vS(!O#qLVlEa?sEi4+)DcO* z>C`tr(yB5%Hip3fW?S1Y%q9m=S80QF2N}@WYv)Ue^8w-e;#ecw$B5D?<8NV*6x7~s z0>C!H`{N)W;TSB20KjWx4`6kF)bn3%i+^0H05*N1(zGlg4Iou<3<^>S1YtV?@IRp1 z-yO;C;~POZ?$ztVn4%zfna0VRDhoTvnCRA_z2DzDZVC!kuZa8kz0W**OVjtUkZCxV z1w$gCT><!6h&T!tyTHtY;#3Ev#LE>BjFzg8Ky+LDV`%4EARYy&)CF0hF)><bfUqhK z?D{RCqaR%Of)!|yW2_@4j{JPbhV7}TFT}2!J>%BQBZcW7pSk<KHAlYr{I-z^-+W)o zUagFhnaP_%m@eUmQ^i8)m1&viNLMb&+hG{TPhIL47*%-Hn|TYoGJI(0rGoQxl#>=v zcmY;BYrO6JEJSk`SgyDWOh^Fu2`HX{eo7Ni+!_BET)R`e##j(-GEo79WjXw;IDkxF zWE7scWTYRBUa|cmllqw^{QkAwpa8Pk1mi~(UhN5gx?1JUpFCJ*cyuh1sFUm;Jeeqv z@Cw1_z$e0!mDW9IpaXDK!p|K%Je<z0@`XV5GGKldB0UP%5+Ev8Apl^`GY(sMLiPNY zJL4Z0D}a_*5Cd$mLsIMnv~`E!YN)IQBkkeizj2e)s=sRS_#wt4UDM}!MgJoXmD zty!Cb7b)yPV^;LgprP?m@Z{jTR@)iT5Xd|b?x?0hAmJ=Tt5I1TykQ6cygjf_D9fQy z0lwJR;qZ@(6~JaJ2sc;N*da+rb!@Jar;Gi%ckLY-1`>%(;FUE~ghB}}W!AiLavt;( zjZiyOxhoPBW^GCeI)R0=)e2((m?b|t5!+c9Xkk?d#O)-Y76KB@LJS|&2N|$%3>M=7 z?oCQ!=r7#5Ug3dc*hI&|Kd$5e#6PO{h+(<^%WI~PBh5ZN8a)-O;y{Rp4Ai6p7d*QF zpN5}y*24?_x%bnd{d<E@!h?x{`1TJxSXc-0u}gV>uE>a9^cB{4dYvj#a{?2lPXF21 z5esJBK6`ppu4n=ZobYH_bI!F!=5w(Si2kgL&D}33_xdmki+sSK(6{JYOC_oJug%_8 z6%g_9L#)4Seb;W;$^~$4j(=RQ05*HXK0a`8^v|cE9U=?Ri?BoT!}NpWCQM{rth6f1 zu47#Pr_<k0`$fW2>;E1%A{LA{c{^C&yvn9;3+oK>7Dh_u|Hn&LeR}%$3vaQ+XG`kU zKl+!`fARd=AA=6~d3x|yTUvJ`?LwoJ{jDr#8hLvL54c#}M85^Th2dJG#zLU$UVc*L zoUeC?uQ&NDLs313fNmLjyYR0x@arFSTQl_nDWD`@Ku3)KxP=0Me@seBLaZ-b+g^S7 zdg#!xTrEE60Dse;d~!KZTkS*LNL(M>_tOu}xa-%Cjhpcx6YK})4mMb2#=(@S3Gku5 zzJA)jHOTbRq>0lWd+M$SA5*$o_(ae;MzZm<n73$;f&Sm~&)pa_mXA;&x&Q5BkHX3M zztRL_=FDW_1&DXWjE{G7{DTpTX4hT;Ko|I34f^VI>%jhWdxyB(TqKy-3HPiN*H<gq zo%>6_TX+CmqvOV^H_Pj*1FhKD*aPY5Mq_~cUusu3xemBr?jJGGmqwS~QKa9E6aenm z)-9V~SifFa@~*EAvEa8`y=o;u|BfR4ZUlkIDl04BxM|~?+f&<T;)uSSvP>q^!*k~> zS-hkJiN2dE0IdmF-JmZwUlDQ_We2@@_f-IW>FXxq0Q%CGt^oSdS9`DjFTen#+_6kd Sai=o?0000<MNUMnLSTZxw*HC$ literal 0 HcmV?d00001 diff --git a/testopia/img/testopia_city_512.png b/testopia/img/testopia_city_512.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9c11e7a42745e6f3598f3cb30b786f47d7fb64 GIT binary patch literal 48233 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 W59Lub;uHe>qadRyT`6h$_5T0?UM1=P literal 0 HcmV?d00001 diff --git a/testopia/img/testopia_logo_128.png b/testopia/img/testopia_logo_128.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ccab4281325345f7963883f579c8f40b741854 GIT binary patch literal 4436 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 afB^suVi?Bi_xkw&0000<MNUMnLSTYRU7O1Q literal 0 HcmV?d00001 diff --git a/testopia/img/testopia_logo_256.png b/testopia/img/testopia_logo_256.png new file mode 100644 index 0000000000000000000000000000000000000000..9c45e5b0346e1d6f071d279ef2d15979bb70ad14 GIT binary patch literal 9598 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 literal 0 HcmV?d00001 diff --git a/testopia/img/tr.gif b/testopia/img/tr.gif new file mode 100755 index 0000000000000000000000000000000000000000..9f94643ae807870036960c312f1402845db13bb2 GIT binary patch literal 61 zcmZ?wbhEHb<YwSz=wN^X#h)yU3=E76Iv_qshJi`MrH^ykuHI|SMZ0ck?f!izIZ!@` Hfx#L8I;;)Y literal 0 HcmV?d00001 diff --git a/testopia/img/triangle.gif b/testopia/img/triangle.gif new file mode 100644 index 0000000000000000000000000000000000000000..c72960a26d8d350e654b0038816c2672966fa362 GIT binary patch literal 315 zcmZ?wbhEHb6k-r!SSrI1&A{+_&YYu`mP_>Y|9t#-ys@#Df#K1~lV{S>&K)?gOi^)d zLP8A#!&DiWvmqhR`}&^WzkhZA{%0*MSG~P^930**S(3)U@OJOsnG6hfGcvv$J9fXS z>i_@$AGU0%;pE&|P_SJ~>-&ux%Oxb<o;&w)^5o^5oHwGQ=LrbhDJdyoU}$1s_<sLB z&;+3NHcrkBCMH0=Bmu>rEQ}%y_6$1A49pBXK*+!rabSMHib&pm=T6Q_9#1v#Wg9-t z;NbA_byd<3ow4KqTZ?64`*ee@o}V(ROWK`NRyeoJ<>fLgSox3Jo<)*RpI1(^Q<Fzf ZgNaM8Q*5#rgNQP_pdja*xpN#DtO2*enF;^^ literal 0 HcmV?d00001 diff --git a/testopia/img/triangle.png b/testopia/img/triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..bc452a5709795d5612c1ba5dc565b8063521b058 GIT binary patch literal 29306 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 literal 0 HcmV?d00001 diff --git a/testopia/img/xml.png b/testopia/img/xml.png new file mode 100644 index 0000000000000000000000000000000000000000..c3e150882d4cbe080a24b6e6e0828e2d0b9018f9 GIT binary patch literal 1274 zcmV<W1O@wvP)<h;3K|Lk000e1NJLTq001xm000vR1^@s6);f+K00004b3#c}2nYxW zd<bNS0000HbVXQnQ*UN;cVTj608?*dX>f03X_Vs^&;S4glu1NERCt`#mt9Cyc^Jlj z^VN(qlezBXklGj}n$nnGAsHAMUd777ViHymb<t&0MnvRAK~Rz!-Ly(tuvv-V;!q}R z89~^mlUYp-tLu`PW7{}0I^Q2>FGgqCM$L`b>Vb1{p7%NL|9#H;=RN-;Vj9)e)!X!X zeN{q2LYiDI*YNd0@Or)P91h2@$z*D2XlVF#CLp?a@!~Homn$rMBXByMp_Z1GCIIT| z>kkEk!7p9Ye?}k>5Kf;yT`kVY$oNqrk$k2m3!fI7M%e9+;ezAivudSMDH$0VKZrFN zP1b@7oCnt0TApY$*jig-Vk7(a^E5RT!RG_uuk+^_(CKh=bwxFAPn^IMACK+w<tS%w zZ>L|Y#dhh^tZT|-vUIUTA`yQM1992eh=Ac8J8*V(M){%2O04zuC^9n<$>jiypE-m7 z_3M9`ow#xZLLnyF+oN2-Y6ZYII5^j`;*S;|7#-zRNeP~(Pv_Ms*R3P1u@SLK#o)GW zxcmATt*K$6t&KRnp0wuXNWQT#JOcv&xO#g*5C~eWcwf8#z|-F!%^CK3BUQ>|bFTYQ z1G3~~mK{CHP(=lAjvR?5{SeZmB$P!(=+2!(@cXfB-i)=j7FkjfX-!SYSF8YFvb#I_ zjBjudcYi<c8XFNpp$IoLgwJdSh;BKNLh<Pa0OHHa$TFD_{C>>&`ApuvJ*#d}YAWjD zVl;dA60+L~d%dLA)uAdXifWv<ZUG=qO9Q}l|33DP4gl2a*MlJ7dh{q_V5S2~<-!fT zDk;I7mlt!r+OUDi-+n^~1hABqVQXufHKFI(Gi(<wMDHEfum2Mi1f1R7h@?^ytEvF7 zUA>CiWI|O`#Nthx0B}Ef0zi1W17ekGP6N^piFBiJ&XMQr>EX@6gJ=x~zAG<}i94=c z<BzH;1izo<b#>S~JF&I4qRh)fTV0L&;X?veE2`pR5-TeitF2|Krw4!~<>jdI^CK^z zuP<W2<B1qpym;XTBukdWh(dNdBL@!P85m$yM+b3weT>F#H1g-porK+PQcj&BY2Q8+ z+1YrWKj+P%LnyMc@L4PXs0s^F<m8|#EM%&;7qLP?!j>&8TD1y^TFvBx2ZWqXLJkK2 zg5QtbXvB5*E?%=4!Ruw^^tM~j6fzeSpjf?{%--Hviw};EGkW+ip{Xg7j~zp6Fn~ye zvY>$Fb#)+>GQ4XS{*jT0fr0`65-KVXNhD}???#@Ujzq0Sy>TOg+s)+7n@Hp10T|l4 zmBI3I#!jBZ(bW~{%=7?_>A;7OB`1@4=MJ)zl(|JB5h=%y6Lh)we*5+)E!AjHmz1!w zwH5!{x5Ss061Qdz>e5mGG<)`-T)UP<I$d<1FRQ6RU0jSZCkN@$rHB&~2|Jz0v|403 z9m?EXq*^WFnaOnT-o1%0eXf}gVZVRQ*o_-EM#S&mzc+uZ3ttkVc|Kx+K;U=r%a<=Z zg2CYbSkmW#&*u{?7K;&p=H})`hr{vBoT+U#o4={4sR2MV<H%qz{FIxUyX$NJBeUD> k!;c?7{`u_Lv)2Ls1{W%kxztcx0RR9107*qoM6N<$g6V)@d;kCd literal 0 HcmV?d00001 diff --git a/testopia/js/DocumentManager.js b/testopia/js/DocumentManager.js new file mode 100644 index 0000000..8624dcd --- /dev/null +++ b/testopia/js/DocumentManager.js @@ -0,0 +1,88 @@ +dojo.require("dojo.widget.Editor2"); +dojo.require("dojo.widget.Editor2Plugin.DialogCommands"); +dojo.require("dojo.widget.*"); +dojo.require("dojo.dom.*"); +dojo.require("dojo.event.*"); +function DocumentManager(/*string*/ prefix, /*string*/action, /*array of strings*/otherListeners, /*bool*/ directEdit) { + if (prefix.length > 0) { + this.prefix = prefix + if ( arguments.length > 1 ) { + this.action = action; + } else { + this.action = "Commit"; + } + if ( arguments.length > 2 ) { + this.others = otherListeners; + } else { + this.others = []; + } + if ( arguments.length > 3 ) { + this.directEdit = directEdit; + } else { + this.directEdit = false; + } + this.div; + this.widget; + this.helpPar; + dojo.addOnLoad( dojo.lang.hitch(this, "handleLoad" ) ); + } +} +new DocumentManager(""); +DocumentManager.prototype.setDirectEdit = function( bool ) { + this.directEdit = bool; +} +DocumentManager.prototype.handleLoad = function() { + this.div = document.getElementById(this.prefix + "Div"); + var f = dojo.dom.getFirstAncestorByTag(this.div, "form"); + dojo.event.connect(f, "onsubmit", this, "handleSubmit"); + this.helpPar = document.createElement("p"); + this.helpPar.setAttribute("style", "text-align: right;cursor: default"); + dojo.dom.insertAfter(this.helpPar, this.div); + if ( this.directEdit ) { + return this.gotoEditMode(); + } else { + var l = document.createElement("a"); + l.setAttribute("title", "Click here to edit, or double-click document text."); + var t = document.createTextNode("Edit Document"); + l.appendChild(t); + this.helpPar.appendChild(l); + dojo.event.connect(l, "onclick", this, "gotoEditMode"); + dojo.event.connect(this.div, "ondblclick", this, "gotoEditMode"); + for (i = 0; i < this.others.length; ++i) { + var n = document.getElementById(this.others[i]); + dojo.event.connect(n, "ondblclick", this, "gotoEditMode"); + } + } +} +DocumentManager.prototype.handleSubmit = function (evt) { + var el = document.createElement("input"); + el.setAttribute("id", this.prefix); + el.setAttribute("name", this.prefix); + el.setAttribute("type", "hidden"); + var value; + if (this.widget) { + value = this.widget.getEditorContent(); + } else { + value = ""; + for (i = 0; i < this.div.childNodes.length; ++i) { + value = value + dojo.dom.innerXML(this.div.childNodes[i]); + } + } + el.setAttribute("value", value); + dojo.dom.insertAfter(el, this.div); +} +DocumentManager.prototype.gotoEditMode = function(evt) { + if (this.widget) { + return; + } else { + dojo.dom.removeChildren(this.helpPar); + var b = document.createElement("input"); + b.setAttribute("type", "SUBMIT"); + b.setAttribute("name", "action"); + b.setAttribute("id", "action"); + b.setAttribute("class", "tr_button"); + b.setAttribute("value", this.action); + this.helpPar.appendChild(b); + this.widget = dojo.widget.createWidget("Editor2", {}, this.div); + } +} diff --git a/testopia/js/caserun.js b/testopia/js/caserun.js new file mode 100755 index 0000000..28effd0 --- /dev/null +++ b/testopia/js/caserun.js @@ -0,0 +1,251 @@ +var MSG_ERROR_REFRESHING='An error occurred refreshing the list'; +var MSG_TESTLOG_UPDATED='Test log updated'; +var MSG_BUG_ATTACHED='Bug attached'; +var MSG_TESTLOG_ALREADYRUNNING=' is already running this test log'; + +buttonsDisabled = false; + +function disableAllButtons(newstate) { + + buttonsDisabled = newstate; + + for(var i=0;1;i++) { + var o = document.getElementById('en'+i); + if (o != null) { + if (o.value == '1') { + + var sk = document.getElementById('sk'+i); + if (!newstate) { // only on enable + var bugid=document.getElementById('mbg'+i).value; + if (validBugid(bugid)) { + sk.disabled = false; + } + } else { + sk.disabled = true; + } + + if (newstate) { //only on disable + document.getElementById('bs'+i).disabled = newstate; + } + } + document.getElementById('sh'+i).disabled = newstate; + } else { + break; + } + } +} + +var _index; +var _id; + +function validBugid(bugid) { + + var v = parseInt(bugid); + return (v != NaN) && (v > 0); +} + +function fillrow(data, idx){ + //document.write(data); + if (data.substring(0,5) == 'Error'){ + displayMsg('pp'+idx, 2, data); + return; + } + if (data.substring(0,9) == '<!DOCTYPE'){ + var doc = document.open("text/html","replace"); + doc.write(data); + doc.close(); + return; + } +} +function getNote(idx,cid){ + disableAllButtons(true); + dojo.io.bind({ + url: "tr_show_caserun.cgi", + content: { caserun_id: cid, index: idx, action: 'get_notes'}, + load: function(type, data, evt){ + dojo.byId('old_notes' + idx).innerHTML = data; + }, + error: function(type, error){ alert(error.message);}, + mimetype: "text/plain" + }); +} +//chBld Updates the caserun build +function chBld(idx, bid, sid, cid){ + disableAllButtons(true); + dojo.io.bind({ + url: "tr_show_caserun.cgi", + content: { caserun_id: cid, index: idx, build_id: bid, action: 'update_build'}, + load: function(type, data, evt){ + fillrow(data, idx); + var fields = data.split("|~+"); + dojo.widget.manager.getWidgetById('head_caserun_'+idx).setContent(fields[0]); + document.getElementById('body_caserun_'+idx).innerHTML = fields[1]; + document.getElementById('ra'+idx).style.display='block'; + document.getElementById('id'+idx).src='testopia/img/td.gif'; + displayMsg('pp'+ idx, 1, MSG_TESTLOG_UPDATED); + setTimeout("clearMsg('pp"+ idx +"')",OK_TIMEOUT); + disableAllButtons(false); + getNote(idx,cid); + }, + error: function(type, error){ alert(error.message);}, + mimetype: "text/plain" + }); +} +//chEnv Updates the caserun environment +function chEnv(idx, eid, sid, cid, oldid){ + if (oldid == eid || !eid) + return; + disableAllButtons(true); + dojo.io.bind({ + url: "tr_show_caserun.cgi", + content: { caserun_id: cid, index: idx, caserun_env: eid, action: 'update_environment'}, + load: function(type, data, evt){ + fillrow(data, idx); + var fields = data.split("|~+"); + dojo.widget.manager.getWidgetById('head_caserun_'+idx).setContent(fields[0]); + document.getElementById('body_caserun_'+idx).innerHTML = fields[1]; + document.getElementById('ra'+idx).style.display='block'; + document.getElementById('id'+idx).src='testopia/img/td.gif'; + displayMsg('pp'+ idx, 1, MSG_TESTLOG_UPDATED); + setTimeout("clearMsg('pp"+ idx +"')",OK_TIMEOUT); + disableAllButtons(false); + getNote(idx,cid); + }, + error: function(type, error){ alert(error.message);}, + mimetype: "text/plain" + }); +} +//chStat updates the status +function chStat(idx, sid, cid, osid){ + if (osid == sid) + return; + displayMsg('pp'+idx, 3, MSG_WAIT.blink()); + disableAllButtons(true); + var upbug = dojo.byId('up_bugs' + idx).checked == true ? 1 : 0; + var stNotes = document.getElementById('notes'+idx).value; + dojo.io.bind({ + url: "tr_show_caserun.cgi", + content: { caserun_id: cid, index: idx, status_id: sid, update_bug: upbug, note: stNotes, action: 'update_status'}, + load: function(type, data, evt){ + fillrow(data, idx); + var fields = data.split("|~+"); + dojo.widget.manager.getWidgetById('percent_bar').setContent(fields[0]); + dojo.widget.manager.getWidgetById('head_caserun_'+idx).setContent(fields[1]); + document.getElementById('body_caserun_'+idx).innerHTML = fields[2]; + + try{ + var deps = fields[4]; + ids = deps.split(","); + for (var i=0; i<ids.length; i++){ + if (status == 'FAILED') + document.getElementById('xs'+ids[i]).src="testopia/img/BLOCKED_small.gif"; + else + document.getElementById('xs'+ids[i]).src="testopia/img/IDLE_small.gif"; + } + } + catch (e){} + displayMsg('pp'+ idx, 1, MSG_TESTLOG_UPDATED); + setTimeout("clearMsg('pp"+ idx +"')",OK_TIMEOUT); + disableAllButtons(false); + getNote(idx,cid); + }, + error: function(type, error){ alert(error.message);}, + mimetype: "text/plain" + }); + +} +//chNote updates the notes +function chNote(idx, cid, note){ + displayMsg('pp'+idx, 3, MSG_WAIT.blink()); + disableAllButtons(true); + dojo.io.bind({ + url: "tr_show_caserun.cgi", + content: { caserun_id: cid, index: idx, note: note, action: 'update_note'}, + load: function(type, data, evt){ fillrow(data, idx); + fillrow(data, idx); + var fields = data.split("|~+"); + dojo.widget.manager.getWidgetById('head_caserun_'+idx).setContent(fields[0]); + document.getElementById('body_caserun_'+idx).innerHTML = fields[1]; + document.getElementById('ra'+idx).style.display='block'; + document.getElementById('id'+idx).src='testopia/img/td.gif'; + displayMsg('pp'+ idx, 1, MSG_TESTLOG_UPDATED); + setTimeout("clearMsg('pp"+ idx +"')",OK_TIMEOUT); + disableAllButtons(false); + getNote(idx,cid); + }, + sync: true, + error: function(type, error){ alert(error.message);}, + mimetype: "text/plain" + }); + +} +//chOwn updates the Assignee +function chOwn(idx, cid, owner){ + displayMsg('pp'+idx, 3, MSG_WAIT.blink()); + disableAllButtons(true); + dojo.io.bind({ + url: "tr_show_caserun.cgi", + content: { caserun_id: cid, index: idx, assignee: owner, action: 'update_assignee'}, + load: function(type, data, evt){ fillrow(data, idx); + if (data.substring(0,5) == 'Error'){ + displayMsg('pp'+ idx, 2, data); + return; + } + document.getElementById('own'+idx).innerHTML = owner; + displayMsg('pp'+ idx, 1, MSG_TESTLOG_UPDATED); + setTimeout("clearMsg('pp"+ idx +"')",OK_TIMEOUT); + disableAllButtons(false); + getNote(idx,cid); + }, + error: function(type, error){ alert(error.message);}, + mimetype: "text/plain" + }); + +} +//chSortKey +function chSortKey(idx, cid, svalue){ + displayMsg('pp'+idx, 3, MSG_WAIT.blink()); + disableAllButtons(true); + document.getElementById('ra'+idx).style.display='block'; + document.getElementById('id'+idx).src='testopia/img/td.gif'; + + dojo.io.bind({ + url: "tr_show_caserun.cgi", + content: { caserun_id: cid, index: idx, sortkey: svalue, action: 'update_sortkey'}, + load: function(type, data, evt){ fillrow(data, idx); + if (data.substring(0,5) == 'Error'){ + displayMsg('pp'+ idx, 2, data); + return; + } + displayMsg('pp'+ idx, 1, MSG_TESTLOG_UPDATED); + setTimeout("clearMsg('pp"+ idx +"')",OK_TIMEOUT); + disableAllButtons(false); + }, + error: function(type, error){ alert(error.message);}, + mimetype: "text/plain" + }); + +} +//Attach bugs +function attch(idx, cid, bugs){ + displayMsg('pp'+idx, 3, MSG_WAIT.blink()); + disableAllButtons(true); + dojo.io.bind({ + url: "tr_show_caserun.cgi", + content: { caserun_id: cid, index: idx, bugs: bugs, action: 'attach_bug'}, + load: function(type, data, evt){ + document.getElementById('bgl'+idx).innerHTML = data; + if (data.match("Invalid")){ + displayMsg('pp'+ idx, 2, "Invalid Bug"); + } + else{ + displayMsg('pp'+ idx, 1, MSG_BUG_ATTACHED); + } + setTimeout("clearMsg('pp"+ idx +"')",OK_TIMEOUT); + disableAllButtons(false); + }, + error: function(type, error){ alert(error.message);}, + mimetype: "text/plain" + }); + +} diff --git a/testopia/js/tags.js b/testopia/js/tags.js new file mode 100644 index 0000000..34b1981 --- /dev/null +++ b/testopia/js/tags.js @@ -0,0 +1,69 @@ +// Requires testopia/js/util.js + +function makeCall(query){ + + if (typeof(httpReq) != 'undefined') { + httpReq.abort(); + } + + httpReq = createHttpReq(); + if (httpReq) { + document.getElementById('doAdd').disabled = true; +//alert("Got it " + plan_id); + displayMsg('message', 3, MSG_WAIT.blink()); + + _timeOutID = window.setTimeout("timeout('message')",HTTPREQUEST_TIMEOUT); + httpReq.open('POST', 'tr_tags.cgi', true); + httpReq.setRequestHeader('Content-Type', CONTENT_TYPE); + httpReq.onreadystatechange = tagAttached; + httpReq.send(query); + } +} + +function addTag(id, type){ + var tagValue = dojo.widget.manager.getWidgetById('newtag').getValue(); + if (tagValue == ''){ + alert("I can't work with a blank tag. Please enter something in the space provided"); + return; + } + var q = 'action=addtag&id=' + id + '&tag=' + tagValue + '&type=' + type; + makeCall(q); +} + +function removeTag(tagid, id, type){ + var q = 'action=removetag&id=' + id + '&tagid=' + tagid + '&type=' + type; + makeCall(q); + +} + +function tagAttached() { + if (httpReq.readyState == 4) { + if(_timeOutID) { + clearTimeout(_timeOutID); + _timeOutID = null; + } + + var s = httpReq.responseText; +// alert(s); + if (s.substring(0,2)=='OK') { + s = s.substring(2); + + displayMsg('message', 1, "Updated"); + setTimeout("clearMsg('message')",OK_TIMEOUT); + dojo.widget.manager.getWidgetById('tagTable').setContent(s); +// document.getElementById('tagTable').innerHTML = s; + } else { + if (s.substring(0,5)=='Error') { + //controlled error + } else { + s = MSG_REQUEST_FAILED; + } + displayMsg('message', 2, s); + } + httpReq = undefined; + document.getElementById('doAdd').disabled = false; + dojo.widget.manager.getWidgetById('newtag').setAllValues = ''; + + } + +} \ No newline at end of file diff --git a/testopia/js/util.js b/testopia/js/util.js new file mode 100755 index 0000000..876c2bf --- /dev/null +++ b/testopia/js/util.js @@ -0,0 +1,228 @@ +var _disable_sr=false; + +function addOption(selectElement,newOption) { + try { + selectElement.add(newOption,null); + } + + catch (e) { + selectElement.add(newOption,selectElement.length); + } +} + +function coal() { + for(var i=1;;i++) { + var ra = document.getElementById('ra'+i); + if (ra) { + if (ra.style.display=='block') { + ra.style.display='none'; + document.getElementById('id'+i).src='testopia/img/tr.gif'; + } + } else { + break; + } + } +} +function exal() { + for(var i=1;;i++) { + var ra = document.getElementById('ra'+i); + if (ra) { + if (ra.style && (ra.style.display=='none' || ra.style.display=='')) { + ra.style.display='block'; + document.getElementById('id'+i).src='testopia/img/tr.gif'; + } + } else { + break; + } + } +} +function _cset(newstate) { + var myform = document.getElementById('table'); + for(i=0;i<myform.length;i++) { + if(myform[i].type == 'checkbox' && myform[i].name != 'togglearch'){ + myform[i].checked = newstate; + } + } + //st(); +} + +function st() { + var nv = ((_canedit) && (count>0))? false : true; + disableAllSelects(nv); +} + +function sp(list_index, list_id) { + for(var i=0; true; i++) { + var c = document.getElementById('c_'+i); + if (c) { + if (c.checked) { + list_index.push(i); + list_id.push(ids[i]); + } + } else { + break; + } + } +} + +function sall() { + _cset(true); +} + +function snone() { + _cset(false); +} +// Show/hide a row +function sr(i) { + if (_disable_sr) { + _disable_sr = false; + } else { + _sr(document.getElementById('ra'+i), document.getElementById('id'+i)); + } +} + +function _sr(obj,im) { + if (obj.style.display=='block') {obj.style.display='none'; im.src='testopia/img/tr.gif';} + else {obj.style.display='block'; im.src='testopia/img/td.gif'} +} + +function get_ie_ver () { + var UAversion = parseFloat( navigator.Appversion ); + if (navigator.appVersion.indexOf("MSIE") != -1) + { + IEmajorStart = navigator.appVersion.indexOf("MSIE") + 4; + IEmajorEnd = (IEmajorStart + 5); + theMajor = navigator.appVersion.substring(IEmajorStart, IEmajorEnd); + (UAversion = theMajor); + } else { + if (isNaN(UAversion)) { + (UAversion = (UAversion.substring(0, (UAversion.length - 1)))); + } + } + return UAversion; +} + +var ie45,ns6,ns4,dom; + +if (navigator.appName=="Microsoft Internet Explorer") { + ie45 = parseInt(get_ie_ver()) >=4; +} else if (navigator.appName=="Netscape") { + ns6=parseInt(navigator.appVersion)>=5; + ns4=parseInt(navigator.appVersion)<5; +} +dom=ie45 || ns6; + +function showit (id) { + el = document.all ? document.all[id] : + (dom ? document.getElementById(id) : document.layers[id]); + els = dom ? el.style : el; + if (dom){ + if (els.visibility == "hidden") els.visibility = "visible"; + } else if (ns4){ + if (els.visibility == "hide") els.visibility = "show"; + } +} + +// There is only AJAX + +var HTTPREQUEST_TIMEOUT=30000; +var CONTENT_TYPE='application/x-www-form-urlencoded'; +var OK_TIMEOUT=3000; + +var MSG_WAIT='Please wait...'; +var MSG_TIMEOUT='Request timed out. Please try again.'; +var MSG_REQUEST_FAILED='Error, request failed. You either do not have permission to perform this action or an internal error occurred.'; +var MSG_COMM_PROBLEM='Error, communication problem. Please try again.'; +var MSG_BAD_BROWSER="Your browser doesn't support client HTTP requests (XMLHttp). Please, use the classic interface."; + +function createHttpReq () { + + var httpReq; + + /*@cc_on @*/ + /*@if (@_jscript_version >= 5) + try { + httpReq = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + try { + httpReq = new ActiveXObject("Microsoft.XMLHTTP"); + } catch (E) { + httpReq = null; + } + } + @end @*/ + if (!httpReq && typeof XMLHttpRequest!='undefined') { + httpReq = new XMLHttpRequest(); + httpReq.multipart = false; + } + + if (!httpReq) { + alert(MSG_BAD_BROWSER); + } + + return httpReq; +} + + +function clearMsg(id) { + var o = document.getElementById(id); + o.style.display="none"; +} + +function displayMsg(id, type, text) { + + var o = document.getElementById(id); + switch(type) { + case 1: + o.style.background='green'; + o.style.color='white'; + break; + case 2: + o.style.background='red'; + o.style.color='white'; + break; + case 3: + o.style.background='#FFDD66'; + o.style.color='black'; + break; + } + o.innerHTML = text; + o.style.display = 'inline'; +} + +function nc(obj) { + obj.style.height='160px'; + //obj.rows=8; +} + +function nb(obj) { + //obj.rows=1; + obj.style.height='20px'; +} + +function getProdVers(product, plan){ + document.getElementById("prod_version").disabled = true; + dojo.io.bind({ + url: "tr_new_plan.cgi", + content: { product_id: product, action: "getversions" }, + load: function(type, data, evt){ + if (data.error){ + alert(data.error); + document.getElementById("prod_version").disabled = false; + return; + } + var prodvers = document.getElementById("prod_version"); + prodvers.options.length = 0; + for (i in data){ + var myOp = new Option(data[i].name, data[i].id); + addOption(prodvers, myOp); + if (data[i].name == '[% plan.product_version FILTER none %]'){ + prodvers.options[i].selected = true; + } + } + document.getElementById("prod_version").disabled = false; + }, + error: function(type, error){ alert("ERROR");}, + mimetype: "text/json" + }); +} diff --git a/testopia/patch-2.22 b/testopia/patch-2.22 new file mode 100644 index 0000000..c48cecf --- /dev/null +++ b/testopia/patch-2.22 @@ -0,0 +1,843 @@ +Index: checksetup.pl +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/checksetup.pl,v +retrieving revision 1.469 +diff -u -r1.469 checksetup.pl +--- checksetup.pl 12 Jan 2006 07:03:46 -0000 1.469 ++++ checksetup.pl 27 Mar 2007 20:34:34 -0000 +@@ -313,7 +313,7 @@ + }, + { + name => 'Template', +- version => '2.08' ++ version => '2.12' + }, + { + name => 'Text::Wrap', +@@ -376,6 +376,10 @@ + } + } + ++print "\nThe following Perl modules are Required for Testopia:\n" unless $silent; ++$missing{'Text::Diff'} = '0.35' unless have_vers("Text::Diff","0.35"); ++$missing{'JSON'} = '1.07' unless have_vers("JSON","1.07"); ++ + print "\nThe following Perl modules are optional:\n" unless $silent; + my $gd = have_vers("GD","1.20"); + my $chartbase = have_vers("Chart::Base","1.0"); +@@ -1305,7 +1309,7 @@ + # These are the files which need to be marked executable + my @executable_files = ('whineatnews.pl', 'collectstats.pl', + 'checksetup.pl', 'importxml.pl', 'runtests.pl', 'testserver.pl', +- 'whine.pl'); ++ 'whine.pl', 'tr_install.pl', 'tr_importxml.pl'); + + # tell me if a file is executable. All CGI files and those in @executable_files + # are executable +Index: enter_bug.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/enter_bug.cgi,v +retrieving revision 1.126 +diff -u -r1.126 enter_bug.cgi +--- enter_bug.cgi 5 Jan 2006 14:54:52 -0000 1.126 ++++ enter_bug.cgi 27 Mar 2007 20:34:34 -0000 +@@ -590,6 +590,8 @@ + + $vars->{'default'} = \%default; + ++$vars->{'caserun_id'} = $cgi->param('caserun_id'); ++ + my $format = $template->get_format("bug/create/create", + scalar $cgi->param('format'), + scalar $cgi->param('ctype')); +Index: Bugzilla.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla.pm,v +retrieving revision 1.29 +diff -u -r1.29 Bugzilla.pm +--- Bugzilla.pm 7 Feb 2006 22:46:28 -0000 1.29 ++++ Bugzilla.pm 27 Mar 2007 20:34:34 -0000 +@@ -46,6 +46,7 @@ + use constant SHUTDOWNHTML_EXEMPT => [ + 'editparams.cgi', + 'checksetup.pl', ++ 'tr_install.pl', + ]; + + # Non-cgi scripts that should silently exit. +Index: post_bug.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/post_bug.cgi,v +retrieving revision 1.135 +diff -u -r1.135 post_bug.cgi +--- post_bug.cgi 8 Jan 2006 19:56:03 -0000 1.135 ++++ post_bug.cgi 27 Mar 2007 20:34:34 -0000 +@@ -33,6 +33,8 @@ + use Bugzilla::Bug; + use Bugzilla::User; + use Bugzilla::Field; ++use Bugzilla::Testopia::TestCaseRun; ++use Bugzilla::Testopia::Util; + + # Shut up misguided -w warnings about "used only once". For some reason, + # "use vars" chokes on me when I try it here. +@@ -494,6 +496,17 @@ + } + $vars->{'bug_list'} = \@bug_list; + ++if ($cgi->param('caserun_id')) { ++ my $tcid = $cgi->param('caserun_id'); ++ detaint_natural($tcid); ++ validate_test_id($tcid, 'case_run'); ++ my $caserun = Bugzilla::Testopia::TestCaseRun->new($tcid); ++ ++ $caserun->attach_bug($id); ++ ++ $vars->{'caserun'} = $caserun; ++} ++ + print $cgi->header(); + $template->process("bug/create/created.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +Index: editusers.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/editusers.cgi,v +retrieving revision 1.113 +diff -u -r1.113 editusers.cgi +--- editusers.cgi 3 Jan 2006 08:40:45 -0000 1.113 ++++ editusers.cgi 27 Mar 2007 20:34:34 -0000 +@@ -185,6 +185,8 @@ + # Lock tables during the check+creation session. + $dbh->bz_lock_tables('profiles WRITE', + 'profiles_activity WRITE', ++ 'test_plan_permissions WRITE', ++ 'test_plan_permissions_regexp READ', + 'groups READ', + 'user_group_map WRITE', + 'email_setting WRITE', +@@ -232,6 +234,7 @@ + # Lock tables during the check+update session. + $dbh->bz_lock_tables('profiles WRITE', + 'profiles_activity WRITE', ++ 'test_plan_permissions WRITE', + 'fielddefs READ', + 'namedqueries READ', + 'whine_queries READ', +Index: Bugzilla/User.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/User.pm,v +retrieving revision 1.101.2.3 +diff -u -r1.101.2.3 User.pm +--- Bugzilla/User.pm 14 Mar 2006 07:45:54 -0000 1.101.2.3 ++++ Bugzilla/User.pm 27 Mar 2007 20:34:34 -0000 +@@ -236,6 +236,16 @@ + return $self->{queries}; + } + ++sub testopia_queries { ++ my $self = shift; ++ my $dbh = Bugzilla->dbh; ++ my $ref = $dbh->selectall_arrayref( ++ "SELECT name, query FROM test_named_queries ++ WHERE userid = ? AND isvisible = 1", ++ {'Slice' =>{}}, $self->id); ++ return $ref; ++} ++ + sub settings { + my ($self) = @_; + +@@ -467,7 +477,7 @@ + my $dbh = Bugzilla->dbh; + my @params = (); + +- my $query = "SELECT id " . ++ my $query = "(SELECT id, products.name AS pname " . + "FROM products " . + "LEFT JOIN group_control_map " . + "ON group_control_map.product_id = products.id "; +@@ -482,13 +492,22 @@ + "WHERE group_id IS NULL "; + + if (Param('useclassification') && $classification_id) { +- $query .= "AND classification_id = ? "; ++ $query .= "AND classification_id = ?) "; + detaint_natural($classification_id); + push(@params, $classification_id); + } +- +- $query .= "ORDER BY name"; +- ++ else { ++ $query .= ") "; ++ } ++ $query .= "UNION (SELECT id, products.name AS pname FROM products ". ++ "INNER JOIN test_plans ON products.id = test_plans.product_id ". ++ "INNER JOIN test_plan_permissions ON test_plan_permissions.plan_id = test_plans.plan_id ". ++ "WHERE test_plan_permissions.userid = ?)"; ++ ++ $query .= "ORDER BY pname "; ++ ++ push @params, $self->id; ++ + my $prod_ids = $dbh->selectcol_arrayref($query, undef, @params); + my @products; + foreach my $prod_id (@$prod_ids) { +@@ -674,7 +693,34 @@ + $group_delete->execute($id, $group, GRANT_REGEXP) if $present; + } + } +- ++ ++ # Now do the same for Testopia test plans. ++ $sth = $dbh->prepare("SELECT test_plan_permissions_regexp.plan_id, ++ user_regexp, test_plan_permissions_regexp.permissions, ++ test_plan_permissions.plan_id ++ FROM test_plan_permissions_regexp ++ LEFT JOIN test_plan_permissions ++ ON test_plan_permissions_regexp.plan_id = test_plan_permissions.plan_id ++ AND test_plan_permissions.userid = ? ++ AND test_plan_permissions.grant_type = ?"); ++ ++ $sth->execute($id, GRANT_REGEXP); ++ my $plan_insert = $dbh->prepare(q{INSERT INTO test_plan_permissions ++ (userid, plan_id, permissions, grant_type) ++ VALUES (?, ?, ?, ?)}); ++ my $plan_delete = $dbh->prepare(q{DELETE FROM test_plan_permissions ++ WHERE userid = ? ++ AND plan_id = ? ++ AND grant_type = ?}); ++ ++ while (my ($planid, $regexp, $perms, $present) = $sth->fetchrow_array()) { ++ if (($regexp ne '') && ($self->{login} =~ m/$regexp/i)) { ++ $plan_insert->execute($id, $planid, $perms, GRANT_REGEXP) unless $present; ++ } else { ++ $plan_delete->execute($id, $planid, GRANT_REGEXP) if $present; ++ } ++ } ++ + $dbh->do(q{UPDATE profiles + SET refreshed_when = ? + WHERE userid=?}, +Index: Bugzilla/Template.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/Template.pm,v +retrieving revision 1.41 +diff -u -r1.41 Template.pm +--- Bugzilla/Template.pm 22 Jan 2006 21:37:37 -0000 1.41 ++++ Bugzilla/Template.pm 27 Mar 2007 20:34:34 -0000 +@@ -499,6 +499,14 @@ + return $var; + }, + ++ # Prevent XSS attacks in WYSIWYG fields. ++ xss => sub{ ++ my ($var) = @_; ++ $var =~ s/(<|<)script/_script/ig; ++ $var =~ s/(<|<)\/script(>|>)/script_/gi; ++ return $var; ++ }, ++ + # iCalendar contentline filter + ics => [ sub { + my ($context, @args) = @_; +Index: Bugzilla/DB/Schema/Mysql.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB/Schema/Mysql.pm,v +retrieving revision 1.12 +diff -u -r1.12 Mysql.pm +--- Bugzilla/DB/Schema/Mysql.pm 18 Dec 2005 18:53:00 -0000 1.12 ++++ Bugzilla/DB/Schema/Mysql.pm 27 Mar 2007 20:34:34 -0000 +@@ -103,9 +103,10 @@ + INT3 => 'mediumint', + INT4 => 'integer', + +- SMALLSERIAL => 'smallint auto_increment', +- MEDIUMSERIAL => 'mediumint auto_increment', +- INTSERIAL => 'integer auto_increment', ++ TINYSERIAL => 'tinyint unsigned auto_increment', ++ SMALLSERIAL => 'smallint unsigned auto_increment', ++ MEDIUMSERIAL => 'mediumint unsigned auto_increment', ++ INTSERIAL => 'integer unsigned auto_increment', + + TINYTEXT => 'tinytext', + MEDIUMTEXT => 'mediumtext', +Index: Bugzilla/DB/Schema/Pg.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB/Schema/Pg.pm,v +retrieving revision 1.9 +diff -u -r1.9 Pg.pm +--- Bugzilla/DB/Schema/Pg.pm 15 Jun 2005 03:54:59 -0000 1.9 ++++ Bugzilla/DB/Schema/Pg.pm 27 Mar 2007 20:34:34 -0000 +@@ -69,6 +69,7 @@ + INT3 => 'integer', + INT4 => 'integer', + ++ TINYSERIAL => 'serial unique', + SMALLSERIAL => 'serial unique', + MEDIUMSERIAL => 'serial unique', + INTSERIAL => 'serial unique', +Index: Bugzilla/DB/Schema.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB/Schema.pm,v +retrieving revision 1.45 +diff -u -r1.45 Schema.pm +--- Bugzilla/DB/Schema.pm 6 Jan 2006 14:38:42 -0000 1.45 ++++ Bugzilla/DB/Schema.pm 27 Mar 2007 20:34:34 -0000 +@@ -1040,6 +1040,557 @@ + ], + }, + ++ # TESTOPIA TABLES ++ # --------------- ++ test_attachments => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ submitter_id => {TYPE => 'INT3', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ filename => {TYPE => 'MEDIUMTEXT'}, ++ creation_ts => {TYPE => 'DATETIME', NOTNULL => 1}, ++ mime_type => {TYPE => 'varchar(100)', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_attachments_submitter_idx => ['submitter_id'], ++ ], ++ }, ++ ++ test_case_attachments => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INT4', NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ case_run_id => {TYPE => 'INT4', UNSIGNED => 1}, ++ ], ++ INDEXES => [ ++ test_case_attachments_primary_idx => ['attachment_id'], ++ attachment_case_id_idx => ['case_id'], ++ attachment_caserun_id_idx => ['case_run_id'], ++ ], ++ }, ++ ++ test_plan_attachments => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INT4', NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ ], ++ INDEXES => [ ++ test_plan_attachments_primary_idx => ['attachment_id'], ++ attachment_plan_id_idx => ['plan_id'], ++ ], ++ }, ++ ++ test_case_categories => { ++ FIELDS => [ ++ category_id => {TYPE => 'SMALLSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ name => {TYPE => 'varchar(240)', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ category_product_id_name_idx => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ category_product_idx => {FIELDS => [qw(category_id product_id)], TYPE => 'UNIQUE'}, ++ category_name_idx_v2 => ['name'], ++ ], ++ }, ++ ++ test_cases => { ++ FIELDS => [ ++ case_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ case_status_id => {TYPE => 'INT1', NOTNULL => 1}, ++ category_id => {TYPE => 'INT2', NOTNULL => 1, UNSIGNED =>1}, ++ priority_id => {TYPE => 'INT2'}, ++ author_id => {TYPE => 'INT3', NOTNULL => 1}, ++ default_tester_id => {TYPE => 'INT3'}, ++ creation_date => {TYPE => 'DATETIME', NOTNULL => 1}, ++ estimated_time => {TYPE => 'TIME'}, ++ isautomated => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '0'}, ++ sortkey => {TYPE => 'INT4'}, ++ script => {TYPE => 'MEDIUMTEXT'}, ++ arguments => {TYPE => 'MEDIUMTEXT'}, ++ summary => {TYPE => 'varchar(255)'}, ++ requirement => {TYPE => 'varchar(255)'}, ++ alias => {TYPE => 'varchar(255)'}, ++ ], ++ INDEXES => [ ++ test_case_category_idx => ['category_id'], ++ test_case_author_idx => ['author_id'], ++ test_case_creation_date_idx => ['creation_date'], ++ test_case_sortkey_idx => ['sortkey'], ++ test_case_shortname_idx => ['alias'], ++ test_case_requirement_idx => ['requirement'], ++ test_case_status_idx => ['case_status_id'], ++ test_case_tester_idx => ['default_tester_id'], ++ ], ++ }, ++ ++ test_case_bugs => { ++ FIELDS => [ ++ bug_id => {TYPE => 'INT3', NOTNULL => 1}, ++ case_run_id => {TYPE => 'INT4', UNSIGNED => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_bugs_bug_id_idx => ['bug_id'], ++ case_bugs_case_id_idx => ['case_id'], ++ case_bugs_case_run_id_idx => ['case_run_id'], ++ ], ++ }, ++ ++ test_case_runs => { ++ FIELDS => [ ++ case_run_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ assignee => {TYPE => 'INT3'}, ++ testedby => {TYPE => 'INT3'}, ++ case_run_status_id => {TYPE => 'INT1', NOTNULL => 1, UNSIGNED => 1}, ++ case_text_version => {TYPE => 'INT3', NOTNULL => 1}, ++ build_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ running_date => {TYPE => 'DATETIME'}, ++ close_date => {TYPE => 'DATETIME'}, ++ notes => {TYPE => 'TEXT'}, ++ iscurrent => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '0'}, ++ sortkey => {TYPE => 'INT4'}, ++ environment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_run_case_id_idx => ['case_id'], ++ case_run_assignee_idx => ['assignee'], ++ case_run_testedby_idx => ['testedby'], ++ case_run_close_date_idx => ['close_date'], ++ case_run_build_env_idx => {FIELDS => [qw(run_id case_id build_id environment_id)], ++ TYPE => 'UNIQUE'}, ++ case_run_status_idx => ['case_run_status_id'], ++ case_run_text_ver_idx => ['case_text_version'], ++ case_run_build_idx_v2 => ['build_id'], ++ case_run_env_idx_v2 => ['environment_id'], ++ ], ++ }, ++ ++ test_case_texts => { ++ FIELDS => [ ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL =>1}, ++ case_text_version => {TYPE => 'INT3', NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ creation_ts => {TYPE => 'DATETIME', NOTNULL => 1}, ++ action => {TYPE => 'MEDIUMTEXT'}, ++ effect => {TYPE => 'MEDIUMTEXT'}, ++ setup => {TYPE => 'MEDIUMTEXT'}, ++ breakdown => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ case_versions_idx => {FIELDS => [qw(case_id case_text_version)], ++ TYPE => 'UNIQUE'}, ++ case_versions_who_idx => ['who'], ++ case_versions_creation_ts_idx => ['creation_ts'], ++ ], ++ }, ++ ++ test_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ tag_name => {TYPE => 'varchar(255)', NOTNULL => 1}, ++ ], ++ INDEXES => [ test_tag_name_idx_v2 => [qw(tag_name)] ], ++ }, ++ ++ test_case_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_tags_primary_idx => {FIELDS => [qw(tag_id case_id userid)], TYPE => 'UNIQUE'}, ++ case_tags_secondary_idx => {FIELDS => [qw(tag_id case_id)], TYPE => 'UNIQUE'}, ++ case_tags_case_id_idx_v3 => [qw(case_id)], ++ case_tags_userid_idx => [qw(userid)], ++ ], ++ }, ++ ++ test_run_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ run_tags_primary_idx => {FIELDS => [qw(tag_id run_id userid)], TYPE => 'UNIQUE'}, ++ run_tags_secondary_idx => {FIELDS => [qw(tag_id run_id)], TYPE => 'UNIQUE'}, ++ run_tags_run_id_idx => [qw(run_id)], ++ run_tags_userid_idx => [qw(userid)], ++ ], ++ }, ++ ++ test_plan_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ plan_tags_primary_idx => {FIELDS => [qw(tag_id plan_id userid)], TYPE => 'UNIQUE'}, ++ plan_tags_secondary_idx => {FIELDS => [qw(tag_id plan_id)], TYPE => 'UNIQUE'}, ++ plan_tags_plan_id_idx => [qw(plan_id)], ++ plan_tags_userid_idx => [qw(userid)], ++ ], ++ }, ++ ++ test_plans => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ author_id => {TYPE => 'INT3', NOTNULL => 1}, ++ type_id => {TYPE => 'INT1', NOTNULL => 1, UNSIGNED => 1}, ++ default_product_version => {TYPE => 'MEDIUMTEXT', NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)', NOTNULL => 1}, ++ creation_date => {TYPE => 'DATETIME', NOTNULL => 1}, ++ isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, ++ ], ++ INDEXES => [ ++ plan_product_plan_id_idx => [qw(product_id plan_id)], ++ plan_author_idx => ['author_id'], ++ plan_type_idx => ['type_id'], ++ plan_isactive_idx => ['isactive'], ++ plan_name_idx => ['name'], ++ ], ++ }, ++ ++ test_plan_permissions => { ++ FIELDS => [ ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ permissions => {TYPE => 'INT1', NOTNULL => 1}, ++ grant_type => {TYPE => 'INT1', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ testers_plan_user_idx => {FIELDS => [qw(userid plan_id grant_type)], TYPE => 'UNIQUE'}, ++ testers_plan_user_plan_idx => ['plan_id'], ++ testers_plan_grant_idx => ['grant_type'], ++ ], ++ }, ++ ++ test_plan_permissions_regexp => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ user_regexp => {TYPE => 'TEXT', NOTNULL => 1}, ++ permissions => {TYPE => 'INT1', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ testers_plan_regexp_idx => {FIELDS => [qw(plan_id)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ ++ test_plan_texts => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ plan_text_version => {TYPE => 'INT4', NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ creation_ts => {TYPE => 'DATETIME', NOTNULL => 1}, ++ plan_text => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ test_plan_text_version_idx => [qw(plan_id plan_text_version)], ++ test_plan_text_who_idx => ['who'], ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_plan_types => { ++ FIELDS => [ ++ type_id => {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(64)', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ }, ++ ++ test_runs => { ++ FIELDS => [ ++ run_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ environment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ product_version => {TYPE => 'MEDIUMTEXT'}, ++ build_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ plan_text_version => {TYPE => 'INT4', NOTNULL => 1}, ++ manager_id => {TYPE => 'INT3', NOTNULL => 1}, ++ default_tester_id => {TYPE => 'INT3'}, ++ start_date => {TYPE => 'DATETIME', NOTNULL => 1}, ++ stop_date => {TYPE => 'DATETIME'}, ++ summary => {TYPE => 'TINYTEXT', NOTNULL => 1}, ++ notes => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ test_run_plan_id_run_id_idx => [qw(plan_id run_id)], ++ test_run_manager_idx => ['manager_id'], ++ test_run_start_date_idx => ['start_date'], ++ test_run_stop_date_idx => ['stop_date'], ++ test_run_env_idx => ['environment_id'], ++ test_run_build_idx => ['build_id'], ++ test_run_plan_ver_idx => ['plan_text_version'], ++ test_run_tester_idx => ['default_tester_id'], ++ test_runs_summary_idx => {FIELDS => ['summary'], ++ TYPE => 'FULLTEXT'}, ++ ], ++ }, ++ ++ test_case_plans => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_case_plans_primary_idx => {FIELDS => [qw(plan_id case_id)], TYPE => 'UNIQUE'}, ++ test_case_plans_case_idx => [qw(case_id)], ++ ], ++ }, ++ ++ test_case_activity => { ++ FIELDS => [ ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ fieldid => {TYPE => 'INT2', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ changed => {TYPE => 'DATETIME', NOTNULL => 1}, ++ oldvalue => {TYPE => 'MEDIUMTEXT'}, ++ newvalue => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ case_activity_case_id_idx => ['case_id'], ++ case_activity_who_idx => ['who'], ++ case_activity_when_idx => ['changed'], ++ case_activity_field_idx => ['fieldid'], ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_fielddefs => { ++ FIELDS => [ ++ fieldid => {TYPE => 'SMALLSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(100)', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ table_name => {TYPE => 'varchar(100)', NOTNULL => 1}, ++ ], ++ }, ++ ++ test_plan_activity => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ fieldid => {TYPE => 'INT2', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ changed => {TYPE => 'DATETIME', NOTNULL => 1}, ++ oldvalue => {TYPE => 'MEDIUMTEXT'}, ++ newvalue => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ plan_activity_primary_idx => ['plan_id'], ++ plan_activity_field_idx => ['fieldid'], ++ plan_activity_who_idx => ['who'], ++ plan_activity_changed_idx => ['changed'], ++ ], ++ }, ++ ++ test_case_components => { ++ FIELDS => [ ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ component_id => {TYPE => 'INT2', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ components_case_id_idx => {FIELDS => [qw(case_id component_id)], TYPE => 'UNIQUE'}, ++ components_component_id_idx => ['component_id'], ++ ], ++ }, ++ ++ test_run_activity => { ++ FIELDS => [ ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ fieldid => {TYPE => 'INT2', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ changed => {TYPE => 'DATETIME', NOTNULL => 1}, ++ oldvalue => {TYPE => 'MEDIUMTEXT'}, ++ newvalue => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ run_activity_run_id_idx => ['run_id'], ++ run_activity_field_idx => ['fieldid'], ++ run_activity_who_idx => ['who'], ++ run_activity_when_idx => ['changed'], ++ ], ++ }, ++ ++ test_run_cc => { ++ FIELDS => [ ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_run_cc_primary_idx => {FIELDS => [qw(run_id who)], TYPE => 'UNIQUE'}, ++ test_run_cc_who_idx => [qw(who)], ++ ], ++ }, ++ ++ test_email_settings => { ++ FIELDS => [ ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ eventid => {TYPE => 'INT1', UNSIGNED => 1, NOTNULL => 1}, ++ relationship_id => {TYPE => 'INT1', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_email_setting_user_id_idx => ++ {FIELDS => [qw(userid relationship_id eventid)], ++ TYPE => 'UNIQUE'}, ++ ], ++ }, ++ ++ test_events => { ++ FIELDS => [ ++ eventid => {TYPE => 'INT1', UNSIGNED => 1, PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(50)'}, ++ ], ++ INDEXES => [ ++ test_event_name_idx => ['name'], ++ ], ++ }, ++ ++ test_relationships => { ++ FIELDS => [ ++ relationship_id => {TYPE => 'INT1', UNSIGNED => 1, PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(50)'}, ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_case_run_status => { ++ FIELDS => [ ++ case_run_status_id => {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(20)'}, ++ sortkey => {TYPE => 'INT4'}, ++ description => {TYPE => 'TEXT'}, ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_case_status => { ++ FIELDS => [ ++ case_status_id => {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)', NOTNULL => 1}, ++ description => {TYPE => 'TEXT'}, ++ ], ++ }, ++ ++ test_case_dependencies => { ++ FIELDS => [ ++ dependson => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ blocked => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_dependencies_primary_idx => {FIELDS => [qw(dependson blocked)], TYPE => 'UNIQUE'}, ++ case_dependencies_blocked_idx => ['blocked'], ++ ], ++ }, ++ ++ test_environments => { ++ FIELDS => [ ++ environment_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, ++ ], ++ INDEXES => [ ++ test_environments_key1 => {FIELDS => [qw(environment_id product_id)], TYPE => 'UNIQUE'}, ++ test_environments_key2 => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ environment_name_idx_v2 => ['name'], ++ ], ++ }, ++ ++ test_builds => { ++ FIELDS => [ ++ build_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ milestone => {TYPE => 'varchar(20)'}, ++ name => {TYPE => 'varchar(255)'}, ++ description => {TYPE => 'TEXT'}, ++ isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, ++ ], ++ INDEXES => [ ++ build_name_idx => ['name'], ++ build_milestone_idx => ['milestone'], ++ build_product_id_name_idx => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ build_prod_idx => {FIELDS => [qw(build_id product_id)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ ++ test_attachment_data => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ contents => {TYPE => 'LONGBLOB'}, ++ ], ++ INDEXES => [ ++ test_attachment_data_primary_idx => ['attachment_id'], ++ ], ++ }, ++ ++ test_named_queries => { ++ FIELDS => [ ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ name => {TYPE => 'varchar(64)', NOTNULL => 1}, ++ isvisible => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 1}, ++ query => {TYPE => 'MEDIUMTEXT', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_namedquery_primary_idx => {FIELDS => [qw(userid name)], TYPE => 'UNIQUE'}, ++ test_namedquery_name_idx => ['name'], ++ ], ++ }, ++ ++ test_environment_map => { ++ FIELDS => [ ++ environment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ property_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ element_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ value_selected => {TYPE => 'TINYTEXT'}, ++ ], ++ INDEXES => [ ++ env_map_env_element_idx => [qw(environment_id element_id)], ++ env_map_property_idx => [qw(environment_id property_id)], ++ test_environment_map_key3 => {FIELDS => [qw(environment_id element_id property_id)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ test_environment_element => { ++ FIELDS => [ ++ element_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ env_category_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ parent_id => {TYPE => 'INT4', UNSIGNED => 1}, ++ isprivate => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 0}, ++ ], ++ INDEXES => [ ++ test_environment_element_key1 => {FIELDS => [qw(element_id env_category_id)], TYPE => 'UNIQUE'}, ++ test_environment_element_key2 => {FIELDS => [qw(env_category_id name)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ test_environment_category => { ++ FIELDS => [ ++ env_category_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ ], ++ INDEXES => [ ++ test_environment_category_key1 => {FIELDS => [qw(env_category_id product_id)], TYPE => 'UNIQUE'}, ++ test_environment_category_key2 => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ test_environment_property => { ++ FIELDS => [ ++ property_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ element_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ validexp => {TYPE => 'TEXT'}, ++ ], ++ INDEXES => [ ++ test_environment_property_key1 => {FIELDS => [qw(property_id element_id)], TYPE => 'UNIQUE'}, ++ test_environment_property_key2 => {FIELDS => [qw(element_id name)], TYPE => 'UNIQUE'}, ++ ], ++ }, + }; + #-------------------------------------------------------------------------- diff --git a/testopia/patch-2.22.1 b/testopia/patch-2.22.1 new file mode 100644 index 0000000..d97c8f7 --- /dev/null +++ b/testopia/patch-2.22.1 @@ -0,0 +1,853 @@ +Index: editusers.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/editusers.cgi,v +retrieving revision 1.113.2.1 +diff -u -r1.113.2.1 editusers.cgi +--- editusers.cgi 14 Oct 2006 22:05:54 -0000 1.113.2.1 ++++ editusers.cgi 27 Mar 2007 20:27:05 -0000 +@@ -190,6 +190,8 @@ + # Lock tables during the check+creation session. + $dbh->bz_lock_tables('profiles WRITE', + 'profiles_activity WRITE', ++ 'test_plan_permissions WRITE', ++ 'test_plan_permissions_regexp READ', + 'groups READ', + 'user_group_map WRITE', + 'email_setting WRITE', +@@ -242,6 +244,7 @@ + # Lock tables during the check+update session. + $dbh->bz_lock_tables('profiles WRITE', + 'profiles_activity WRITE', ++ 'test_plan_permissions WRITE', + 'fielddefs READ', + 'namedqueries READ', + 'whine_queries READ', +Index: checksetup.pl +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/checksetup.pl,v +retrieving revision 1.469.2.15 +diff -u -r1.469.2.15 checksetup.pl +--- checksetup.pl 14 Oct 2006 20:30:53 -0000 1.469.2.15 ++++ checksetup.pl 27 Mar 2007 20:27:05 -0000 +@@ -313,7 +313,7 @@ + }, + { + name => 'Template', +- version => '2.10' ++ version => '2.12' + }, + { + name => 'Text::Wrap', +@@ -377,6 +377,10 @@ + } + } + ++print "\nThe following Perl modules are Required for Testopia:\n" unless $silent; ++$missing{'Text::Diff'} = '0.35' unless have_vers("Text::Diff","0.35"); ++$missing{'JSON'} = '1.07' unless have_vers("JSON","1.07"); ++ + print "\nThe following Perl modules are optional:\n" unless $silent; + my $gd = have_vers("GD","1.20"); + my $template_gd = have_vers('Template::Plugin::GD::Image', 0); +@@ -1335,7 +1339,7 @@ + # These are the files which need to be marked executable + my @executable_files = ('whineatnews.pl', 'collectstats.pl', + 'checksetup.pl', 'importxml.pl', 'runtests.pl', 'testserver.pl', +- 'whine.pl'); ++ 'whine.pl', 'tr_install.pl', 'tr_importxml.pl'); + + # tell me if a file is executable. All CGI files and those in @executable_files + # are executable +Index: enter_bug.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/enter_bug.cgi,v +retrieving revision 1.126.2.2 +diff -u -r1.126.2.2 enter_bug.cgi +--- enter_bug.cgi 21 Aug 2006 19:26:06 -0000 1.126.2.2 ++++ enter_bug.cgi 27 Mar 2007 20:27:05 -0000 +@@ -591,6 +591,8 @@ + + $vars->{'default'} = \%default; + ++$vars->{'caserun_id'} = $cgi->param('caserun_id'); ++ + my $format = $template->get_format("bug/create/create", + scalar $cgi->param('format'), + scalar $cgi->param('ctype')); +Index: post_bug.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/post_bug.cgi,v +retrieving revision 1.135.2.3 +diff -u -r1.135.2.3 post_bug.cgi +--- post_bug.cgi 4 Jul 2006 09:51:56 -0000 1.135.2.3 ++++ post_bug.cgi 27 Mar 2007 20:27:05 -0000 +@@ -33,6 +33,8 @@ + use Bugzilla::Bug; + use Bugzilla::User; + use Bugzilla::Field; ++use Bugzilla::Testopia::TestCaseRun; ++use Bugzilla::Testopia::Util; + + # Shut up misguided -w warnings about "used only once". For some reason, + # "use vars" chokes on me when I try it here. +@@ -494,6 +496,17 @@ + } + $vars->{'bug_list'} = \@bug_list; + ++if ($cgi->param('caserun_id')) { ++ my $tcid = $cgi->param('caserun_id'); ++ detaint_natural($tcid); ++ validate_test_id($tcid, 'case_run'); ++ my $caserun = Bugzilla::Testopia::TestCaseRun->new($tcid); ++ ++ $caserun->attach_bug($id); ++ ++ $vars->{'caserun'} = $caserun; ++} ++ + print $cgi->header(); + $template->process("bug/create/created.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +Index: Bugzilla.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla.pm,v +retrieving revision 1.29.2.2 +diff -u -r1.29.2.2 Bugzilla.pm +--- Bugzilla.pm 8 Aug 2006 20:53:40 -0000 1.29.2.2 ++++ Bugzilla.pm 27 Mar 2007 20:27:04 -0000 +@@ -46,6 +46,7 @@ + use constant SHUTDOWNHTML_EXEMPT => [ + 'editparams.cgi', + 'checksetup.pl', ++ 'tr_install.pl', + ]; + + # Non-cgi scripts that should silently exit. +Index: Bugzilla/Template.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/Template.pm,v +retrieving revision 1.41.2.3 +diff -u -r1.41.2.3 Template.pm +--- Bugzilla/Template.pm 14 Oct 2006 20:30:54 -0000 1.41.2.3 ++++ Bugzilla/Template.pm 27 Mar 2007 20:27:05 -0000 +@@ -499,6 +499,14 @@ + return $var; + }, + ++ # Prevent XSS attacks in WYSIWYG fields. ++ xss => sub{ ++ my ($var) = @_; ++ $var =~ s/(<|<)script/_script/ig; ++ $var =~ s/(<|<)\/script(>|>)/script_/gi; ++ return $var; ++ }, ++ + html_light => \&Bugzilla::Util::html_light_quote, + + # iCalendar contentline filter +Index: Bugzilla/User.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/User.pm,v +retrieving revision 1.101.2.5 +diff -u -r1.101.2.5 User.pm +--- Bugzilla/User.pm 14 Oct 2006 21:07:19 -0000 1.101.2.5 ++++ Bugzilla/User.pm 27 Mar 2007 20:27:05 -0000 +@@ -236,6 +236,16 @@ + return $self->{queries}; + } + ++sub testopia_queries { ++ my $self = shift; ++ my $dbh = Bugzilla->dbh; ++ my $ref = $dbh->selectall_arrayref( ++ "SELECT name, query FROM test_named_queries ++ WHERE userid = ? AND isvisible = 1", ++ {'Slice' =>{}}, $self->id); ++ return $ref; ++} ++ + sub settings { + my ($self) = @_; + +@@ -467,7 +477,7 @@ + my $dbh = Bugzilla->dbh; + my @params = (); + +- my $query = "SELECT id " . ++ my $query = "(SELECT id, products.name AS pname " . + "FROM products " . + "LEFT JOIN group_control_map " . + "ON group_control_map.product_id = products.id "; +@@ -482,13 +492,22 @@ + "WHERE group_id IS NULL "; + + if (Param('useclassification') && $classification_id) { +- $query .= "AND classification_id = ? "; ++ $query .= "AND classification_id = ?) "; + detaint_natural($classification_id); + push(@params, $classification_id); + } +- +- $query .= "ORDER BY name"; +- ++ else { ++ $query .= ") "; ++ } ++ $query .= "UNION (SELECT id, products.name AS pname FROM products ". ++ "INNER JOIN test_plans ON products.id = test_plans.product_id ". ++ "INNER JOIN test_plan_permissions ON test_plan_permissions.plan_id = test_plans.plan_id ". ++ "WHERE test_plan_permissions.userid = ?)"; ++ ++ $query .= "ORDER BY pname "; ++ ++ push @params, $self->id; ++ + my $prod_ids = $dbh->selectcol_arrayref($query, undef, @params); + my @products; + foreach my $prod_id (@$prod_ids) { +@@ -674,7 +693,34 @@ + $group_delete->execute($id, $group, GRANT_REGEXP) if $present; + } + } +- ++ ++ # Now do the same for Testopia test plans. ++ $sth = $dbh->prepare("SELECT test_plan_permissions_regexp.plan_id, ++ user_regexp, test_plan_permissions_regexp.permissions, ++ test_plan_permissions.plan_id ++ FROM test_plan_permissions_regexp ++ LEFT JOIN test_plan_permissions ++ ON test_plan_permissions_regexp.plan_id = test_plan_permissions.plan_id ++ AND test_plan_permissions.userid = ? ++ AND test_plan_permissions.grant_type = ?"); ++ ++ $sth->execute($id, GRANT_REGEXP); ++ my $plan_insert = $dbh->prepare(q{INSERT INTO test_plan_permissions ++ (userid, plan_id, permissions, grant_type) ++ VALUES (?, ?, ?, ?)}); ++ my $plan_delete = $dbh->prepare(q{DELETE FROM test_plan_permissions ++ WHERE userid = ? ++ AND plan_id = ? ++ AND grant_type = ?}); ++ ++ while (my ($planid, $regexp, $perms, $present) = $sth->fetchrow_array()) { ++ if (($regexp ne '') && ($self->{login} =~ m/$regexp/i)) { ++ $plan_insert->execute($id, $planid, $perms, GRANT_REGEXP) unless $present; ++ } else { ++ $plan_delete->execute($id, $planid, GRANT_REGEXP) if $present; ++ } ++ } ++ + $dbh->do(q{UPDATE profiles + SET refreshed_when = ? + WHERE userid=?}, +Index: Bugzilla/DB/Schema.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB/Schema.pm,v +retrieving revision 1.45.2.2 +diff -u -r1.45.2.2 Schema.pm +--- Bugzilla/DB/Schema.pm 19 Jun 2006 18:17:38 -0000 1.45.2.2 ++++ Bugzilla/DB/Schema.pm 27 Mar 2007 20:27:05 -0000 +@@ -1040,6 +1040,557 @@ + ], + }, + ++ # TESTOPIA TABLES ++ # --------------- ++ test_attachments => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ submitter_id => {TYPE => 'INT3', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ filename => {TYPE => 'MEDIUMTEXT'}, ++ creation_ts => {TYPE => 'DATETIME', NOTNULL => 1}, ++ mime_type => {TYPE => 'varchar(100)', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_attachments_submitter_idx => ['submitter_id'], ++ ], ++ }, ++ ++ test_case_attachments => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INT4', NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ case_run_id => {TYPE => 'INT4', UNSIGNED => 1}, ++ ], ++ INDEXES => [ ++ test_case_attachments_primary_idx => ['attachment_id'], ++ attachment_case_id_idx => ['case_id'], ++ attachment_caserun_id_idx => ['case_run_id'], ++ ], ++ }, ++ ++ test_plan_attachments => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INT4', NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ ], ++ INDEXES => [ ++ test_plan_attachments_primary_idx => ['attachment_id'], ++ attachment_plan_id_idx => ['plan_id'], ++ ], ++ }, ++ ++ test_case_categories => { ++ FIELDS => [ ++ category_id => {TYPE => 'SMALLSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ name => {TYPE => 'varchar(240)', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ category_product_id_name_idx => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ category_product_idx => {FIELDS => [qw(category_id product_id)], TYPE => 'UNIQUE'}, ++ category_name_idx_v2 => ['name'], ++ ], ++ }, ++ ++ test_cases => { ++ FIELDS => [ ++ case_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ case_status_id => {TYPE => 'INT1', NOTNULL => 1}, ++ category_id => {TYPE => 'INT2', NOTNULL => 1, UNSIGNED =>1}, ++ priority_id => {TYPE => 'INT2'}, ++ author_id => {TYPE => 'INT3', NOTNULL => 1}, ++ default_tester_id => {TYPE => 'INT3'}, ++ creation_date => {TYPE => 'DATETIME', NOTNULL => 1}, ++ estimated_time => {TYPE => 'TIME'}, ++ isautomated => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '0'}, ++ sortkey => {TYPE => 'INT4'}, ++ script => {TYPE => 'MEDIUMTEXT'}, ++ arguments => {TYPE => 'MEDIUMTEXT'}, ++ summary => {TYPE => 'varchar(255)'}, ++ requirement => {TYPE => 'varchar(255)'}, ++ alias => {TYPE => 'varchar(255)'}, ++ ], ++ INDEXES => [ ++ test_case_category_idx => ['category_id'], ++ test_case_author_idx => ['author_id'], ++ test_case_creation_date_idx => ['creation_date'], ++ test_case_sortkey_idx => ['sortkey'], ++ test_case_shortname_idx => ['alias'], ++ test_case_requirement_idx => ['requirement'], ++ test_case_status_idx => ['case_status_id'], ++ test_case_tester_idx => ['default_tester_id'], ++ ], ++ }, ++ ++ test_case_bugs => { ++ FIELDS => [ ++ bug_id => {TYPE => 'INT3', NOTNULL => 1}, ++ case_run_id => {TYPE => 'INT4', UNSIGNED => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_bugs_bug_id_idx => ['bug_id'], ++ case_bugs_case_id_idx => ['case_id'], ++ case_bugs_case_run_id_idx => ['case_run_id'], ++ ], ++ }, ++ ++ test_case_runs => { ++ FIELDS => [ ++ case_run_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ assignee => {TYPE => 'INT3'}, ++ testedby => {TYPE => 'INT3'}, ++ case_run_status_id => {TYPE => 'INT1', NOTNULL => 1, UNSIGNED => 1}, ++ case_text_version => {TYPE => 'INT3', NOTNULL => 1}, ++ build_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ running_date => {TYPE => 'DATETIME'}, ++ close_date => {TYPE => 'DATETIME'}, ++ notes => {TYPE => 'TEXT'}, ++ iscurrent => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '0'}, ++ sortkey => {TYPE => 'INT4'}, ++ environment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_run_case_id_idx => ['case_id'], ++ case_run_assignee_idx => ['assignee'], ++ case_run_testedby_idx => ['testedby'], ++ case_run_close_date_idx => ['close_date'], ++ case_run_build_env_idx => {FIELDS => [qw(run_id case_id build_id environment_id)], ++ TYPE => 'UNIQUE'}, ++ case_run_status_idx => ['case_run_status_id'], ++ case_run_text_ver_idx => ['case_text_version'], ++ case_run_build_idx_v2 => ['build_id'], ++ case_run_env_idx_v2 => ['environment_id'], ++ ], ++ }, ++ ++ test_case_texts => { ++ FIELDS => [ ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL =>1}, ++ case_text_version => {TYPE => 'INT3', NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ creation_ts => {TYPE => 'DATETIME', NOTNULL => 1}, ++ action => {TYPE => 'MEDIUMTEXT'}, ++ effect => {TYPE => 'MEDIUMTEXT'}, ++ setup => {TYPE => 'MEDIUMTEXT'}, ++ breakdown => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ case_versions_idx => {FIELDS => [qw(case_id case_text_version)], ++ TYPE => 'UNIQUE'}, ++ case_versions_who_idx => ['who'], ++ case_versions_creation_ts_idx => ['creation_ts'], ++ ], ++ }, ++ ++ test_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ tag_name => {TYPE => 'varchar(255)', NOTNULL => 1}, ++ ], ++ INDEXES => [ test_tag_name_idx_v2 => [qw(tag_name)] ], ++ }, ++ ++ test_case_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_tags_primary_idx => {FIELDS => [qw(tag_id case_id userid)], TYPE => 'UNIQUE'}, ++ case_tags_secondary_idx => {FIELDS => [qw(tag_id case_id)], TYPE => 'UNIQUE'}, ++ case_tags_case_id_idx_v3 => [qw(case_id)], ++ case_tags_userid_idx => [qw(userid)], ++ ], ++ }, ++ ++ test_run_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ run_tags_primary_idx => {FIELDS => [qw(tag_id run_id userid)], TYPE => 'UNIQUE'}, ++ run_tags_secondary_idx => {FIELDS => [qw(tag_id run_id)], TYPE => 'UNIQUE'}, ++ run_tags_run_id_idx => [qw(run_id)], ++ run_tags_userid_idx => [qw(userid)], ++ ], ++ }, ++ ++ test_plan_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ plan_tags_primary_idx => {FIELDS => [qw(tag_id plan_id userid)], TYPE => 'UNIQUE'}, ++ plan_tags_secondary_idx => {FIELDS => [qw(tag_id plan_id)], TYPE => 'UNIQUE'}, ++ plan_tags_plan_id_idx => [qw(plan_id)], ++ plan_tags_userid_idx => [qw(userid)], ++ ], ++ }, ++ ++ test_plans => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ author_id => {TYPE => 'INT3', NOTNULL => 1}, ++ type_id => {TYPE => 'INT1', NOTNULL => 1, UNSIGNED => 1}, ++ default_product_version => {TYPE => 'MEDIUMTEXT', NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)', NOTNULL => 1}, ++ creation_date => {TYPE => 'DATETIME', NOTNULL => 1}, ++ isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, ++ ], ++ INDEXES => [ ++ plan_product_plan_id_idx => [qw(product_id plan_id)], ++ plan_author_idx => ['author_id'], ++ plan_type_idx => ['type_id'], ++ plan_isactive_idx => ['isactive'], ++ plan_name_idx => ['name'], ++ ], ++ }, ++ ++ test_plan_permissions => { ++ FIELDS => [ ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ permissions => {TYPE => 'INT1', NOTNULL => 1}, ++ grant_type => {TYPE => 'INT1', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ testers_plan_user_idx => {FIELDS => [qw(userid plan_id grant_type)], TYPE => 'UNIQUE'}, ++ testers_plan_user_plan_idx => ['plan_id'], ++ testers_plan_grant_idx => ['grant_type'], ++ ], ++ }, ++ ++ test_plan_permissions_regexp => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ user_regexp => {TYPE => 'TEXT', NOTNULL => 1}, ++ permissions => {TYPE => 'INT1', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ testers_plan_regexp_idx => {FIELDS => [qw(plan_id)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ ++ test_plan_texts => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ plan_text_version => {TYPE => 'INT4', NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ creation_ts => {TYPE => 'DATETIME', NOTNULL => 1}, ++ plan_text => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ test_plan_text_version_idx => [qw(plan_id plan_text_version)], ++ test_plan_text_who_idx => ['who'], ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_plan_types => { ++ FIELDS => [ ++ type_id => {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(64)', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ }, ++ ++ test_runs => { ++ FIELDS => [ ++ run_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ environment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ product_version => {TYPE => 'MEDIUMTEXT'}, ++ build_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ plan_text_version => {TYPE => 'INT4', NOTNULL => 1}, ++ manager_id => {TYPE => 'INT3', NOTNULL => 1}, ++ default_tester_id => {TYPE => 'INT3'}, ++ start_date => {TYPE => 'DATETIME', NOTNULL => 1}, ++ stop_date => {TYPE => 'DATETIME'}, ++ summary => {TYPE => 'TINYTEXT', NOTNULL => 1}, ++ notes => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ test_run_plan_id_run_id_idx => [qw(plan_id run_id)], ++ test_run_manager_idx => ['manager_id'], ++ test_run_start_date_idx => ['start_date'], ++ test_run_stop_date_idx => ['stop_date'], ++ test_run_env_idx => ['environment_id'], ++ test_run_build_idx => ['build_id'], ++ test_run_plan_ver_idx => ['plan_text_version'], ++ test_run_tester_idx => ['default_tester_id'], ++ test_runs_summary_idx => {FIELDS => ['summary'], ++ TYPE => 'FULLTEXT'}, ++ ], ++ }, ++ ++ test_case_plans => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_case_plans_primary_idx => {FIELDS => [qw(plan_id case_id)], TYPE => 'UNIQUE'}, ++ test_case_plans_case_idx => [qw(case_id)], ++ ], ++ }, ++ ++ test_case_activity => { ++ FIELDS => [ ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ fieldid => {TYPE => 'INT2', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ changed => {TYPE => 'DATETIME', NOTNULL => 1}, ++ oldvalue => {TYPE => 'MEDIUMTEXT'}, ++ newvalue => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ case_activity_case_id_idx => ['case_id'], ++ case_activity_who_idx => ['who'], ++ case_activity_when_idx => ['changed'], ++ case_activity_field_idx => ['fieldid'], ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_fielddefs => { ++ FIELDS => [ ++ fieldid => {TYPE => 'SMALLSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(100)', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ table_name => {TYPE => 'varchar(100)', NOTNULL => 1}, ++ ], ++ }, ++ ++ test_plan_activity => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ fieldid => {TYPE => 'INT2', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ changed => {TYPE => 'DATETIME', NOTNULL => 1}, ++ oldvalue => {TYPE => 'MEDIUMTEXT'}, ++ newvalue => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ plan_activity_primary_idx => ['plan_id'], ++ plan_activity_field_idx => ['fieldid'], ++ plan_activity_who_idx => ['who'], ++ plan_activity_changed_idx => ['changed'], ++ ], ++ }, ++ ++ test_case_components => { ++ FIELDS => [ ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ component_id => {TYPE => 'INT2', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ components_case_id_idx => {FIELDS => [qw(case_id component_id)], TYPE => 'UNIQUE'}, ++ components_component_id_idx => ['component_id'], ++ ], ++ }, ++ ++ test_run_activity => { ++ FIELDS => [ ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ fieldid => {TYPE => 'INT2', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ changed => {TYPE => 'DATETIME', NOTNULL => 1}, ++ oldvalue => {TYPE => 'MEDIUMTEXT'}, ++ newvalue => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ run_activity_run_id_idx => ['run_id'], ++ run_activity_field_idx => ['fieldid'], ++ run_activity_who_idx => ['who'], ++ run_activity_when_idx => ['changed'], ++ ], ++ }, ++ ++ test_run_cc => { ++ FIELDS => [ ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_run_cc_primary_idx => {FIELDS => [qw(run_id who)], TYPE => 'UNIQUE'}, ++ test_run_cc_who_idx => [qw(who)], ++ ], ++ }, ++ ++ test_email_settings => { ++ FIELDS => [ ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ eventid => {TYPE => 'INT1', UNSIGNED => 1, NOTNULL => 1}, ++ relationship_id => {TYPE => 'INT1', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_email_setting_user_id_idx => ++ {FIELDS => [qw(userid relationship_id eventid)], ++ TYPE => 'UNIQUE'}, ++ ], ++ }, ++ ++ test_events => { ++ FIELDS => [ ++ eventid => {TYPE => 'INT1', UNSIGNED => 1, PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(50)'}, ++ ], ++ INDEXES => [ ++ test_event_name_idx => ['name'], ++ ], ++ }, ++ ++ test_relationships => { ++ FIELDS => [ ++ relationship_id => {TYPE => 'INT1', UNSIGNED => 1, PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(50)'}, ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_case_run_status => { ++ FIELDS => [ ++ case_run_status_id => {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(20)'}, ++ sortkey => {TYPE => 'INT4'}, ++ description => {TYPE => 'TEXT'}, ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_case_status => { ++ FIELDS => [ ++ case_status_id => {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)', NOTNULL => 1}, ++ description => {TYPE => 'TEXT'}, ++ ], ++ }, ++ ++ test_case_dependencies => { ++ FIELDS => [ ++ dependson => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ blocked => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_dependencies_primary_idx => {FIELDS => [qw(dependson blocked)], TYPE => 'UNIQUE'}, ++ case_dependencies_blocked_idx => ['blocked'], ++ ], ++ }, ++ ++ test_environments => { ++ FIELDS => [ ++ environment_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, ++ ], ++ INDEXES => [ ++ test_environments_key1 => {FIELDS => [qw(environment_id product_id)], TYPE => 'UNIQUE'}, ++ test_environments_key2 => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ environment_name_idx_v2 => ['name'], ++ ], ++ }, ++ ++ test_builds => { ++ FIELDS => [ ++ build_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ milestone => {TYPE => 'varchar(20)'}, ++ name => {TYPE => 'varchar(255)'}, ++ description => {TYPE => 'TEXT'}, ++ isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, ++ ], ++ INDEXES => [ ++ build_name_idx => ['name'], ++ build_milestone_idx => ['milestone'], ++ build_product_id_name_idx => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ build_prod_idx => {FIELDS => [qw(build_id product_id)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ ++ test_attachment_data => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ contents => {TYPE => 'LONGBLOB'}, ++ ], ++ INDEXES => [ ++ test_attachment_data_primary_idx => ['attachment_id'], ++ ], ++ }, ++ ++ test_named_queries => { ++ FIELDS => [ ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ name => {TYPE => 'varchar(64)', NOTNULL => 1}, ++ isvisible => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 1}, ++ query => {TYPE => 'MEDIUMTEXT', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_namedquery_primary_idx => {FIELDS => [qw(userid name)], TYPE => 'UNIQUE'}, ++ test_namedquery_name_idx => ['name'], ++ ], ++ }, ++ ++ test_environment_map => { ++ FIELDS => [ ++ environment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ property_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ element_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ value_selected => {TYPE => 'TINYTEXT'}, ++ ], ++ INDEXES => [ ++ env_map_env_element_idx => [qw(environment_id element_id)], ++ env_map_property_idx => [qw(environment_id property_id)], ++ test_environment_map_key3 => {FIELDS => [qw(environment_id element_id property_id)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ test_environment_element => { ++ FIELDS => [ ++ element_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ env_category_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ parent_id => {TYPE => 'INT4', UNSIGNED => 1}, ++ isprivate => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 0}, ++ ], ++ INDEXES => [ ++ test_environment_element_key1 => {FIELDS => [qw(element_id env_category_id)], TYPE => 'UNIQUE'}, ++ test_environment_element_key2 => {FIELDS => [qw(env_category_id name)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ test_environment_category => { ++ FIELDS => [ ++ env_category_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ ], ++ INDEXES => [ ++ test_environment_category_key1 => {FIELDS => [qw(env_category_id product_id)], TYPE => 'UNIQUE'}, ++ test_environment_category_key2 => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ test_environment_property => { ++ FIELDS => [ ++ property_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ element_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ validexp => {TYPE => 'TEXT'}, ++ ], ++ INDEXES => [ ++ test_environment_property_key1 => {FIELDS => [qw(property_id element_id)], TYPE => 'UNIQUE'}, ++ test_environment_property_key2 => {FIELDS => [qw(element_id name)], TYPE => 'UNIQUE'}, ++ ], ++ }, + }; + #-------------------------------------------------------------------------- + +Index: Bugzilla/DB/Schema/Mysql.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB/Schema/Mysql.pm,v +retrieving revision 1.12.2.1 +diff -u -r1.12.2.1 Mysql.pm +--- Bugzilla/DB/Schema/Mysql.pm 19 Jun 2006 14:57:14 -0000 1.12.2.1 ++++ Bugzilla/DB/Schema/Mysql.pm 27 Mar 2007 20:27:05 -0000 +@@ -103,9 +103,10 @@ + INT3 => 'mediumint', + INT4 => 'integer', + +- SMALLSERIAL => 'smallint auto_increment', +- MEDIUMSERIAL => 'mediumint auto_increment', +- INTSERIAL => 'integer auto_increment', ++ TINYSERIAL => 'tinyint unsigned auto_increment', ++ SMALLSERIAL => 'smallint unsigned auto_increment', ++ MEDIUMSERIAL => 'mediumint unsigned auto_increment', ++ INTSERIAL => 'integer unsigned auto_increment', + + TINYTEXT => 'tinytext', + MEDIUMTEXT => 'mediumtext', +@@ -245,7 +246,7 @@ + if (defined $column_info->{COLUMN_DEF}) { + # The defaults that MySQL inputs automatically are usually + # something that would be considered "false" by perl, either +- # a 0 or an empty string. (Except for datetime and decimal ++ # a 0 or an empty string. (Except for ddatetime and decimal + # fields, which have their own special auto-defaults.) + # + # Here's how we handle this: If it exists in the schema +Index: Bugzilla/DB/Schema/Pg.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB/Schema/Pg.pm,v +retrieving revision 1.9 +diff -u -r1.9 Pg.pm +--- Bugzilla/DB/Schema/Pg.pm 15 Jun 2005 03:54:59 -0000 1.9 ++++ Bugzilla/DB/Schema/Pg.pm 27 Mar 2007 20:27:05 -0000 +@@ -69,6 +69,7 @@ + INT3 => 'integer', + INT4 => 'integer', + ++ TINYSERIAL => 'serial unique', + SMALLSERIAL => 'serial unique', + MEDIUMSERIAL => 'serial unique', + INTSERIAL => 'serial unique', diff --git a/testopia/patch-2.22.2 b/testopia/patch-2.22.2 new file mode 100644 index 0000000..1d44029 --- /dev/null +++ b/testopia/patch-2.22.2 @@ -0,0 +1,853 @@ +Index: Bugzilla/DB/Schema.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB/Schema.pm,v +retrieving revision 1.45.2.3 +diff -u -r1.45.2.3 Schema.pm +--- Bugzilla/DB/Schema.pm 20 Nov 2006 04:36:25 -0000 1.45.2.3 ++++ Bugzilla/DB/Schema.pm 27 Mar 2007 20:19:50 -0000 +@@ -1040,6 +1040,557 @@ + ], + }, + ++ # TESTOPIA TABLES ++ # --------------- ++ test_attachments => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ submitter_id => {TYPE => 'INT3', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ filename => {TYPE => 'MEDIUMTEXT'}, ++ creation_ts => {TYPE => 'DATETIME', NOTNULL => 1}, ++ mime_type => {TYPE => 'varchar(100)', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_attachments_submitter_idx => ['submitter_id'], ++ ], ++ }, ++ ++ test_case_attachments => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INT4', NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ case_run_id => {TYPE => 'INT4', UNSIGNED => 1}, ++ ], ++ INDEXES => [ ++ test_case_attachments_primary_idx => ['attachment_id'], ++ attachment_case_id_idx => ['case_id'], ++ attachment_caserun_id_idx => ['case_run_id'], ++ ], ++ }, ++ ++ test_plan_attachments => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INT4', NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ ], ++ INDEXES => [ ++ test_plan_attachments_primary_idx => ['attachment_id'], ++ attachment_plan_id_idx => ['plan_id'], ++ ], ++ }, ++ ++ test_case_categories => { ++ FIELDS => [ ++ category_id => {TYPE => 'SMALLSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ name => {TYPE => 'varchar(240)', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ category_product_id_name_idx => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ category_product_idx => {FIELDS => [qw(category_id product_id)], TYPE => 'UNIQUE'}, ++ category_name_idx_v2 => ['name'], ++ ], ++ }, ++ ++ test_cases => { ++ FIELDS => [ ++ case_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ case_status_id => {TYPE => 'INT1', NOTNULL => 1}, ++ category_id => {TYPE => 'INT2', NOTNULL => 1, UNSIGNED =>1}, ++ priority_id => {TYPE => 'INT2'}, ++ author_id => {TYPE => 'INT3', NOTNULL => 1}, ++ default_tester_id => {TYPE => 'INT3'}, ++ creation_date => {TYPE => 'DATETIME', NOTNULL => 1}, ++ estimated_time => {TYPE => 'TIME'}, ++ isautomated => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '0'}, ++ sortkey => {TYPE => 'INT4'}, ++ script => {TYPE => 'MEDIUMTEXT'}, ++ arguments => {TYPE => 'MEDIUMTEXT'}, ++ summary => {TYPE => 'varchar(255)'}, ++ requirement => {TYPE => 'varchar(255)'}, ++ alias => {TYPE => 'varchar(255)'}, ++ ], ++ INDEXES => [ ++ test_case_category_idx => ['category_id'], ++ test_case_author_idx => ['author_id'], ++ test_case_creation_date_idx => ['creation_date'], ++ test_case_sortkey_idx => ['sortkey'], ++ test_case_shortname_idx => ['alias'], ++ test_case_requirement_idx => ['requirement'], ++ test_case_status_idx => ['case_status_id'], ++ test_case_tester_idx => ['default_tester_id'], ++ ], ++ }, ++ ++ test_case_bugs => { ++ FIELDS => [ ++ bug_id => {TYPE => 'INT3', NOTNULL => 1}, ++ case_run_id => {TYPE => 'INT4', UNSIGNED => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_bugs_bug_id_idx => ['bug_id'], ++ case_bugs_case_id_idx => ['case_id'], ++ case_bugs_case_run_id_idx => ['case_run_id'], ++ ], ++ }, ++ ++ test_case_runs => { ++ FIELDS => [ ++ case_run_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ assignee => {TYPE => 'INT3'}, ++ testedby => {TYPE => 'INT3'}, ++ case_run_status_id => {TYPE => 'INT1', NOTNULL => 1, UNSIGNED => 1}, ++ case_text_version => {TYPE => 'INT3', NOTNULL => 1}, ++ build_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ running_date => {TYPE => 'DATETIME'}, ++ close_date => {TYPE => 'DATETIME'}, ++ notes => {TYPE => 'TEXT'}, ++ iscurrent => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '0'}, ++ sortkey => {TYPE => 'INT4'}, ++ environment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_run_case_id_idx => ['case_id'], ++ case_run_assignee_idx => ['assignee'], ++ case_run_testedby_idx => ['testedby'], ++ case_run_close_date_idx => ['close_date'], ++ case_run_build_env_idx => {FIELDS => [qw(run_id case_id build_id environment_id)], ++ TYPE => 'UNIQUE'}, ++ case_run_status_idx => ['case_run_status_id'], ++ case_run_text_ver_idx => ['case_text_version'], ++ case_run_build_idx_v2 => ['build_id'], ++ case_run_env_idx_v2 => ['environment_id'], ++ ], ++ }, ++ ++ test_case_texts => { ++ FIELDS => [ ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL =>1}, ++ case_text_version => {TYPE => 'INT3', NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ creation_ts => {TYPE => 'DATETIME', NOTNULL => 1}, ++ action => {TYPE => 'MEDIUMTEXT'}, ++ effect => {TYPE => 'MEDIUMTEXT'}, ++ setup => {TYPE => 'MEDIUMTEXT'}, ++ breakdown => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ case_versions_idx => {FIELDS => [qw(case_id case_text_version)], ++ TYPE => 'UNIQUE'}, ++ case_versions_who_idx => ['who'], ++ case_versions_creation_ts_idx => ['creation_ts'], ++ ], ++ }, ++ ++ test_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ tag_name => {TYPE => 'varchar(255)', NOTNULL => 1}, ++ ], ++ INDEXES => [ test_tag_name_idx_v2 => [qw(tag_name)] ], ++ }, ++ ++ test_case_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_tags_primary_idx => {FIELDS => [qw(tag_id case_id userid)], TYPE => 'UNIQUE'}, ++ case_tags_secondary_idx => {FIELDS => [qw(tag_id case_id)], TYPE => 'UNIQUE'}, ++ case_tags_case_id_idx_v3 => [qw(case_id)], ++ case_tags_userid_idx => [qw(userid)], ++ ], ++ }, ++ ++ test_run_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ run_tags_primary_idx => {FIELDS => [qw(tag_id run_id userid)], TYPE => 'UNIQUE'}, ++ run_tags_secondary_idx => {FIELDS => [qw(tag_id run_id)], TYPE => 'UNIQUE'}, ++ run_tags_run_id_idx => [qw(run_id)], ++ run_tags_userid_idx => [qw(userid)], ++ ], ++ }, ++ ++ test_plan_tags => { ++ FIELDS => [ ++ tag_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ plan_tags_primary_idx => {FIELDS => [qw(tag_id plan_id userid)], TYPE => 'UNIQUE'}, ++ plan_tags_secondary_idx => {FIELDS => [qw(tag_id plan_id)], TYPE => 'UNIQUE'}, ++ plan_tags_plan_id_idx => [qw(plan_id)], ++ plan_tags_userid_idx => [qw(userid)], ++ ], ++ }, ++ ++ test_plans => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ author_id => {TYPE => 'INT3', NOTNULL => 1}, ++ type_id => {TYPE => 'INT1', NOTNULL => 1, UNSIGNED => 1}, ++ default_product_version => {TYPE => 'MEDIUMTEXT', NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)', NOTNULL => 1}, ++ creation_date => {TYPE => 'DATETIME', NOTNULL => 1}, ++ isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, ++ ], ++ INDEXES => [ ++ plan_product_plan_id_idx => [qw(product_id plan_id)], ++ plan_author_idx => ['author_id'], ++ plan_type_idx => ['type_id'], ++ plan_isactive_idx => ['isactive'], ++ plan_name_idx => ['name'], ++ ], ++ }, ++ ++ test_plan_permissions => { ++ FIELDS => [ ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ permissions => {TYPE => 'INT1', NOTNULL => 1}, ++ grant_type => {TYPE => 'INT1', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ testers_plan_user_idx => {FIELDS => [qw(userid plan_id grant_type)], TYPE => 'UNIQUE'}, ++ testers_plan_user_plan_idx => ['plan_id'], ++ testers_plan_grant_idx => ['grant_type'], ++ ], ++ }, ++ ++ test_plan_permissions_regexp => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', NOTNULL => 1, UNSIGNED => 1}, ++ user_regexp => {TYPE => 'TEXT', NOTNULL => 1}, ++ permissions => {TYPE => 'INT1', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ testers_plan_regexp_idx => {FIELDS => [qw(plan_id)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ ++ test_plan_texts => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ plan_text_version => {TYPE => 'INT4', NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ creation_ts => {TYPE => 'DATETIME', NOTNULL => 1}, ++ plan_text => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ test_plan_text_version_idx => [qw(plan_id plan_text_version)], ++ test_plan_text_who_idx => ['who'], ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_plan_types => { ++ FIELDS => [ ++ type_id => {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(64)', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ }, ++ ++ test_runs => { ++ FIELDS => [ ++ run_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ environment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ product_version => {TYPE => 'MEDIUMTEXT'}, ++ build_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ plan_text_version => {TYPE => 'INT4', NOTNULL => 1}, ++ manager_id => {TYPE => 'INT3', NOTNULL => 1}, ++ default_tester_id => {TYPE => 'INT3'}, ++ start_date => {TYPE => 'DATETIME', NOTNULL => 1}, ++ stop_date => {TYPE => 'DATETIME'}, ++ summary => {TYPE => 'TINYTEXT', NOTNULL => 1}, ++ notes => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ test_run_plan_id_run_id_idx => [qw(plan_id run_id)], ++ test_run_manager_idx => ['manager_id'], ++ test_run_start_date_idx => ['start_date'], ++ test_run_stop_date_idx => ['stop_date'], ++ test_run_env_idx => ['environment_id'], ++ test_run_build_idx => ['build_id'], ++ test_run_plan_ver_idx => ['plan_text_version'], ++ test_run_tester_idx => ['default_tester_id'], ++ test_runs_summary_idx => {FIELDS => ['summary'], ++ TYPE => 'FULLTEXT'}, ++ ], ++ }, ++ ++ test_case_plans => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_case_plans_primary_idx => {FIELDS => [qw(plan_id case_id)], TYPE => 'UNIQUE'}, ++ test_case_plans_case_idx => [qw(case_id)], ++ ], ++ }, ++ ++ test_case_activity => { ++ FIELDS => [ ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ fieldid => {TYPE => 'INT2', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ changed => {TYPE => 'DATETIME', NOTNULL => 1}, ++ oldvalue => {TYPE => 'MEDIUMTEXT'}, ++ newvalue => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ case_activity_case_id_idx => ['case_id'], ++ case_activity_who_idx => ['who'], ++ case_activity_when_idx => ['changed'], ++ case_activity_field_idx => ['fieldid'], ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_fielddefs => { ++ FIELDS => [ ++ fieldid => {TYPE => 'SMALLSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(100)', NOTNULL => 1}, ++ description => {TYPE => 'MEDIUMTEXT'}, ++ table_name => {TYPE => 'varchar(100)', NOTNULL => 1}, ++ ], ++ }, ++ ++ test_plan_activity => { ++ FIELDS => [ ++ plan_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ fieldid => {TYPE => 'INT2', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ changed => {TYPE => 'DATETIME', NOTNULL => 1}, ++ oldvalue => {TYPE => 'MEDIUMTEXT'}, ++ newvalue => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ plan_activity_primary_idx => ['plan_id'], ++ plan_activity_field_idx => ['fieldid'], ++ plan_activity_who_idx => ['who'], ++ plan_activity_changed_idx => ['changed'], ++ ], ++ }, ++ ++ test_case_components => { ++ FIELDS => [ ++ case_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ component_id => {TYPE => 'INT2', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ components_case_id_idx => {FIELDS => [qw(case_id component_id)], TYPE => 'UNIQUE'}, ++ components_component_id_idx => ['component_id'], ++ ], ++ }, ++ ++ test_run_activity => { ++ FIELDS => [ ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ fieldid => {TYPE => 'INT2', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ changed => {TYPE => 'DATETIME', NOTNULL => 1}, ++ oldvalue => {TYPE => 'MEDIUMTEXT'}, ++ newvalue => {TYPE => 'MEDIUMTEXT'}, ++ ], ++ INDEXES => [ ++ run_activity_run_id_idx => ['run_id'], ++ run_activity_field_idx => ['fieldid'], ++ run_activity_who_idx => ['who'], ++ run_activity_when_idx => ['changed'], ++ ], ++ }, ++ ++ test_run_cc => { ++ FIELDS => [ ++ run_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ who => {TYPE => 'INT3', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_run_cc_primary_idx => {FIELDS => [qw(run_id who)], TYPE => 'UNIQUE'}, ++ test_run_cc_who_idx => [qw(who)], ++ ], ++ }, ++ ++ test_email_settings => { ++ FIELDS => [ ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ eventid => {TYPE => 'INT1', UNSIGNED => 1, NOTNULL => 1}, ++ relationship_id => {TYPE => 'INT1', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_email_setting_user_id_idx => ++ {FIELDS => [qw(userid relationship_id eventid)], ++ TYPE => 'UNIQUE'}, ++ ], ++ }, ++ ++ test_events => { ++ FIELDS => [ ++ eventid => {TYPE => 'INT1', UNSIGNED => 1, PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(50)'}, ++ ], ++ INDEXES => [ ++ test_event_name_idx => ['name'], ++ ], ++ }, ++ ++ test_relationships => { ++ FIELDS => [ ++ relationship_id => {TYPE => 'INT1', UNSIGNED => 1, PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(50)'}, ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_case_run_status => { ++ FIELDS => [ ++ case_run_status_id => {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(20)'}, ++ sortkey => {TYPE => 'INT4'}, ++ description => {TYPE => 'TEXT'}, ++ ], ++ }, ++ ++ # Tiny table -- don't add keys besides primary key. ++ test_case_status => { ++ FIELDS => [ ++ case_status_id => {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)', NOTNULL => 1}, ++ description => {TYPE => 'TEXT'}, ++ ], ++ }, ++ ++ test_case_dependencies => { ++ FIELDS => [ ++ dependson => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ blocked => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ case_dependencies_primary_idx => {FIELDS => [qw(dependson blocked)], TYPE => 'UNIQUE'}, ++ case_dependencies_blocked_idx => ['blocked'], ++ ], ++ }, ++ ++ test_environments => { ++ FIELDS => [ ++ environment_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, ++ ], ++ INDEXES => [ ++ test_environments_key1 => {FIELDS => [qw(environment_id product_id)], TYPE => 'UNIQUE'}, ++ test_environments_key2 => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ environment_name_idx_v2 => ['name'], ++ ], ++ }, ++ ++ test_builds => { ++ FIELDS => [ ++ build_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ milestone => {TYPE => 'varchar(20)'}, ++ name => {TYPE => 'varchar(255)'}, ++ description => {TYPE => 'TEXT'}, ++ isactive => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, ++ ], ++ INDEXES => [ ++ build_name_idx => ['name'], ++ build_milestone_idx => ['milestone'], ++ build_product_id_name_idx => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ build_prod_idx => {FIELDS => [qw(build_id product_id)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ ++ test_attachment_data => { ++ FIELDS => [ ++ attachment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ contents => {TYPE => 'LONGBLOB'}, ++ ], ++ INDEXES => [ ++ test_attachment_data_primary_idx => ['attachment_id'], ++ ], ++ }, ++ ++ test_named_queries => { ++ FIELDS => [ ++ userid => {TYPE => 'INT3', NOTNULL => 1}, ++ name => {TYPE => 'varchar(64)', NOTNULL => 1}, ++ isvisible => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 1}, ++ query => {TYPE => 'MEDIUMTEXT', NOTNULL => 1}, ++ ], ++ INDEXES => [ ++ test_namedquery_primary_idx => {FIELDS => [qw(userid name)], TYPE => 'UNIQUE'}, ++ test_namedquery_name_idx => ['name'], ++ ], ++ }, ++ ++ test_environment_map => { ++ FIELDS => [ ++ environment_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ property_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ element_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ value_selected => {TYPE => 'TINYTEXT'}, ++ ], ++ INDEXES => [ ++ env_map_env_element_idx => [qw(environment_id element_id)], ++ env_map_property_idx => [qw(environment_id property_id)], ++ test_environment_map_key3 => {FIELDS => [qw(environment_id element_id property_id)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ test_environment_element => { ++ FIELDS => [ ++ element_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ env_category_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ parent_id => {TYPE => 'INT4', UNSIGNED => 1}, ++ isprivate => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 0}, ++ ], ++ INDEXES => [ ++ test_environment_element_key1 => {FIELDS => [qw(element_id env_category_id)], TYPE => 'UNIQUE'}, ++ test_environment_element_key2 => {FIELDS => [qw(env_category_id name)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ test_environment_category => { ++ FIELDS => [ ++ env_category_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ product_id => {TYPE => 'INT2', NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ ], ++ INDEXES => [ ++ test_environment_category_key1 => {FIELDS => [qw(env_category_id product_id)], TYPE => 'UNIQUE'}, ++ test_environment_category_key2 => {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}, ++ ], ++ }, ++ test_environment_property => { ++ FIELDS => [ ++ property_id => {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}, ++ element_id => {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, ++ name => {TYPE => 'varchar(255)'}, ++ validexp => {TYPE => 'TEXT'}, ++ ], ++ INDEXES => [ ++ test_environment_property_key1 => {FIELDS => [qw(property_id element_id)], TYPE => 'UNIQUE'}, ++ test_environment_property_key2 => {FIELDS => [qw(element_id name)], TYPE => 'UNIQUE'}, ++ ], ++ }, + }; + #-------------------------------------------------------------------------- + +Index: enter_bug.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/enter_bug.cgi,v +retrieving revision 1.126.2.2 +diff -u -r1.126.2.2 enter_bug.cgi +--- enter_bug.cgi 21 Aug 2006 19:26:06 -0000 1.126.2.2 ++++ enter_bug.cgi 27 Mar 2007 20:19:50 -0000 +@@ -591,6 +591,8 @@ + + $vars->{'default'} = \%default; + ++$vars->{'caserun_id'} = $cgi->param('caserun_id'); ++ + my $format = $template->get_format("bug/create/create", + scalar $cgi->param('format'), + scalar $cgi->param('ctype')); +Index: checksetup.pl +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/checksetup.pl,v +retrieving revision 1.469.2.17 +diff -u -r1.469.2.17 checksetup.pl +--- checksetup.pl 25 Jan 2007 15:45:38 -0000 1.469.2.17 ++++ checksetup.pl 27 Mar 2007 20:19:49 -0000 +@@ -314,7 +314,7 @@ + }, + { + name => 'Template', +- version => '2.10' ++ version => '2.12' + }, + { + name => 'Text::Wrap', +@@ -378,6 +378,10 @@ + } + } + ++print "\nThe following Perl modules are Required for Testopia:\n" unless $silent; ++$missing{'Text::Diff'} = '0.35' unless have_vers("Text::Diff","0.35"); ++$missing{'JSON'} = '1.07' unless have_vers("JSON","1.07"); ++ + print "\nThe following Perl modules are optional:\n" unless $silent; + my $gd = have_vers("GD","1.20"); + my $template_gd = have_vers('Template::Plugin::GD::Image', 0); +@@ -1336,7 +1340,7 @@ + # These are the files which need to be marked executable + my @executable_files = ('whineatnews.pl', 'collectstats.pl', + 'checksetup.pl', 'importxml.pl', 'runtests.pl', 'testserver.pl', +- 'whine.pl'); ++ 'whine.pl', 'tr_install.pl', 'tr_importxml.pl'); + + # tell me if a file is executable. All CGI files and those in @executable_files + # are executable +Index: Bugzilla.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla.pm,v +retrieving revision 1.29.2.2 +diff -u -r1.29.2.2 Bugzilla.pm +--- Bugzilla.pm 8 Aug 2006 20:53:40 -0000 1.29.2.2 ++++ Bugzilla.pm 27 Mar 2007 20:19:49 -0000 +@@ -46,6 +46,7 @@ + use constant SHUTDOWNHTML_EXEMPT => [ + 'editparams.cgi', + 'checksetup.pl', ++ 'tr_install.pl', + ]; + + # Non-cgi scripts that should silently exit. +Index: editusers.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/editusers.cgi,v +retrieving revision 1.113.2.1 +diff -u -r1.113.2.1 editusers.cgi +--- editusers.cgi 14 Oct 2006 22:05:54 -0000 1.113.2.1 ++++ editusers.cgi 27 Mar 2007 20:19:49 -0000 +@@ -190,6 +190,8 @@ + # Lock tables during the check+creation session. + $dbh->bz_lock_tables('profiles WRITE', + 'profiles_activity WRITE', ++ 'test_plan_permissions WRITE', ++ 'test_plan_permissions_regexp READ', + 'groups READ', + 'user_group_map WRITE', + 'email_setting WRITE', +@@ -242,6 +244,7 @@ + # Lock tables during the check+update session. + $dbh->bz_lock_tables('profiles WRITE', + 'profiles_activity WRITE', ++ 'test_plan_permissions WRITE', + 'fielddefs READ', + 'namedqueries READ', + 'whine_queries READ', +Index: post_bug.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/post_bug.cgi,v +retrieving revision 1.135.2.5 +diff -u -r1.135.2.5 post_bug.cgi +--- post_bug.cgi 28 Jan 2007 21:20:45 -0000 1.135.2.5 ++++ post_bug.cgi 27 Mar 2007 20:19:50 -0000 +@@ -33,6 +33,8 @@ + use Bugzilla::Bug; + use Bugzilla::User; + use Bugzilla::Field; ++use Bugzilla::Testopia::TestCaseRun; ++use Bugzilla::Testopia::Util; + + # Shut up misguided -w warnings about "used only once". For some reason, + # "use vars" chokes on me when I try it here. +@@ -506,6 +508,17 @@ + } + $vars->{'bug_list'} = \@bug_list; + ++if ($cgi->param('caserun_id')) { ++ my $tcid = $cgi->param('caserun_id'); ++ detaint_natural($tcid); ++ validate_test_id($tcid, 'case_run'); ++ my $caserun = Bugzilla::Testopia::TestCaseRun->new($tcid); ++ ++ $caserun->attach_bug($id); ++ ++ $vars->{'caserun'} = $caserun; ++} ++ + print $cgi->header(); + $template->process("bug/create/created.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +Index: Bugzilla/Template.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/Template.pm,v +retrieving revision 1.41.2.3 +diff -u -r1.41.2.3 Template.pm +--- Bugzilla/Template.pm 14 Oct 2006 20:30:54 -0000 1.41.2.3 ++++ Bugzilla/Template.pm 27 Mar 2007 20:19:50 -0000 +@@ -499,6 +499,14 @@ + return $var; + }, + ++ # Prevent XSS attacks in WYSIWYG fields. ++ xss => sub{ ++ my ($var) = @_; ++ $var =~ s/(<|<)script/_script/ig; ++ $var =~ s/(<|<)\/script(>|>)/script_/gi; ++ return $var; ++ }, ++ + html_light => \&Bugzilla::Util::html_light_quote, + + # iCalendar contentline filter +Index: Bugzilla/User.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/User.pm,v +retrieving revision 1.101.2.5 +diff -u -r1.101.2.5 User.pm +--- Bugzilla/User.pm 14 Oct 2006 21:07:19 -0000 1.101.2.5 ++++ Bugzilla/User.pm 27 Mar 2007 20:19:50 -0000 +@@ -236,6 +236,16 @@ + return $self->{queries}; + } + ++sub testopia_queries { ++ my $self = shift; ++ my $dbh = Bugzilla->dbh; ++ my $ref = $dbh->selectall_arrayref( ++ "SELECT name, query FROM test_named_queries ++ WHERE userid = ? AND isvisible = 1", ++ {'Slice' =>{}}, $self->id); ++ return $ref; ++} ++ + sub settings { + my ($self) = @_; + +@@ -467,7 +477,7 @@ + my $dbh = Bugzilla->dbh; + my @params = (); + +- my $query = "SELECT id " . ++ my $query = "(SELECT id, products.name AS pname " . + "FROM products " . + "LEFT JOIN group_control_map " . + "ON group_control_map.product_id = products.id "; +@@ -482,13 +492,22 @@ + "WHERE group_id IS NULL "; + + if (Param('useclassification') && $classification_id) { +- $query .= "AND classification_id = ? "; ++ $query .= "AND classification_id = ?) "; + detaint_natural($classification_id); + push(@params, $classification_id); + } +- +- $query .= "ORDER BY name"; +- ++ else { ++ $query .= ") "; ++ } ++ $query .= "UNION (SELECT id, products.name AS pname FROM products ". ++ "INNER JOIN test_plans ON products.id = test_plans.product_id ". ++ "INNER JOIN test_plan_permissions ON test_plan_permissions.plan_id = test_plans.plan_id ". ++ "WHERE test_plan_permissions.userid = ?)"; ++ ++ $query .= "ORDER BY pname "; ++ ++ push @params, $self->id; ++ + my $prod_ids = $dbh->selectcol_arrayref($query, undef, @params); + my @products; + foreach my $prod_id (@$prod_ids) { +@@ -674,7 +693,34 @@ + $group_delete->execute($id, $group, GRANT_REGEXP) if $present; + } + } +- ++ ++ # Now do the same for Testopia test plans. ++ $sth = $dbh->prepare("SELECT test_plan_permissions_regexp.plan_id, ++ user_regexp, test_plan_permissions_regexp.permissions, ++ test_plan_permissions.plan_id ++ FROM test_plan_permissions_regexp ++ LEFT JOIN test_plan_permissions ++ ON test_plan_permissions_regexp.plan_id = test_plan_permissions.plan_id ++ AND test_plan_permissions.userid = ? ++ AND test_plan_permissions.grant_type = ?"); ++ ++ $sth->execute($id, GRANT_REGEXP); ++ my $plan_insert = $dbh->prepare(q{INSERT INTO test_plan_permissions ++ (userid, plan_id, permissions, grant_type) ++ VALUES (?, ?, ?, ?)}); ++ my $plan_delete = $dbh->prepare(q{DELETE FROM test_plan_permissions ++ WHERE userid = ? ++ AND plan_id = ? ++ AND grant_type = ?}); ++ ++ while (my ($planid, $regexp, $perms, $present) = $sth->fetchrow_array()) { ++ if (($regexp ne '') && ($self->{login} =~ m/$regexp/i)) { ++ $plan_insert->execute($id, $planid, $perms, GRANT_REGEXP) unless $present; ++ } else { ++ $plan_delete->execute($id, $planid, GRANT_REGEXP) if $present; ++ } ++ } ++ + $dbh->do(q{UPDATE profiles + SET refreshed_when = ? + WHERE userid=?}, +Index: Bugzilla/DB/Schema/Pg.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB/Schema/Pg.pm,v +retrieving revision 1.9 +diff -u -r1.9 Pg.pm +--- Bugzilla/DB/Schema/Pg.pm 15 Jun 2005 03:54:59 -0000 1.9 ++++ Bugzilla/DB/Schema/Pg.pm 27 Mar 2007 20:19:50 -0000 +@@ -69,6 +69,7 @@ + INT3 => 'integer', + INT4 => 'integer', + ++ TINYSERIAL => 'serial unique', + SMALLSERIAL => 'serial unique', + MEDIUMSERIAL => 'serial unique', + INTSERIAL => 'serial unique', +Index: Bugzilla/DB/Schema/Mysql.pm +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/Bugzilla/DB/Schema/Mysql.pm,v +retrieving revision 1.12.2.1 +diff -u -r1.12.2.1 Mysql.pm +--- Bugzilla/DB/Schema/Mysql.pm 19 Jun 2006 14:57:14 -0000 1.12.2.1 ++++ Bugzilla/DB/Schema/Mysql.pm 27 Mar 2007 20:19:50 -0000 +@@ -103,9 +103,10 @@ + INT3 => 'mediumint', + INT4 => 'integer', + +- SMALLSERIAL => 'smallint auto_increment', +- MEDIUMSERIAL => 'mediumint auto_increment', +- INTSERIAL => 'integer auto_increment', ++ TINYSERIAL => 'tinyint unsigned auto_increment', ++ SMALLSERIAL => 'smallint unsigned auto_increment', ++ MEDIUMSERIAL => 'mediumint unsigned auto_increment', ++ INTSERIAL => 'integer unsigned auto_increment', + + TINYTEXT => 'tinytext', + MEDIUMTEXT => 'mediumtext', +@@ -245,7 +246,7 @@ + if (defined $column_info->{COLUMN_DEF}) { + # The defaults that MySQL inputs automatically are usually + # something that would be considered "false" by perl, either +- # a 0 or an empty string. (Except for datetime and decimal ++ # a 0 or an empty string. (Except for ddatetime and decimal + # fields, which have their own special auto-defaults.) + # + # Here's how we handle this: If it exists in the schema diff --git a/testopia/scripts/create_testscript.sh b/testopia/scripts/create_testscript.sh new file mode 100755 index 0000000..9044240 --- /dev/null +++ b/testopia/scripts/create_testscript.sh @@ -0,0 +1,10 @@ +. trenv.sh + +plan_id="$1" +summary="$2" + +url="http://$testrunserver/tr_scripts.cgi?action=runscript&plan_id=$plan_id&summary=$summary&$login_token" + +wget "$url" -O testscript.sh -o create_testscript.log + +chmod 700 testscript.sh \ No newline at end of file diff --git a/testopia/scripts/cvs_update.sh b/testopia/scripts/cvs_update.sh new file mode 100755 index 0000000..bb2d562 --- /dev/null +++ b/testopia/scripts/cvs_update.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Vance Baarda. +# Portions created by Vance Baarda are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Vance Baarda <vrb@novell.com> + +# This script can be used to update your version of Testopia to the +# latest CVS tip. + +# It checks out testopia's files into /tmp and copies them to the +# directory you specify, usually your bugzilla root directory. + +(( $# == 1 )) || +{ + echo "Usage: ${0##*/} docroot" >&2 + exit 1 +} +docroot=$1 + +[[ $docroot =~ '^/.*' ]] || +{ + echo docroot needs to be an absolute path >&2 + exit 1 +} +[ -d $docroot ] || +{ + echo $docroot: no such directory >&2 + exit 1 +} + +rm -rf /tmp/mozilla +cd /tmp +cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co mozilla/webtools/testopia +cd mozilla/webtools/testopia +find . -name CVS -type d | + while read name + do + rm -rf "$name" + done +find * | cpio -pdumv $docroot +rm -rf /tmp/mozilla diff --git a/testopia/scripts/fail_id.sh b/testopia/scripts/fail_id.sh new file mode 100755 index 0000000..b3b166f --- /dev/null +++ b/testopia/scripts/fail_id.sh @@ -0,0 +1,7 @@ +. trenv.sh + +test_case_log_id="$1" + +url="http://$testrunserver/tr_caselogform.cgi?form_action=fail_bug_id&mark_failed=1&id=$test_case_log_id&$login_token" + +wget "$url" -O failed_run_case_$test_case_log_id.html -o failed_run_case_$test_case_log_id.log \ No newline at end of file diff --git a/testopia/scripts/note_id.sh b/testopia/scripts/note_id.sh new file mode 100755 index 0000000..4b1d1bb --- /dev/null +++ b/testopia/scripts/note_id.sh @@ -0,0 +1,8 @@ +. trenv.sh + +test_case_log_id="$1" +notes="$2" + +url="http://$testrunserver/tr_caselogform.cgi?action=submit_notes&id=$test_case_log_id¬es=$notes&$login_token" + +wget "$url" -O noted_run_case_$test_case_log_id.html -o noted_run_case_$test_case_log_id.log \ No newline at end of file diff --git a/testopia/scripts/pass_id.sh b/testopia/scripts/pass_id.sh new file mode 100755 index 0000000..88cb71d --- /dev/null +++ b/testopia/scripts/pass_id.sh @@ -0,0 +1,7 @@ +. trenv.sh + +test_case_log_id="$1" + +url="http://$testrunserver/tr_caselogform.cgi?action=change_status&case_action=pass&id=$test_case_log_id&$login_token" + +wget "$url" -O passed_run_case_$test_case_log_id.html -o passed_run_case_$test_case_log_id.log \ No newline at end of file diff --git a/testopia/scripts/readme.txt b/testopia/scripts/readme.txt new file mode 100755 index 0000000..47c445f --- /dev/null +++ b/testopia/scripts/readme.txt @@ -0,0 +1,50 @@ +This folder contains a set of scripts that Sytze <testrunner@asset-control.com> +uses to perform the administration of his automatic regression tests in Test +Runner. + +The scripts work on Test Runner 0.3. They need some customization to make them +work in your machine, Everybody is welcomed to continue improving this +awesome functionality, including documentation and installation. + +Many thanks to Sytze. + +These are his notes: + +* GeneralScripts, the scripts that are used on the test machine: + + * create_testscript.sh ; this will call for the action added to + tr_scripts.cgi and store the created test script as "testscript.sh". + + * pass_id.sh; this will pass the specified run_case + + * fail_id.sh; this will fail the specified run_case + + * note_id.sh; this will put a note to the specified run_case + + * trenv.sh; this contains the name of the server, the username and + password for the user that runs the test. + + +* RegressionTest; this contains an example regression test script: + + * regression_test.sh: It will call create_testscript.sh for a specified + plan_id with a generated summary and subsequently call the generated test + script. + +There are some things that should be added/changed: + +* I did have wget available, but the version that we have installed does not +support post. This implies that I can currently only put a single line as note. +I have asked our system administrator to install curl, so that I can use a post +method to store the log of a testscript as notes for the run case. + +* Actually only those thest cases that are marked as "automated" should be +put in the generated test script. + +* I currently have mutliple unix users on different machines that perform the +regression tests. At the moment I create a new run for general user testopia, +perhaps I should change that to have a single run with multiple users, but then +I need to have an additional cgi-script to get the script for a specific user +(need the run_cases) and I then also need to know the run_id for the plan. So +this seems to be a better solution. In my summary I now generated the name of +the installation. diff --git a/testopia/scripts/regression_test.sh b/testopia/scripts/regression_test.sh new file mode 100755 index 0000000..52392b3 --- /dev/null +++ b/testopia/scripts/regression_test.sh @@ -0,0 +1,11 @@ +# Example regression test script +# It will call create_testscript.sh for a specified +# plan_id with a generated summary and subsequently call the generated test +# script. + +. acpm_utilities.sh +export PATH=$PATH:<PathToGeneralTestopiaScripts> +plan_id=<plan_id> +testrunname=<name_for_testrun> +create_testscript.sh $plan_id "$testrunname" +testscript.sh diff --git a/testopia/scripts/trenv.sh b/testopia/scripts/trenv.sh new file mode 100755 index 0000000..b13d548 --- /dev/null +++ b/testopia/scripts/trenv.sh @@ -0,0 +1,10 @@ +# Configuration file +# testrunserver: server name plus the web path were Bugzilla & Test Runner are installed. +# username: a valid Bugzilla's user ID +# password: user's password + +testrunserver="localhost/bugzilla" +username="user@test.com" +password="mypassword" + +login_token=Bugzilla_login\=$username\&Bugzilla_password\=$password diff --git a/testopia/testopia.insert.sql b/testopia/testopia.insert.sql new file mode 100644 index 0000000..8fdd5ef --- /dev/null +++ b/testopia/testopia.insert.sql @@ -0,0 +1,41 @@ +INSERT INTO test_case_run_status (case_run_status_id, name, sortkey) VALUES (1, 'IDLE', 1) +INSERT INTO test_case_run_status (case_run_status_id, name, sortkey) VALUES (2, 'PASSED', 2) +INSERT INTO test_case_run_status (case_run_status_id, name, sortkey) VALUES (3, 'FAILED', 3) +INSERT INTO test_case_run_status (case_run_status_id, name, sortkey) VALUES (4, 'RUNNING', 4) +INSERT INTO test_case_run_status (case_run_status_id, name, sortkey) VALUES (5, 'PAUSED', 5) +INSERT INTO test_case_run_status (case_run_status_id, name, sortkey) VALUES (6, 'BLOCKED', 6) +INSERT INTO test_case_status (case_status_id, name) VALUES (1, 'PROPOSED') +INSERT INTO test_case_status (case_status_id, name) VALUES (2, 'CONFIRMED') +INSERT INTO test_case_status (case_status_id, name) VALUES (3, 'DISABLED') +INSERT INTO test_plan_types (type_id, name) VALUES (1, 'Unit') +INSERT INTO test_plan_types (type_id, name) VALUES (2, 'Integration') +INSERT INTO test_plan_types (type_id, name) VALUES (3, 'Function') +INSERT INTO test_plan_types (type_id, name) VALUES (4, 'System') +INSERT INTO test_plan_types (type_id, name) VALUES (5, 'Acceptance') +INSERT INTO test_plan_types (type_id, name) VALUES (6, 'Installation') +INSERT INTO test_plan_types (type_id, name) VALUES (7, 'Performance') +INSERT INTO test_plan_types (type_id, name) VALUES (8, 'Product') +INSERT INTO test_plan_types (type_id, name) VALUES (9, 'Interoperability') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (1, 'isactive', 'Archived', 'test_plans') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (2, 'name', 'Plan Name', 'test_plans') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (3, 'type_id', 'Plan Type', 'test_plans') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (4, 'case_status_id', 'Case Status', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (5, 'category_id', 'Category', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (6, 'priority_id', 'Priority', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (7, 'summary', 'Run Summary', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (8, 'isautomated', 'Automated', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (9, 'alias', 'Alias', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (10, 'requirement', 'Requirement', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (11, 'script', 'Script', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (12, 'arguments', 'Argument', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (13, 'product_id', 'Product', 'test_plans') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (14, 'default_product_version', 'Default Product Version', 'test_plans') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (15, 'environment_id', 'Environment', 'test_runs') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (16, 'product_version', 'Product Version', 'test_runs') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (17, 'build_id', 'Default Build', 'test_runs') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (18, 'plan_text_version', 'Plan Text Version', 'test_runs') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (19, 'manager_id', 'Manager', 'test_runs') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (20, 'default_tester_id', 'Default Tester', 'test_cases') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (21, 'stop_date', 'Stop Date', 'test_runs') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (22, 'summary', 'Run Summary', 'test_runs') +INSERT INTO test_fielddefs (fieldid, name, description, table_name) VALUES (23, 'notes', 'Notes', 'test_runs') diff --git a/testopia/tools/readme b/testopia/tools/readme new file mode 100644 index 0000000..08b6c01 --- /dev/null +++ b/testopia/tools/readme @@ -0,0 +1,3 @@ +If you are installing Testopia on Windows, you will need to +install patch.exe into this directory. It is available here: + http://gnuwin32.sourceforge.net/packages/patch.htm diff --git a/tr_admin.cgi b/tr_admin.cgi new file mode 100755 index 0000000..0867f43 --- /dev/null +++ b/tr_admin.cgi @@ -0,0 +1,103 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::Util; + +my $template = Bugzilla->template; +my $dbh = Bugzilla->dbh; +my $cgi = Bugzilla->cgi; + +use vars qw($vars); + +Bugzilla->login(LOGIN_REQUIRED); + +print $cgi->header; +ThrowUserError("testopia-read-only") unless Bugzilla->user->in_group('admin'); + +my $plan = Bugzilla::Testopia::TestPlan->new({}); +my $action = $cgi->param('action') || ''; +my $item = $cgi->param('item') || ''; + +if ($item eq 'plan_type'){ + if( $action eq 'edit'){ + my $type_id = $cgi->param('type_id'); + detaint_natural($type_id); + $vars->{'type'} = $plan->plan_type_ref($type_id) + || ThrowUserError("invalid-test-id-non-existent", {'id' => $type_id, 'type' => 'Plan Type'}); + $template->process("testopia/admin/plantypes/edit.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + elsif ($action eq 'doedit'){ + my $type_id = $cgi->param('type_id'); + my $type_name = $cgi->param('name') || ''; + my $type_desc = $cgi->param('description') || ''; + + ThrowUserError('testopia-missing-required-field', {'field' => 'name'}) if $type_name eq ''; + detaint_natural($type_id); + ThrowUserError("invalid-test-id-non-existent", + {'id' => $type_id, 'type' => 'Plan Type'}) unless $plan->plan_type_ref($type_id); + trick_taint($type_name); + trick_taint($type_desc); + + $plan->update_plan_type($type_id, $type_name, $type_desc); + display(); + } + elsif ($action eq 'add'){ + $template->process("testopia/admin/plantypes/add.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + elsif ($action eq 'doadd'){ + my $type_name = $cgi->param('name') || ''; + my $type_desc = $cgi->param('description') || ''; + + ThrowUserError('testopia-missing-required-field', {'field' => 'name'}) if $type_name eq ''; + trick_taint($type_name); + trick_taint($type_desc); + ThrowUserError('testopia-name-not-unique', + {'object' => 'Plan Type', 'name' => $type_name}) if $plan->check_plan_type($type_name); + + $plan->add_plan_type($type_name, $type_desc); + display(); + } + else{ + display(); + } + +} + +else { + $template->process("testopia/admin/show.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} + +sub display { + $vars->{'plan'} = $plan; + $template->process("testopia/admin/plantypes/show.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} diff --git a/tr_admin_environment.cgi b/tr_admin_environment.cgi new file mode 100755 index 0000000..925b6f3 --- /dev/null +++ b/tr_admin_environment.cgi @@ -0,0 +1,576 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> +# Michael Hight <mjhight@gmail.com> +# Garrett Braden <gbraden@novell.com> +# Scott Sudweeks <ssudweeks@novell.com> +# Brian Kramer <bkramer@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::Product; +use Bugzilla::Testopia::Classification; +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Environment::Element; +use Bugzilla::Testopia::Environment::Property; +use Bugzilla::Testopia::Environment::Category; + +use JSON; +use Data::Dumper; + +Bugzilla->login(LOGIN_REQUIRED); + +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; + +use vars qw($vars); + +print $cgi->header; + +ThrowUserError('testopia-permission-denied') unless Bugzilla->user->in_group('Testers'); + +my $action = $cgi->param('action') || ''; +my $env_id = $cgi->param('env_id') || 0; + +if($action eq 'getChildren'){ + my $json = new JSON; + my $data = $json->jsonToObj($cgi->param('data')); + + my $node = $data->{'node'}; + + my $id = $node->{'objectId'}; + my $type = $node->{'widgetId'}; + + detaint_natural($id); + trick_taint($type); + + + for ($type){ + /classification/ && do { get_products($id); }; + /product/ && do { get_categories($id); }; + /category/ && do { get_category_element($id) }; + /element/ && do { get_element_children($id); }; + /property/ && do { get_validexp_json($id) }; + } +} + +elsif($action eq 'edit'){ + my $type = $cgi->param('type'); + my $id = $cgi->param('id'); + + for ($type){ + /category/ && do { edit_category($id); }; + /element/ && do { edit_element($id); }; + /property/ && do { edit_property($id); }; + /validexp/ && do { edit_validexp($id); }; + } +} + +elsif($action eq 'do_edit'){ + my $type = $cgi->param('type'); + my $id = $cgi->param('id'); + + for ($type){ + /category/ && do { do_edit_category($id); }; + /element/ && do { do_edit_element($id); }; + /property/ && do { do_edit_property($id); }; + /validexp/ && do { do_edit_validexp($id); }; + } +} + +elsif($action eq 'createChild'){ + my $json = new JSON; + my $data = $json->jsonToObj($cgi->param('data')); + + my $node = $data->{'parent'}; + + my $id = $node->{'objectId'}; + my $type = $node->{'widgetId'}; + + my $create_type = $data->{'data'}->{'createType'}; + $type = 'child' if ($create_type && $type !~ /category/); + + detaint_natural($id); + trick_taint($type); + + + for ($type){ + /product/ && do { add_category($id); }; + /category/ && do { add_element($id); }; + /child/ && do { add_element($id,1); }; + /element/ && do { add_property($id); }; + /property/ && do { add_validexp($id); }; + } + +} + +elsif($action eq 'removeNode'){ + my $json = new JSON; + my $data = $json->jsonToObj($cgi->param('data')); + my $node = $data->{'node'}; + + my $id = $node->{'objectId'}; + my $type = $node->{'widgetId'}; + + detaint_natural($id) unless $type =~ /validexp/; + trick_taint($type); + + for ($type){ + /category/ && do { delete_category($id); }; + /element/ && do { delete_element($id); }; + /property/ && do { delete_property($id); }; + /validexp/ && do { delete_validexp($id); }; + } +} + +elsif ($action eq 'getcategories'){ + my $product_id = $cgi->param('product_id'); + detaint_natural($product_id); + my $product = Bugzilla::Testopia::Product->new($product_id); + exit unless $product && Bugzilla->user->can_see_product($product->name); + my $cat = Bugzilla::Testopia::Environment::Category->new({}); + my $categories = $cat->get_element_categories_by_product($product_id); + my $ret; + foreach my $c (@{$categories}){ + my $name = $c->name; + $name =~ s/<span style='color:blue'>|<\/span>//g; + $ret .= $c->id.'||'.$name.'|||'; + } + chop($ret); + print $ret; +} + +elsif ($action eq 'getelements'){ + my $cat_name = $cgi->param('cat_name'); + my $cat = Bugzilla::Testopia::Environment::Category->new($cat_name); + + my $elements = $cat->get_elements_by_category(); + my $ret; + foreach my $e (@{$elements}){ + my $elem = Bugzilla::Testopia::Environment::Element->new(@$e{'element_id'}); + $elem->{'name'} =~ s/<span style='color:blue'>|<\/span>//g; + $ret .= $elem->{'element_id'}.'||'.$elem->{'name'}.'|||'; + } + $ret = substr($ret, 0, length($ret) - 3); + print $ret; +} + +else{ + &display; +} + +sub display{ + my $category = Bugzilla::Testopia::Environment::Category->new({'id' => 0}); + if (Param('useclassification')){ + $vars->{'allhaschild'} = $category->get_all_child_count; + $vars->{'toplevel'} = Bugzilla->user->get_selectable_classifications; + $vars->{'type'} = 'classification'; + } + else { + $vars->{'toplevel'} = $category->get_env_product_list; + $vars->{'type'} = 'product'; + } + + $template->process("testopia/environment/admin/show.html.tmpl", $vars) + || print $template->error(); +} + +########################### +### Tree Helper Methods ### +########################### +sub get_products{ + my ($class_id) = (@_); + my $class = Bugzilla::Testopia::Classification->new($class_id); + return unless scalar(grep {$class->id eq $class_id} @{Bugzilla->user->get_selectable_classifications}); + print $class->products_to_json; +} + +sub get_categories{ + my ($product_id) = (@_); + if ($product_id){ + my $product = Bugzilla::Testopia::Product->new($product_id); + return unless $product->canedit; + } + my $category = Bugzilla::Testopia::Environment::Category->new({}); + print $category->product_categories_to_json($product_id); +} + +sub get_category_element{ + my ($id) = (@_); + my $category = Bugzilla::Testopia::Environment::Category->new($id); + return unless $category->canedit; + print $category->elements_to_json; +} + +sub get_element_children { + my ($id) = (@_); + my $element = Bugzilla::Testopia::Environment::Element->new($id); + return unless $element->canedit; + print $element->children_to_json; +} + +sub get_validexp_json { + my ($id) = (@_); + my $property = Bugzilla::Testopia::Environment::Property->new($id); + return unless $property->canedit; + print $property->valid_exp_to_json; +} + + +########################### +### Edit Helper Methods ### +########################### +sub edit_category{ + my ($id) = (@_); + my $category = Bugzilla::Testopia::Environment::Category->new($id); + return unless $category->canedit; + + my $product = Bugzilla::Testopia::Product->new($category->product_id()); + + $category->{'name'} =~ s/<span style='color:blue'>|<\/span>//g; + + $vars->{'category'} = $category; + $vars->{'products'} = $category->get_env_product_list; + $vars->{'currentproduct'} = $product ? $product : {'id' => 0, 'name' => '--ANY PRODUCT--'}; + $template->process("testopia/environment/admin/category.html.tmpl", $vars) + || print $template->error(); +} + +sub edit_element{ + my ($id) = (@_); + my $element = Bugzilla::Testopia::Environment::Element->new($id); + return unless $element->canedit; + + my $category = Bugzilla::Testopia::Environment::Category->new($element->env_category_id()); + my $product = Bugzilla::Testopia::Product->new($category->product_id()); + + $element->{'name'} =~ s/<span style='color:blue'>|<\/span>//g; + + $vars->{'element'} = $element; + $vars->{'products'} = $category->get_env_product_list; + $vars->{'currentproduct'} = $product ? $product : {'id' => 0, 'name' => '--ANY PRODUCT--'}; + $vars->{'currentcategory'} = $category; + $vars->{'categories'} = $category->get_element_categories_by_product($product->{'id'}); + unless($element->parent_id() == 0){ + my $parent = Bugzilla::Testopia::Environment::Element->new($element->parent_id()); + $vars->{'currentelement'} = $parent; + } + $vars->{'elements'} = $category->get_elements_by_category(); + + $template->process("testopia/environment/admin/element.html.tmpl", $vars) + || print $template->error(); +} + +sub edit_property{ + my ($id) = (@_); + my $property = Bugzilla::Testopia::Environment::Property->new($id); + return unless $property->canedit; + + my $element = Bugzilla::Testopia::Environment::Element->new($property->element_id()); + my $cat_id = $element->env_category_id(); + my $elmnts = Bugzilla::Testopia::Environment::Category->new($cat_id)->get_elements_by_category(); + + $vars->{'property'} = $property; + $vars->{'elements'} = $elmnts; + $vars->{'currentelement'} = $element; + $template->process("testopia/environment/admin/property.html.tmpl", $vars); +} + +sub edit_validexp{ + my ($id) = (@_); + $id =~ /^(\d+)~/; + + my $property = Bugzilla::Testopia::Environment::Property->new($1); + return unless $property->canedit; + + my @expressions = split /\|/, $property->validexp(); + + $vars->{'property'} = $property; + $vars->{'expressions'} = \@expressions; + $template->process("testopia/environment/admin/valid_exp.html.tmpl", $vars); +} + + +############################## +### Do_Edit Helper Methods ### +############################## +sub do_edit_category{ + my $name = $cgi->param('name'); + my $product_id = $cgi->param('product'); + my ($id) = (@_); + my $category = Bugzilla::Testopia::Environment::Category->new($id); + return unless $category->canedit; + + trick_taint($name); + detaint_natural($product_id); + Bugzilla->batch(1); + eval{ + validate_selection($product_id, 'id', 'products'); + }; + if ($@ && $product_id != 0){ + print '{error:"Invalid product"}'; + exit; + } + $category->set_product($product_id); + + unless ($category->set_name($name)) { + print '{error:"Name already used. Please choose another"}'; + exit; + } + + print "{name:\"$name\", product:\"product$product_id\", widget:\"category$id\"}"; + +} + +sub do_edit_element{ + my ($id) = (@_); + + # + # CGI params + # productCombo -> id of product (does not matter what this is, only used to find categories) + # categoryCombo -> id of category (if zero, leave the same) + # elementCombo -> id of parent element (id of 0 means no parent) + # name -> name of the element + # + + my $element = Bugzilla::Testopia::Environment::Element->new($id); + return unless $element->canedit; + + my $cat_id = $cgi->param('categoryCombo'); + my $parent_id = $cgi->param('elementCombo'); + my $name = $cgi->param('name'); + my $parent; + + detaint_natural($cat_id); + detaint_natural($parent_id); + trick_taint($name); + + if ($cat_id){ + $element->update_element_category($cat_id); + $parent = 'category' . $cat_id; + } + else { + print '{error: "Category does not exist"}'; + exit; + } + if ($parent_id){ + $element->update_element_parent($parent_id); + $parent = 'element' . $parent_id; + } + elsif (!$cat_id) { + print '{error: "Parent element does not exist"}'; + exit; + } + unless ($element->update_element_name($name)){ + print '{error: "Name already taken. Please choose another."}'; + exit; + } + + print "{name:\"$name\", parent:\"$parent\", widget:\"element$id\"}"; +} + +sub do_edit_property{ + my ($id) = (@_); + my $name = $cgi->param('name'); + my $element_id = $cgi->param('element'); + my $property = Bugzilla::Testopia::Environment::Property->new($id); + return unless $property->canedit; + + trick_taint($name); + detaint_natural($element_id); + Bugzilla->batch(1); + eval{ + validate_selection($element_id, 'element_id', 'test_environment_element'); + }; + if ($@){ + print '{error:"Invalid element"}'; + exit; + } + $property->set_element($element_id); + + unless ($property->set_name($name)) { + print '{error:"Name already used. Please choose another"}'; + exit; + } + + print "{name:\"$name\", element:\"element$element_id\", widget:\"property$id\"}"; +} + +sub do_edit_validexp{ + my ($id) = (@_); + + my $property = Bugzilla::Testopia::Environment::Property->new($id); + return unless $property->canedit; + my @expressions = $cgi->param('valid_exp'); + + my $exp = join('|', @expressions); + trick_taint($exp); + + $property->update_property_validexp($exp); + display; +} + + + +################################### +### Create Child Helper Methods ### +################################### +sub add_category{ + my ($id) = (@_); + my $category = Bugzilla::Testopia::Environment::Category->new({}); + if ($id){ + my $product = Bugzilla::Testopia::Product->new($id); + return unless $product->canedit; + } + $category->{'product_id'} = $id; + $category->{'name'} = 'New category ' . $category->new_category_count; + + my $new_cid = $category->store(); + + my $json = '{title:"<span style=\'color:blue\'>' . $category->{'name'} . '</span>",'; + $json .= 'objectId:"'. $new_cid . '",'; + $json .= 'widgetId:"category' . $new_cid . '",'; + $json .= 'childIconSrc:"testopia/img/square.gif",'; + $json .= 'actionsDisabled:["addCategory","addValue","addProperty"]}'; + + print $json; +} + +sub add_element{ + my ($id, $ischild) = (@_); + my $element = Bugzilla::Testopia::Environment::Element->new({}); + # If we are adding this element as a child, $id is the parent element's id + if ($ischild) { + my $parent = Bugzilla::Testopia::Environment::Element->new($id); + return unless $parent->canedit; + $element->{'env_category_id'} = $parent->env_category_id; + } + # Otherwise $id is the catagory id + else { + my $parent = Bugzilla::Testopia::Environment::Category->new($id); + return unless $parent->canedit; + $element->{'env_category_id'} = $id; + } + $element->{'name'} = "New element " . $element->new_element_count; + $element->{'parent_id'} = $ischild ? $id : 0; + $element->{'isprivate'} = 0; + + my $new_eid = $element->store(); + + my $json = '{title:"<span style=\'color:blue\'>' . $element->{'name'} .'</span>",'; + $json .= 'objectId:"'. $new_eid .'",'; + $json .= 'widgetId:"element'. $new_eid .'",'; + $json .= 'childIconSrc:"testopia/img/circle.gif",'; + $json .= 'actionsDisabled:["addCategory","addValue"]}'; + + print $json; +} + +sub add_property{ + my ($id) = (@_); + #add new property to element with id=$id + my $property = Bugzilla::Testopia::Environment::Property->new({}); + + my $parent = Bugzilla::Testopia::Environment::Element->new($id); + return unless $parent->canedit; + + $property->{'element_id'} = $id; + $property->{'name'} = "New property " . $property->new_property_count; + $property->{'validexp'} = ""; + + my $new_pid = $property->store(); + + my $json = '{title:"<span style=\'color:blue\'>' . $property->{'name'} . '</span>",'; + $json .= 'objectId:"' . $new_pid . '",'; + $json .= 'widgetId:"property' . $new_pid . '",'; + $json .= 'childIconSrc:"testopia/img/triangle.gif",'; + $json .= 'actionsDisabled:["addCategory","addElement","addProperty"]}'; + + print $json; +} + +sub add_validexp{ + my ($id) = (@_); + my $property = Bugzilla::Testopia::Environment::Property->new($id); + return unless $property->canedit; + + my $exp = $property->validexp; + $exp ? $property->update_property_validexp($exp . "|New value") : $property->update_property_validexp("New value"); + + my $json .= '{title: "<span style=\'color:blue\'>New value</span>",'; + $json .= 'objectId:"' . $id . '~New Value",'; + $json .= 'widgetId:"validexp' . $id . '~New Value",'; + $json .= 'actionsDisabled:["addCategory","addElement","addProperty","addValue","remove"]}'; + + print $json; +} + +############################# +### Delete Helper Methods ### +############################# +sub delete_category{ + my ($id) = (@_); + my $category = Bugzilla::Testopia::Environment::Category->new($id); + return unless $category->candelete; + my $success = $category->obliterate; + print $success == 1 ? "true" : "false"; +} + +sub delete_element{ + my ($id) = (@_); + my $element = Bugzilla::Testopia::Environment::Element->new($id); + return unless $element->candelete; + my $success = $element->obliterate; + print $success == 1 ? "true" : "false"; +} + +sub delete_property{ + my ($id) = (@_); + my $property = Bugzilla::Testopia::Environment::Property->new($id); + return unless $property->candelete; + my $success = $property->obliterate; + print $success == 1 ? "true" : "false"; +} + +sub delete_validexp{ + # $id, $type + my ($id) = (@_); + $id =~ /^(\d+)~/; + my $property = Bugzilla::Testopia::Environment::Property->new($1); + return unless $property->candelete; + my %values; + foreach my $v (split /\|/, $property->validexp){ + $values{$v} = 1; + } + $id =~ /~(.+)$/; + my $value = $1; + my $deleted = delete $values{$value}; + my $exp = join("|", keys %values); + $property->update_property_validexp($exp); + print $deleted ? "true" : "false"; +} diff --git a/tr_attachment.cgi b/tr_attachment.cgi new file mode 100755 index 0000000..3e09233 --- /dev/null +++ b/tr_attachment.cgi @@ -0,0 +1,185 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Attachment; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; + +use vars qw($vars); +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; +my $dbh = Bugzilla->dbh; + +Bugzilla->login(LOGIN_REQUIRED); + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +my $action = $cgi->param('action') || ''; +my $attach_id = $cgi->param('attach_id'); +my $plan_id = $cgi->param('plan_id'); +my $case_id = $cgi->param('case_id'); +my $caserun_id = $cgi->param('caserun_id'); + +detaint_natural($attach_id) if $attach_id; + +unless ($attach_id){ + print $cgi->header(); + $template->process("testopia/attachment/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; +} + +validate_test_id($attach_id,'attachment'); +my $attachment = Bugzilla::Testopia::Attachment->new($attach_id); + +my $obj; +if ($plan_id){ + detaint_natural($plan_id); + $obj = Bugzilla::Testopia::TestPlan->new($plan_id); +} +elsif ($case_id){ + detaint_natural($case_id); + $obj = Bugzilla::Testopia::TestCase->new($case_id); +} +elsif ($caserun_id){ + detaint_natural($caserun_id); + $obj = Bugzilla::Testopia::TestCaseRun->new($caserun_id); +} + +################## +### Edit ### +################## +if ($action eq 'edit'){ + print $cgi->header; + ThrowUserError('testopia-permission-denied', {'object' => $attachment}) unless $attachment->canedit; + + $vars->{'attachment'} = $attachment; + $vars->{'isviewable'} = $attachment->isViewable($cgi); + $vars->{'obj'} = $obj; + $template->process("testopia/attachment/show.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} +elsif ($action eq 'do_edit') { + print $cgi->header; + ThrowUserError('testopia-permission-denied', {'object' => $attachment}) unless $attachment->canedit; + + my %newvalues = ( + 'description' => $cgi->param('description') || '', + 'filename' => $cgi->param('filename'), + 'mime_type' => $cgi->param('mime_type'), + ); + $attachment->update(\%newvalues); + + $vars->{'attachment'} = $attachment; + $vars->{'tr_message'} = "Attachment updated"; + $vars->{'backlink'} = $obj; + $vars->{'obj'} = $obj; + $vars->{'isviewable'} = $attachment->isViewable($cgi); + $template->process("testopia/attachment/show.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} + +#################### +### Unlink ### +#################### + +elsif ($action eq 'remove') { + print $cgi->header; + ThrowUserError('testopia-missing-parameter', {'param' => 'case_id or plan_id'}) unless $obj; + ThrowUserError('testopia-no-delete', {'object' => $attachment}) unless $obj->canedit; + $vars->{'attachment'} = $attachment; + $vars->{'action'} = 'do_remove'; + $vars->{'obj'} = $obj; + + $template->process("testopia/attachment/delete.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} +elsif ($action eq 'do_remove') { + print $cgi->header; + $vars->{'tr_message'} = "Attachment ". $attachment->description ." deleted"; + ThrowUserError('testopia-missing-parameter', {'param' => 'case_id or plan_id'}) unless $obj; + ThrowUserError('testopia-no-delete', {'object' => $attachment}) unless $obj->canedit; + if ($plan_id){ + $attachment->unlink_plan($plan_id); + } + elsif ($case_id){ + $attachment->unlink_plan($case_id); + } + + $vars->{'tr_message'} = "Attachment removed"; + $vars->{'backlink'} = $obj; + $vars->{'deleted'} = 1; + $template->process("testopia/attachment/delete.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} + +#################### +### Delete ### +#################### + +elsif ($action eq 'delete') { + print $cgi->header; + ThrowUserError('testopia-no-delete', {'object' => $attachment}) unless $attachment->candelete; + $vars->{'attachment'} = $attachment; + $vars->{'action'} = 'do_delete'; + + $template->process("testopia/attachment/delete.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} +elsif ($action eq 'do_delete') { + print $cgi->header; + $vars->{'tr_message'} = "Attachment ". $attachment->description ." deleted"; + ThrowUserError('testopia-no-delete', {'object' => $attachment}) unless $attachment->candelete; + + $attachment->obliterate; + $vars->{'tr_message'} = "Attachment deleted"; + $vars->{'deleted'} = 1; + $template->process("testopia/attachment/delete.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} +################ +### View ### +################ +else { + + my $filename = $attachment->filename; + $filename =~ s/\\/\\\\/g; # escape backslashes + $filename =~ s/"/\\"/g; # escape quotes + + print $cgi->header(-type => $attachment->mime_type . "; name=\"$filename\"", + -content_disposition => "inline; filename=\"$filename\"", + -content_length => $attachment->datasize); + + print $attachment->contents; +} diff --git a/tr_builds.cgi b/tr_builds.cgi new file mode 100755 index 0000000..b9b4b90 --- /dev/null +++ b/tr_builds.cgi @@ -0,0 +1,151 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Config; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::Build; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::Util; + +Bugzilla->login(LOGIN_REQUIRED); + +use vars qw($vars); +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; + +print $cgi->header; + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +my $action = $cgi->param('action') || ''; +my $product_id = $cgi->param('product_id'); + +ThrowUserError("testopia-missing-parameter", {param => "product_id"}) unless $product_id; +my $product = Bugzilla::Testopia::Product->new($product_id); +ThrowUserError('testopia-read-only', {'object' => $product}) unless $product->canedit; + +$vars->{'plan_id'} = $cgi->param('plan_id'); +$vars->{'product'} = $product; + +###################### +### Create a Build ### +###################### +if ($action eq 'add'){ + $vars->{'action'} = 'do_add'; + $template->process("testopia/build/form.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} + +elsif ($action eq 'do_add'){ + my $cname = $cgi->param('name'); + my $desc = $cgi->param('desc'); + my $tm = $cgi->param('milestone'); + + ThrowUserError('testopia-missing-required-field', {'field' => 'build name'}) unless $cname; + + trick_taint($cname); + trick_taint($desc); + trick_taint($tm); + + my $build = Bugzilla::Testopia::Build->new({ + product_id => $product->id, + name => $cname, + description => $desc, + milestone => $tm, + isactive => $cgi->param('isactive') ? 1 : 0, + }); + ThrowUserError('testopia-name-not-unique', + {'object' => 'Build', + 'name' => $cname}) if $build->check_name($cname); + $build->store; + + $vars->{'tr_message'} = "Build successfully added"; + display(); + +} + +#################### +### Edit a Build ### +#################### +elsif ($action eq 'edit'){ + my $build = Bugzilla::Testopia::Build->new($cgi->param('build_id')); + $vars->{'build'} = $build; + $vars->{'action'} = 'do_edit'; + $template->process("testopia/build/form.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} +elsif ($action eq 'do_edit'){ + my $cname = $cgi->param('name'); + my $desc = $cgi->param('desc'); + my $milestone = $cgi->param('milestone'); + my $bid = $cgi->param('build_id'); + + ThrowUserError('testopia-missing-required-field', {'field' => 'build name'}) unless $cname; + + my $build = Bugzilla::Testopia::Build->new($bid); + + trick_taint($cname); + trick_taint($desc); + trick_taint($milestone); + validate_selection($milestone, 'value', 'milestones'); + + my $orig_id = $build->check_name($cname); + + ThrowUserError('testopia-name-not-unique', + {'object' => 'Build', + 'name' => $cname}) if ($orig_id && $orig_id != $bid); + + $build->update($cname, $desc, $milestone, $cgi->param('isactive') ? 1 : 0); + $vars->{'tr_message'} = "Build successfully updated"; + display(); +} + +elsif ($action eq 'hide' || $action eq 'unhide'){ + my $bid = $cgi->param('build_id'); + my $build = Bugzilla::Testopia::Build->new($bid); + $build->toggle_hidden; + display(); +} + +######################## +### View plan Builds ### +######################## +else { + display(); +} + +################### +### Helper Subs ### +################### + +sub display{ + $template->process("testopia/build/list.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} diff --git a/tr_case_dependencies.cgi b/tr_case_dependencies.cgi new file mode 100755 index 0000000..e69de29 diff --git a/tr_case_reports.cgi b/tr_case_reports.cgi new file mode 100755 index 0000000..8a71668 --- /dev/null +++ b/tr_case_reports.cgi @@ -0,0 +1,122 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Maciej Maczynski are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +# Portions taken from Bugzilla reports by Gervase Markham <gerv@gerv.net> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Constants; +use Bugzilla::Testopia::Report; + +use vars qw($vars); +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; + +Bugzilla->login(LOGIN_REQUIRED); + +my $type = $cgi->param('type') || ''; + +if ($type eq 'status-breakdown'){ + my $case_id = trim(Bugzilla->cgi->param('case_id') || ''); + + unless ($case_id){ + $vars->{'form_action'} = 'tr_case_reports.cgi'; + $template->process("testopia/case/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; + } + validate_test_id($case_id, 'case'); + push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + + my $case = Bugzilla::Testopia::TestCase->new($case_id); + exit unless $case->canview; + + my @data; + my $caserun = Bugzilla::Testopia::TestCaseRun->new({}); + + my @names; + my @values; + foreach my $status (@{$caserun->get_status_list}){ + push @names, $status->{'name'}; + push @values, $case->get_caserun_count($status->{'id'}); + } + push @data, \@names; + push @data, \@values; + + $vars->{'width'} = 200; + $vars->{'height'} = 150; + $vars->{'data'} = \@data; + $vars->{'chart_title'} = 'Historic Status Breakdown'; + $vars->{'colors'} = (['#858aef', '#56e871', '#ed3f58', '#b8eae1', '#f1d9ab', '#e17a56']); + print $cgi->header; + $template->process("testopia/reports/report-pie.png.tmpl", $vars) + || ThrowTemplateError($template->error()); +} +else{ + $cgi->param('current_tab', 'case'); + $cgi->param('viewall', 1); + my $report = Bugzilla::Testopia::Report->new('case', 'tr_list_cases.cgi', $cgi); + $vars->{'report'} = $report; + + ### From Bugzilla report.cgi by Gervase Markham + my $formatparam = $cgi->param('format'); + my $report_action = $cgi->param('report_action'); + if ($report_action eq "data") { + # So which template are we using? If action is "wrap", we will be using + # no format (it gets passed through to be the format of the actual data), + # and either report.csv.tmpl (CSV), or report.html.tmpl (everything else). + # report.html.tmpl produces an HTML framework for either tables of HTML + # data, or images generated by calling report.cgi again with action as + # "plot". + $formatparam =~ s/[^a-zA-Z\-]//g; + trick_taint($formatparam); + $vars->{'format'} = $formatparam; + $formatparam = ''; + } + elsif ($report_action eq "plot") { + # If action is "plot", we will be using a format as normal (pie, bar etc.) + # and a ctype as normal (currently only png.) + $vars->{'cumulate'} = $cgi->param('cumulate') ? 1 : 0; + $vars->{'x_labels_vertical'} = $cgi->param('x_labels_vertical') ? 1 : 0; + $vars->{'data'} = $report->{'image_data'}; + } + else { + ThrowCodeError("unknown_action", {action => $cgi->param('report_action')}); + } + + my $format = $template->get_format("testopia/reports/report", $formatparam, + scalar($cgi->param('ctype'))); + + my $filename = "report-" . $report->{'date'} . ".$format->{extension}"; + print $cgi->header(-type => $format->{'ctype'}, + -content_disposition => "inline; filename=$filename"); + $vars->{'time'} = time(); + $template->process("$format->{'template'}", $vars) + || ThrowTemplateError($template->error()); + + exit; +} diff --git a/tr_caserun_reports.cgi b/tr_caserun_reports.cgi new file mode 100644 index 0000000..acdb8f6 --- /dev/null +++ b/tr_caserun_reports.cgi @@ -0,0 +1,88 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +# Portions taken from Bugzilla reports by Gervase Markham <gerv@gerv.net> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Constants; +use Bugzilla::Testopia::Report; + +use vars qw($vars); +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; + +Bugzilla->login(LOGIN_REQUIRED); + +my $type = $cgi->param('type') || ''; + +if ($type eq 'status-breakdown'){ +} +else{ + $cgi->param('current_tab', 'case_run'); + $cgi->param('viewall', 1); + my $report = Bugzilla::Testopia::Report->new('caserun', 'tr_list_caseruns.cgi', $cgi); + $vars->{'report'} = $report; + + ### From Bugzilla report.cgi by Gervase Markham + my $formatparam = $cgi->param('format'); + my $report_action = $cgi->param('report_action'); + if ($report_action eq "data") { + # So which template are we using? If action is "wrap", we will be using + # no format (it gets passed through to be the format of the actual data), + # and either report.csv.tmpl (CSV), or report.html.tmpl (everything else). + # report.html.tmpl produces an HTML framework for either tables of HTML + # data, or images generated by calling report.cgi again with action as + # "plot". + $formatparam =~ s/[^a-zA-Z\-]//g; + trick_taint($formatparam); + $vars->{'format'} = $formatparam; + $formatparam = ''; + } + elsif ($report_action eq "plot") { + # If action is "plot", we will be using a format as normal (pie, bar etc.) + # and a ctype as normal (currently only png.) + $vars->{'cumulate'} = $cgi->param('cumulate') ? 1 : 0; + $vars->{'x_labels_vertical'} = $cgi->param('x_labels_vertical') ? 1 : 0; + $vars->{'data'} = $report->{'image_data'}; + } + else { + ThrowCodeError("unknown_action", {action => $cgi->param('report_action')}); + } + + my $format = $template->get_format("testopia/reports/report", $formatparam, + scalar($cgi->param('ctype'))); + + my $filename = "report-" . $report->{'date'} . ".$format->{extension}"; + print $cgi->header(-type => $format->{'ctype'}, + -content_disposition => "inline; filename=$filename"); + $vars->{'time'} = time(); + $template->process("$format->{'template'}", $vars) + || ThrowTemplateError($template->error()); + + exit; +} diff --git a/tr_categories.cgi b/tr_categories.cgi new file mode 100755 index 0000000..db43eb7 --- /dev/null +++ b/tr_categories.cgi @@ -0,0 +1,154 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Config; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::Category; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::Util; + +Bugzilla->login(LOGIN_REQUIRED); + +use vars qw($vars); +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; + +print $cgi->header; + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +my $action = $cgi->param('action') || ''; +my $product_id = $cgi->param('product_id'); + +ThrowUserError("testopia-missing-parameter", {param => "product_id"}) unless $product_id; +my $product = Bugzilla::Testopia::Product->new($product_id); +ThrowUserError('testopia-read-only', {'object' => $product}) unless $product->canedit; + +$vars->{'plan_id'} = $cgi->param('plan_id'); +$vars->{'product'} = $product; + +######################### +### Create a Category ### +######################### +if ($action eq 'add'){ + $vars->{'action'} = 'do_add'; + $template->process("testopia/category/form.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} + +elsif ($action eq 'do_add'){ + my $cname = $cgi->param('name'); + my $desc = $cgi->param('desc'); + + ThrowUserError('testopia-missing-required-field', {'field' => 'category name'}) unless $cname; + + trick_taint($cname); + trick_taint($desc); + + my $category = Bugzilla::Testopia::Category->new({ + product_id => $product->id, + name => $cname, + description => $desc + }); + ThrowUserError('testopia-name-not-unique', + {'object' => 'Category', + 'name' => $cname}) if $category->check_name($cname); + $category->store; + + $vars->{'tr_message'} = "Category successfully added"; + display(); +} + +####################### +### Edit a Category ### +####################### +elsif ($action eq 'edit'){ + my $category = Bugzilla::Testopia::Category->new($cgi->param('category_id')); + $vars->{'category'} = $category; + $vars->{'action'} = 'do_edit'; + $template->process("testopia/category/form.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} +elsif ($action eq 'do_edit'){ + my $cname = $cgi->param('name'); + my $desc = $cgi->param('desc'); + my $cid = $cgi->param('category_id'); + my $category = Bugzilla::Testopia::Category->new($cid); + + ThrowUserError('testopia-missing-required-field', {'field' => 'category name'}) unless $cname; + + trick_taint($cname); + trick_taint($desc); + + my $orig_id = $category->check_name($cname); + + ThrowUserError('testopia-name-not-unique', + {'object' => 'Category', + 'name' => $cname}) if ($orig_id && $cid != $orig_id); + + $category->update($cname, $desc); + $vars->{'tr_message'} = "Category successfully updated"; + display(); + +} + +######################### +### Delete a Category ### +######################### +elsif ($action eq 'delete'){ + my $category = Bugzilla::Testopia::Category->new($cgi->param('category_id')); + ThrowUserError("testopia-non-zero-case-count") unless $category->candelete; + + $vars->{'category'} = $category; + $template->process("testopia/category/delete.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} +elsif ($action eq 'do_delete'){ + my $category = Bugzilla::Testopia::Category->new($cgi->param('category_id')); + ThrowUserError("testopia-non-zero-case-count") unless $category->candelete; + + $category->remove; + + $vars->{'tr_message'} = "Category successfully removed"; + display(); + +} +############################ +### View plan Categories ### +############################ +else { + display(); +} + + +sub display{ + $template->process("testopia/category/list.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} diff --git a/tr_csv2xml.pl b/tr_csv2xml.pl new file mode 100644 index 0000000..d5a060a --- /dev/null +++ b/tr_csv2xml.pl @@ -0,0 +1,701 @@ +#!/usr/bin/perl -w +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# The Initial Developer of the Original Code is Netscape Communications +# Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): Dawn Endico <endico@mozilla.org> +# David Koenig <dkoenig@novell.com> + +use strict; + +use Class::CSV; +use Getopt::Long; +use File::Temp "tempfile"; +use Pod::Usage; + +=head1 NAME + +tr_csv2xml.pl - Convert CSV file to Testopia XML format. + +=head1 SYNOPSIS + + tr_csv2xml.pl [ Options ] csvfilename xmlfilename + +=head1 OPTIONS + +=over 8 + +=item B<-h --help> + +This usage statement. + +=item B<-t --tcdb> + +Preprocess CSV file to correct problems with TCDB CSV format. + +=item B<-u --usage> + +This usage statement. + +=head1 DESCRIPTION + +This script converts the file csvfilename in CSV format to the file +xmlfilename in Testopia XML format. + +=cut + +my $TEST_PLAN_AUTHOR = "Change TEST_PLAN_AUTHOR in import.pl user\@novell.com"; +use constant TEST_PLAN_DOCUMENT => "Change TEST_PLAN_DOCUMENT in import.pl"; +use constant TEST_PLAN_NAME => "Change TEST_PLAN_NAME"; +use constant TEST_PLAN_PRODUCT => "TestProduct"; +use constant TEST_PLAN_PRODUCT_VERSION => "other"; +# Test Plan types are: Database_id, Database_description or Xml_description. +use constant TEST_PLAN_NAME_TYPE => "Xml_description"; + +my $debug = 0; +my $tcdb = 0; +my $usage = 0; + +# +#Display error message to stderr and exit. +# +sub error { + my ($reason,$errtype) = @_; + print STDERR $reason . ".\n"; + exit(1); +} + +# +# Creat mapping from TCDB user ids to email addresses. +# +sub map_TCDB_users +{ + my ($tcdb_user) = @_; + if ( -r "tcdbUsers" ) + { + open(TCDBUSERS, "tcdbUsers") || error("Cannot open tcdbUsers"); + while (<TCDBUSERS>) + { + chop; + my ($email_addr,$user_id) = split(/ /); + $tcdb_user->{$user_id} = $email_addr; + } + close(TCDBUSERS); + } +} + +# +# Peek ahead one character in the file. +# +sub peek(*) +{ + my $fh = shift; + + # Get current position in file. + my $position = tell $fh; + # Read next character. + read(CSVINPUT, my $next_char, 1); + # Restore position in file. + seek(CSVINPUT,$position,0); + + return $next_char; +} + +# +# Print the fields. +# +# In each field need to change '\"' to '"' and change all '"' to '""'. The last field +# will also have a '"' at the end of the line that needs to be removed. +# +# If TCDB format the Test Case Name may contain a series of 4-6 digits after two underscores +# which need to be removed. The TCDB appended the Test Case number to any Test Case created +# from a existing Test Case. In Testopia the Test Case numbers have no meaning. +# +sub print_fields +{ + my ($file_descriptor,$fields_ref,$testcasenamefield,$tcdb_format) = @_; + + my $index = 0; + while ( $index < @$fields_ref ) + { + $fields_ref->[$index] =~ s/"$//g if ( $index == ( @$fields_ref -1 ) ); + $fields_ref->[$index] =~ s/\\"/"/g; + $fields_ref->[$index] =~ s/"/""/g; + if ( $tcdb_format && ( $index == $testcasenamefield ) ) + { + $fields_ref->[$index] =~ s/__\d\d\d\d\d\d\d//g; + $fields_ref->[$index] =~ s/__\d\d\d\d\d\d//g; + $fields_ref->[$index] =~ s/__\d\d\d\d\d//g; + } + print $file_descriptor "\"$fields_ref->[$index]\""; + print $file_descriptor "," if ( $index != ( @$fields_ref -1 ) ); + $index += 1; + } + print $file_descriptor "\n"; +} + +# +# +# Create the work file from the input file that will be passed to Class::CSV. The input file's +# first line is field descriptions which are not passed into Class::CSV->parse. +# +# The Test Case Data Base (TCDB) CSV files also need to be processed to clean up format errors. +# +# The TCDB CSV errors are: +# 1) Does not escape " used in a field with "". May use \" instead of "" but not always. +# 2) Runs the CSV across multiple lines. +# 3) In some cases a line may be missing the last field. +# +sub remove_field_list +{ + my ($input_filename,$work_filename,$tcdb_format) = @_; + my $field_list = ""; + my @field_buffer; + my @fields; + my $fields_index = 0; + my $in_quote_field = 0; + my $line = ""; + my $line_count = 0; + my $number_of_fields = 0; + my $parse_line = ""; + my $testcasenamefield = ""; + + open(CSVINPUT, $input_filename) or error("Cannot open file $input_filename"); + open(CSVWORK, ">", $work_filename) or error("Cannot open file $work_filename"); + + while (<CSVINPUT>) + { + chop; + + s/\r//g; + # + # Map extended characters into HTML entities. + # + s/\342\200\223/-/g; + s/\342\200\224/—/g; + s/\342\200\230/‘/g; + s/\342\200\231/’/g; + s/\342\200\234/“/g; + s/\342\200\235/”/g; + s/\342\200\246/…/g; + s/\302\240/ /g; + s/\302\251/©/g; + s/\031/'/g; + s/\221/&8216;/g; # left single quotation mark + s/\222/&8217;/g; # right single quotation mark + s/\223/&8220;/g; # left double quotation mark + s/\224/&8221;/g; # right double quotation mark + s/\226/-/g; + s/\337/ß/g; # beta + s/\341/à/g; # small letter a with acute accent + s/\342/á/g; # small letter a with grave accent + s/\344/ä/g; # small letter a with tilde + s/\346/å/g; # small letter a with umlaut + s/\347/æ/g; # small ae + s/\350/ç/g; # small letter c cedilla + s/\351/è/g; # small letter e with acute accent + s/\364/ô/g; # small letter o with circumflex + + $line_count += 1; + if ( $line_count == 1 ) + { + $field_list = $_; + $number_of_fields = $field_list; + $number_of_fields =~ s/[^,]//g; + # Counting the number of commas so number of fields is one more. + $number_of_fields = (length $number_of_fields) + 1; + # Returned $field_list needs to be lower case, all spaces, " and \ removed. + $field_list = lc $field_list; + $field_list =~ s/[\s"\/]//g; + my $index = 0; + # Find the field that contains the Test Case name. + foreach my $field ( split(/,/,$field_list) ) + { + if ( $field eq "testcasename" ) + { + $testcasenamefield = $index ; + last; + } + $index++; + } + next; + } + + if ( ! $tcdb_format ) + { + print CSVWORK $_ . "\n"; + next; + } + + # Missing or empty environment in TCDB has this value in the environment field. Set it to + # null and hope it was not in the middle of a field. + s/"\$EMPTYENV"/""/; + + # TCDB CSV options that are not handled correctly: + # If a field contains some thing like: + # '2. Click "Roles and Tasks " , "Storage" , click "Volumes" and'' + # the "," will be seen as field seperator and not as part of the field. + + # Add the current line onto the line to parse. + $parse_line .= $_; + + # The end of the TCDB CSV line will be a double quote at the end of the line. Keep combining + # lines until we have a double quote at the end of the line and try to parse the line. + if ( ! ($parse_line =~ /.+\n*"$/) ) + { + $parse_line .= "\\n"; + next; + } + + # At this point $parse_line will hopefully contain the full CSV line. It may not though since + # we could have found a double quote at the end of the line used in field that spans multiple + # lines. Parse it below and if we have not found all the fields we will loop back and read + # more lines until the next double quote at the end of the line is found. + + $in_quote_field = 0; + my $index = 0; + @fields = (); + @field_buffer = (); + my @chars = split(//,$parse_line); + while ( $index <= $#chars ) + { + my $char = $chars[$index]; + if ( $char eq "\"" ) + { + # Following check is for character sequence \". Look at last character in the current + # field_buffer and if it is a \ this " is not the end of the field. + if ( $#field_buffer>=0 && $field_buffer[$#field_buffer] eq "\\" ) + { + push (@field_buffer,$char); + } + elsif ( ! $in_quote_field ) + { + $in_quote_field = 1; + } + else + { + # If this double quote is followed by a comma double quote ',"' it would be the end of the field + # otherwise it should included in the field. Need to ignore white space when searching for the + # next two characters. + # The TCDB never breaks a line at field separators (have not seen it yet anyway) so the code does + # not need to worry about finding a comma at the end of the line and checking for a double quote at + # the beginning of the next line. + my $comma_index = $index+1; + while ( $comma_index<=$#chars ) + { + last if ( $chars[$comma_index] =~ m/\S/ ); + $comma_index++; + } + my $double_quote_index = $comma_index+1; + while ( $double_quote_index<=$#chars ) + { + last if ( $chars[$double_quote_index] =~ m/\S/ && $chars[$double_quote_index] ne ',' ); + $double_quote_index++; + } + # Is the next non-white space character a comma followed by a double quote? If yes then we + # have reached the end of the field. + if ( ( $comma_index <= $#chars && $chars[$comma_index] eq "," ) && + ( $double_quote_index <= $#chars && $chars[$double_quote_index] eq "\"" ) ) + { + push (@fields,join("",@field_buffer)); + @field_buffer = (); + # Skip past the comma. + $index++; + $in_quote_field = 0; + } + # This quote is at end of the line. Assume it's the last double quote on the CSV line. + elsif ( $index == $#chars ) + { + push (@fields,join("",@field_buffer)); + @field_buffer = (); + $in_quote_field = 0; + } + else + { + push (@field_buffer,$char); + } + + } + } + # + # This check is for empty fields, i.e. "field1",,"field2". + # + elsif ( $char eq "," && ! $in_quote_field ) + { + push (@fields,""); + } + else + { + if ( $in_quote_field ) + { + push (@field_buffer,$char); + } + else + { + # Only allow white space between fields. + error("Found unexpected character $char after phrase '" . + join("",@field_buffer) . + "' on line $line_count in file $input_filename") if ( $char =~ '\S'); + } + } + $index++; + } + + my $next_char = peek(*CSVINPUT); + my $looks_like_end_of_csv_line = $next_char eq "\"" || $next_char eq ""; + + # Do we have all the fields we need? + if ( ($#fields == ($number_of_fields-1)) && (! $in_quote_field) && $looks_like_end_of_csv_line ) + { + print_fields(\*CSVWORK,\@fields,$testcasenamefield,$tcdb_format); + $parse_line = ""; + @fields = (); + } + # Is this the TCDB export error? We have one less field than needed and the next line begins with a + # double quote. + elsif ( ($#fields == ($number_of_fields-2)) && (! $in_quote_field ) && $looks_like_end_of_csv_line ) + { + if ( $_ =~ m/^"/ ) + { + # Pull double quote of the end of the last field. + $fields[$#fields] =~ s/"$//; + # Create the missing field. Need to insert a double quote since print_fields expects a double + # quote at end of last field. + push (@fields,"\""); + print_fields(\*CSVWORK,\@fields,$testcasenamefield,$tcdb_format); + $parse_line = ""; + @fields = (); + } + } + elsif ( $#fields >= $number_of_fields ) + { + error("Read too many lines. Parse line '$parse_line' at line $line_count in file $input_filename"); + } + else + # Not enough fields yet. Need to append a \n to the $parse_line buffer and starting reading + # until we find another double quote at the end of the line. + { + $parse_line .= "\\n"; + } + } + # When End of File is read the parse_line is suppose to be empty. + error("Reached end of file while parsing '$parse_line'") if ( $parse_line ne "" ); + close(CSVINPUT); + close(CSVWORK); + error("Did not find the last double quote in file") if ( $in_quote_field ); + + # + # Sort the corrected CSV to remove duplicate records. + # + if ( $tcdb ) + { + my @args = ( "sort -u -o " . $work_filename . " " . $work_filename ); + system(@args) == 0 or error("Could not sort $work_filename"); + } + + return $field_list; +} + +# +# Remove the leading and trailing white space characters. Remove commas at end of line. +# +sub remove_white_space { + my ($line) = @_; + $line =~ s/^\s+//g; + $line =~ s/\s+$//g; + $line =~ s/,$//g; + + return $line; +} + +# +# Characters that are entities in XML and HTML need to be +# converted to their entity representation. +# +# Some new lines have been showing up as \\n in exports. +# +sub fix_entities { + my ($line) = @_; + $line =~ s/\\n/\n/g; + $line =~ s/\&/&/g; + $line =~ s/\</</g; + $line =~ s/\>/>/g; + $line =~ s/\'/'/g; + $line =~ s/\"/"/g; + + return $line; +} + +GetOptions("debug" => \$debug, "tcdb" => \$tcdb, "help|usage|?" => \$usage); + +pod2usage(0) if $usage; + +error("Must supply a CSV file to convert") if ( $#ARGV == -1 ); +error("Need to supply XML output file") if ( $#ARGV == 0 ); +error("Too many arguments") if ( $#ARGV >= 2 ); + +my $csv_input_filename = $ARGV[0]; +my $xml_output_filename = $ARGV[1]; +my $csv_work_filename = $csv_input_filename . ".work"; +open(XMLOUTPUT, ">", $xml_output_filename) or error("Cannot open file $xml_output_filename"); +my %tcdb_user; +my $field_list = remove_field_list($csv_input_filename,$csv_work_filename,$tcdb); +map_TCDB_users(\%tcdb_user) if ( $tcdb ); + +# +# Process the $field_list variable which comes from the first line of the CSV file. This line +# defines the columns and column order of the CSV file. +# +# Format of the first line should be in the form: +# "Testcase Name","Attributes","Priority","Description","Folder","Creator","Owner", +# "Pass/Fail Definition","Setup Steps","Cleanup Steps","Steps" +# +# Columns currently used if they exist are: +# attributes - split apart at each comma to become a tag. +# category - category for test case. +# cleanupsteps - added to Break Down section. +# component - component for test case. +# description - summary unless testcasename is defined. added to Action section if -tcdb flag +# used. +# environment - split apart at each comma to become a tag. +# folder - only processed if -tcdb option is supplied. split apart at each '/'. based on each +# teams input one field becomes the category and others tags. each team defines which +# sub folders they want to use. +# longdescription - added to Action section if -tcdb flag used. +# owner (required) - in TCDB this is a ID that is mapped to a email address from the file +# tcdbUsers. +# passfaildefinition - added to Expected Results section. +# priority - becomes the priority. I just a number P is prepended. +# resdetails - added to Action section if -tcdb flag used. +# setupsteps - added to Set Up section. +# steps - added to Action section. +# testcasename - becomes the summary. if testcasename is not supplied the description +# is the summary. if testcasename and description are both null a error is +# generated. added to Action section if -tcdb flag used. +# +# The order of the columns is not important. The columns supplied to Class::CSV will be in +# order found on the first line of the CSV file. +# +# The field_list returned from remove_field_list() will have been: +# Transformed to lower case. +# All white space characters removed. +# All double quotes (") removed. +# All forward slashes (/) removed. +# + +# Column name mapping. $field_list contains the name of each column in the CSV file. If your +# column name is that same as a default column name you can covert the column name in $field_list +# and no additional code is needed for the field. +# +# For example if you have a column named 'author' that is really the 'owner' of the Test Case you +# just change 'author' to 'owner' in $field_list. +# +# Add , to front and end of $field_list to make substitution logic easier. They are remove when +# substitutions are finished. +$field_list = ",$field_list,"; +# author is mapped to owner +$field_list =~ s/,author,/,owner,/g; +# result is mapped to passfaildefinition +$field_list =~ s/,result,/,passfaildefinition,/g; +# summary is mapped to testcasename +$field_list =~ s/,summary,/,testcasename,/g; +# tags is mapped to attributes +$field_list =~ s/,tags,/,attributes,/g; +# remove , from beginning of $field_list +$field_list =~ s/^,//; +# remove , from end of $field_list +$field_list =~ s/,$//; + +my %fields; +foreach my $field ( split(/,/,$field_list) ) +{ + $fields{$field} = ""; +} + +my $csv = Class::CSV->parse( + filename => $csv_work_filename, + fields => [ split(/,/,$field_list) ] +); + +print XMLOUTPUT "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n"; +print XMLOUTPUT "<!DOCTYPE testopia [\n"; +my $testopia_dtd = "testopia.dtd"; +open(DTDINPUT,$testopia_dtd) || die "Cannot open $testopia_dtd\n"; +while (<DTDINPUT>) +{ + print XMLOUTPUT $_; +} +close(DTDINPUT); +print XMLOUTPUT "]>\n"; +print XMLOUTPUT "<testopia version=\"1.1\">\n"; + +if ( $TEST_PLAN_AUTHOR ne "Change TEST_PLAN_AUTHOR in import.pl user\@novell.com" ) +{ + print XMLOUTPUT " <testplan author=\"" . $TEST_PLAN_AUTHOR . "\" type=\"System\" archived=\"False\">\n"; + print XMLOUTPUT " <name>" . TEST_PLAN_NAME . "</name>\n"; + print XMLOUTPUT " <product>" . TEST_PLAN_PRODUCT . "</product>\n"; + print XMLOUTPUT " <productversion>" . TEST_PLAN_PRODUCT_VERSION . "</productversion>\n"; + print XMLOUTPUT " <document>" . TEST_PLAN_DOCUMENT . "</document>\n"; + print XMLOUTPUT " </testplan>\n"; +} + +my $line_count = 0; +foreach my $line (@{$csv->lines()}) { + $line_count += 1; + print XMLOUTPUT " <testcase "; + + error("No owner for Test Case at line $line_count in $csv_work_filename") if ( ! defined($fields{'owner'}) ); + my $owner = $line->owner(); + $owner = $tcdb_user{$line->owner()} if ( $tcdb ); + error("Could not find owner for Test Case at line $line_count in $csv_work_filename") if ( $owner eq "" ); + + print XMLOUTPUT "author=\"" . fix_entities($owner) . "\" "; + if ( defined($fields{'priority'}) ) + { + my $priority = fix_entities($line->priority()); + $priority =~ s/ .*//g; + $priority = uc $priority; + $priority = "P5" if ( $priority eq "" ); + $priority = "P" . $priority if ( ! ( $priority =~ m/^P.*/ ) ); + print XMLOUTPUT "priority=\"" . fix_entities($priority) . "\" "; + } + print XMLOUTPUT "automated=\"Manual\" "; + print XMLOUTPUT "status=\"CONFIRMED\">\n"; + print XMLOUTPUT " <testplan_reference type=\"" . TEST_PLAN_NAME_TYPE . "\">" . TEST_PLAN_NAME . "</testplan_reference>\n"; + my $summary; + if ( defined($fields{'testcasename'}) ) + { + $summary = fix_entities($line->testcasename()); + } + elsif ( defined($fields{'description'}) ) + { + $summary = fix_entities($line->description()); + } + if ( defined($fields{'environment'}) ) + { + my $environment = $line->environment(); + $summary .= " - " . fix_entities($environment) if ( $environment ne "" ); + } + error("No summary for Test Case at line $line_count in $csv_work_filename") if ( $summary eq "" ); + print XMLOUTPUT " <summary>" . $summary . "</summary>\n"; + print XMLOUTPUT " <defaulttester>" . fix_entities($owner) . "</defaulttester>\n"; + if ( $tcdb && defined($fields{'folder'}) ) + { + my @folder = split(/\\/,$line->folder()); + print XMLOUTPUT " <tag>" . fix_entities($folder[4]) . "</tag>\n" if ( defined( $folder[4] ) ); + if ( defined($fields{'category'}) ) + { + print XMLOUTPUT " <tag>" . fix_entities($folder[5]) . "</tag>\n" if ( defined( $folder[5] ) ); + } + else + { + print XMLOUTPUT " <categoryname>" . fix_entities($folder[5]) . "</categoryname>\n" if ( defined( $folder[5] ) ); + } + my $fieldstart = 6; + while ( defined $folder[$fieldstart] ) + { + print XMLOUTPUT " <tag>" . fix_entities($folder[$fieldstart]) . "</tag>\n"; + $fieldstart += 1; + } + } + if ( defined($fields{'attributes'}) ) + { + my @attributes = split(/,/,$line->attributes()); + foreach my $attribute (@attributes) + { + print XMLOUTPUT " <tag>" . fix_entities(remove_white_space($attribute)) . "</tag>\n"; + } + } + if ( defined($fields{'environment'}) ) + { + my @environments = split(/,/,$line->environment()); + + foreach my $environment (@environments) + { + print XMLOUTPUT " <tag>" . fix_entities(remove_white_space($environment)) . "</tag>\n"; + } + } + if ( defined($fields{'component'}) && ( $line->component() ne "") ) + { + print XMLOUTPUT " <component product=\"" . TEST_PLAN_PRODUCT . "\">" . fix_entities(remove_white_space($line->component())) . "</component>\n"; + } + if ( defined($fields{'category'}) && ( $line->category() ne "") ) + { + print XMLOUTPUT " <categoryname>" . fix_entities(remove_white_space($line->category())) . "</categoryname>\n"; + } + if ( defined($fields{'setupsteps'}) && ( $line->setupsteps() ne "") ) + { + print XMLOUTPUT " <setup>"; + print XMLOUTPUT "[TCDB Setup Steps]\n" if ( $tcdb ); + print XMLOUTPUT fix_entities($line->setupsteps()); + print XMLOUTPUT "</setup>\n"; + } + if ( defined($fields{'cleanupsteps'}) && ( $line->cleanupsteps() ne "") ) + { + print XMLOUTPUT " <breakdown>"; + print XMLOUTPUT "[TCDB Cleanup Steps]\n" if ( $tcdb ); + print XMLOUTPUT fix_entities($line->cleanupsteps()); + print XMLOUTPUT "</breakdown>\n"; + } + print XMLOUTPUT " <action>"; + if ( $tcdb ) + { + if ( defined($fields{'testcasename'}) && ( $line->testcasename() ne "") ) + { + print XMLOUTPUT "[TCDB Test Case Name]\n"; + print XMLOUTPUT fix_entities($line->testcasename()); + } + if ( defined($fields{'description'}) && ( $line->description() ne "") ) + { + print XMLOUTPUT "\n\n[TCDB Description]\n"; + print XMLOUTPUT fix_entities($line->description()); + } + if ( defined($fields{'longdescription'}) && ( $line->longdescription() ne "") ) + { + print XMLOUTPUT "\n\n[TCDB Long Description]\n"; + print XMLOUTPUT fix_entities($line->longdescription()); + } + if ( defined($fields{'resdetails'}) && ( $line->resdetails() ne "") ) + { + print XMLOUTPUT "\n\n[TCDB Resolution Details]\n"; + print XMLOUTPUT fix_entities($line->resdetails()); + } + } + if ( defined($fields{'steps'}) && ( $line->steps() ne "") ) + { + print XMLOUTPUT "\n\n[TCDB Steps]\n" if ( $tcdb ); + print XMLOUTPUT fix_entities($line->steps()); + } + print XMLOUTPUT "</action>\n"; + if ( defined($fields{'passfaildefinition'}) && ( $line->passfaildefinition() ne "") ) + { + print XMLOUTPUT " <expectedresults>"; + print XMLOUTPUT "[TCDB Pass Fail Definition]\n" if ( $tcdb ); + print XMLOUTPUT fix_entities($line->passfaildefinition()); + print XMLOUTPUT "</expectedresults>\n"; + } + print XMLOUTPUT " </testcase>\n"; + } +print XMLOUTPUT "</testopia>\n"; + +unlink $csv_work_filename; + +exit 0; + +__END__ + diff --git a/tr_draw.cgi b/tr_draw.cgi new file mode 100644 index 0000000..3751d97 --- /dev/null +++ b/tr_draw.cgi @@ -0,0 +1,37 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; + +Bugzilla->login(LOGIN_REQUIRED); +use vars qw($vars); + +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; +print $cgi->header; + +$vars->{'txt'} = $cgi->param('text'); +$template->process("testopia/text.png.tmpl", $vars) + || ThrowTemplateError($template->error()); diff --git a/tr_export_environment.cgi b/tr_export_environment.cgi new file mode 100755 index 0000000..6002ef6 --- /dev/null +++ b/tr_export_environment.cgi @@ -0,0 +1,68 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Garrett Braden <garrett@tnbd.org> + +# This script expects an env_id in the query string pointing to the +# environment that you want to export to XML and displays the XML in +# a html textarea. + + +=head1 NAME + +tr_export_environment.cgi + +=head1 DESCRIPTION + +Exports an Environment by env_id from the database to XML and displays the XML in +a html textarea. + +=cut + +#************************************************** Uses ****************************************************# +use strict; +use CGI; +use lib "."; +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Environment::Xml; +use vars qw($vars); + +#************************************ Variable Declarations/Initialization **********************************# +Bugzilla->login(LOGIN_REQUIRED); +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; +my $env_id = $cgi->param('env_id'); + +#********************************************* UI Logic ************************************************# +print $cgi->header; +my $env = Bugzilla::Testopia::Environment->new($env_id); +ThrowUserError("testopia-read-only", {'object' => $env}) unless $env->canview; +my $xml = Bugzilla::Testopia::Environment::Xml->export($env_id); +if (!defined($xml)) { + $vars->{'tr_error'} .= "Exporting XML Environment Failed. Please try again.<BR/>"; +} +$vars->{'xml'} = $xml; +$template->process("testopia/environment/export.xml.tmpl", $vars) || print $template->error(); diff --git a/tr_import_environment.cgi b/tr_import_environment.cgi new file mode 100755 index 0000000..1042d03 --- /dev/null +++ b/tr_import_environment.cgi @@ -0,0 +1,346 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Garrett Braden <garrett@tnbd.org> + +# This script reads in an environment in xml and persists it to the database. + + +=head1 NAME + +tr_import_environment.cgi - Imports an environment from a XML file into the database. + +=head1 DESCRIPTION + +Administrator's and testopia users can import an environment from XML into the database. +A tool is being designed to automatically scan a system and create such an XML file to +import. + +=cut + +#************************************************** Uses ****************************************************# +use strict; +use CGI; +use lib "."; +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Environment::Xml; +use Data::Dumper; +use vars qw($vars); + +#************************************ Variable Declarations/Initialization **********************************# +Bugzilla->login(LOGIN_REQUIRED); +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; +my $upload_dir = "testopia/temp"; +my $env_filename = $cgi->param('env_file'); +my $env_fh = $cgi->upload('env_file'); +my $action = $cgi->param('action') || ''; +my $xml = $cgi->param('xml'); +my $submit = $cgi->param('submit'); +my $environment = Bugzilla::Testopia::Environment->new({'environment_id' => 0}); +my $user_can_edit = $environment->canedit; +#my $user_can_edit = 0; # Remove on production <- used to toggle user's rights. +my $message = ''; +$CGI::POST_MAX = 1024 * 500; # max file size 500K + +#***************************************** UI Logic ************************************************************# +print $cgi->header; +# Make sure the file isn't too big. +if (!$env_filename && $cgi->cgi_error()) { + $vars->{'tr_error'} .= "File size cannot exceed 500K.<BR/>"; +} +# Upload the file and read it into a string if it's been posted. +if ($action eq 'import' && $env_filename) { + trick_taint($env_filename); + # Continue only if import exits without errors, otherwise display the errors. + if (slurp_env_file() && $xml && import()) { + # Check for new data + if (check_new_items()) { + if (write_env_file()) { + # If there's new data and the user can edit have them approve the changes. + if ($user_can_edit) { + admin_approve(); + } + else { + $vars->{'tr_error'} .= "Please contact an admin who can import the above mentioned non-existing data.<BR/>"; + } + } + } + # If there's no new Categories, Elements, or Properties then store the environment. + else { + store_environment(); # Stores the new Environment values based on existing Categories, Elements, Properties, and Valid Expressions. + } + } +} +# If the admin form posted +elsif ($action eq 'admin' && $xml) { + if ($user_can_edit) { + my $file = "$upload_dir/$xml"; + trick_taint($file); + # If the admin clicked the 'Add Now' and not the 'Cancel' button + if ($submit eq 'Add Now') { + if (read_env_file($file)) { + import("admin"); # Creates Bugzilla::Testopia::Environment::Xml object and store's it to the database. + } + } + else { + $vars->{'tr_error'} .= "Import XML Environment Cancelled.<BR/>"; + delete_env_file($file); + } + } + else { + $vars->{'tr_error'} .= "Error reading from file. Please try again.<BR/>If the problem persists please contact the site administrator.<BR/>"; + } +} +display(); +#*********************************************** EXISTS HERE *************************************************# + + + + +#************************************* Sub Routine Deffinitions Below ****************************************# + + +=head2 Create XML document + +=head2 DESCRIPTION + +Creates the Environment XML Document and node lists. + +=cut + +sub import { + # If the user is an admin and has approved to add the values pass 1 to parse(). + my $admin = @_; + $environment = Bugzilla::Testopia::Environment::Xml->new($xml, $admin); + if ($environment->{'error'}) { + $vars->{'tr_error'} .= $environment->{'error'}; + return 0; + } + return 1; +} + + +=head2 Checking Exists + +=head2 DESCRIPTION + +Checking if the Environment, Elements, Categories, and Properties already exist or not. + +=cut + +sub check_new_items { + return $environment->check_new_items(); +} + + +=head2 Admin Approve + +=head2 Description + +Prepares the $vars being passed to the template to display the +Admin Approval Form first before importing an environment with +new data. + +=cut + +sub admin_approve { + $vars->{'action'} = "admin"; + $vars->{'xml'} = $xml; +} + + +=head2 Store the Environment + +=head2 Description + +Stores the Environment based on existing Categories, Elements, Properties, and selectable values. + +=cut + +sub store_environment { + $environment->store(); +} + + +=head2 Upload and read the XML file + +=head2 Description + +Uploads and reads the XML Environment file and prepares it into an array for parsing. + +=cut + +sub slurp_env_file { + my $untainted_filename; + my $post_max = $CGI::POST_MAX; + if (!$env_filename) { + $vars->{'tr_error'} .= "Please upload an Environment XML file.<BR/>"; + return 0; + } + # untaint $env_file + if ($env_filename =~ /^([-\@:\/\\\w.]+)$/) { + $untainted_filename = $1; + } + else { + $vars->{'tr_error'} .= "The filename must contain numbers and letters only. Please try again.<BR/>"; + return 0; + } + if ($untainted_filename =~ m/\.\./) { + $vars->{'tr_error'} .= "The filename cannot conain the sequence '..' Please try again.<BR/>"; + return 0; + } + my $num_bytes = $CGI::POST_MAX; + my ($totalbytes, $byteswritten, $buffer); + while ($byteswritten = read($env_fh, $buffer, $num_bytes)) { + $xml .= $buffer; + $totalbytes += $num_bytes; + } + if (!($byteswritten && $totalbytes)) { + $vars->{'error'} .= "Problem uploading file " . $env_filename . ".<BR/>" + } + if (!$xml) { + $vars->{'tr_error'} .= "File is empty. Please upload a valid Environment XML file.<BR/>"; + return 0; + } + if (length($xml) > $post_max) { + $vars->{'tr_error'} .= "File uploaded was too large. Please make sure the file size is no bigger than 500 KB.<BR/>"; + return 0; + } + return 1; +} + + +=head2 Write the Environment XML File to the Server + +=head Description + +Writes the environment XML File to the $upload_dir directory where it will be read in later by the admin to be approved. Once approved it's deleted. + +=cut + +sub write_env_file { + # If a writable $upload_dir exists, log error details there. + if (-w "$upload_dir") { + my $timestamp = Bugzilla::Testopia::Util::get_time_stamp(); + my $filename = $env_filename; + $filename =~ s/(.xml)//; + $filename .= "_" . $timestamp; + $filename =~ s/\:/./g; + $filename =~ s/[\: -]/_/g; + $filename .= ".xml"; + my $untainted_filename; + if (!$filename) { + $vars->{'tr_error'} .= "Please upload an Environment XML file.<BR/>"; + return 0; + } + # untaint $env_file + if ($filename =~ /^([-\@:\/\\\w.]+)$/) { + $untainted_filename = $1; + } + else { + $vars->{'tr_error'} .= "The filename must contain numbers and letters only. Please try again.<BR/>"; + return 0; + } + if ($untainted_filename =~ m/\.\./) { + $vars->{'tr_error'} .= "The filename cannot conain the sequence '..' Please try again.<BR/>"; + return 0; + } + open (my $fh, ">$upload_dir/$filename") || die "PROBLEM WRITING FILE.<BR/>"; + print $fh $xml; + close $fh; + $xml = $filename; + } + else { + $vars->{'tr_error'} .= "Unable to write temporary environment file. Please try again.<BR/>If the problem persists please contact the site administrator.<BR/>"; + return 0; + } + return 1; +} + + +=head2 Read the uploaded Environment XML file + +=head2 Description + +Uploads and reads the XML Environment file and prepares it into an array for parsing. + +=cut + +sub read_env_file { + my ($file) = @_; + $xml = ''; + open (my $fh, "<$file") || do { + $vars->{'tr_error'} .= "Unable to read temporary environment file. Please to try again.<BR/>If the problem persists please contact the site administrator.<BR/>"; + return 0; + }; + binmode($fh); + while (<$fh>) { + $xml .= $_; + } + close $fh; + if (!$xml) { + $vars->{'tr_error'} .= "File is empty. Please upload a valid Environment XML file.<BR/>"; + return 0; + } + if (length($xml) > $CGI::POST_MAX) { + $vars->{'tr_error'} .= "File uploaded was too large. Please make sure the file size is no bigger than 500 KB.<BR/>"; + return 0; + } + return delete_env_file($file); +} + + +=head2 delete_env_file + +=head2 Description + +Deletes the temporary environment file. + +=cut + +sub delete_env_file { + my ($file) = @_; + if (!unlink($file)) { + $vars->{'tr_error'} .= "Unable to delete temporary environment file.<BR/>If the problem persists please contact the site administrator.<BR/>"; + return 0; + } + return 1; +} + + +=head2 Display + +=head2 Description + +Displays the Import Environment template + +=cut + +sub display { + $vars->{'tr_message'} .= $message . $environment->{'message'}; + $template->process("testopia/environment/import.xml.tmpl", $vars) || print $template->error(); +} \ No newline at end of file diff --git a/tr_importxml.pl b/tr_importxml.pl new file mode 100644 index 0000000..f59d8da --- /dev/null +++ b/tr_importxml.pl @@ -0,0 +1,144 @@ +#!/usr/bin/perl -w +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# The Initial Developer of the Original Code is Netscape Communications +# Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): Dawn Endico <endico@mozilla.org> +# Gregary Hendricks <ghendricks@novell.com> +# Vance Baarda <vrb@novell.com> + + +# This script reads in xml bug data from standard input and inserts +# a new bug into bugzilla. Everything before the beginning <?xml line +# is removed so you can pipe in email messages. + +use strict; + +# figure out which path this script lives in. Set the current path to +# this and add it to @INC so this will work when run as part of mail +# alias by the mailer daemon +# since "use lib" is run at compile time, we need to enclose the +# $::path declaration in a BEGIN block so that it is executed before +# the rest of the file is compiled. +BEGIN { + $::path = $0; + $::path =~ m#(.*)/[^/]+#; + $::path = $1; + $::path ||= '.'; # $0 is empty at compile time. This line will + # have no effect on this script at runtime. +} + +chdir $::path; +use lib ($::path); + +use Bugzilla::Util; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Xml; + +use XML::Twig; +use Getopt::Long; +use Pod::Usage; + +require "globals.pl"; + +my $debug = 0; +my $help = 0; + +my $result = GetOptions("verbose|debug+" => \$debug, + "help|?" => \$help); + +pod2usage(0) if $help; + +use constant DEBUG_LEVEL => 2; +use constant ERR_LEVEL => 1; + +sub Debug { + return unless ($debug); + my ($message, $level) = (@_); + print STDERR "ERR: ". $message ."\n" if ($level == ERR_LEVEL); + print STDERR "$message\n" if (($debug == $level) && ($level == DEBUG_LEVEL)); +} + +Debug("Reading xml", DEBUG_LEVEL); + +my $xml; +my $filename; +if ( $#ARGV == -1 ) +{ + # Read STDIN in slurp mode. VERY dangerous, but we live on the wild side ;-) + local($/); + $xml = <>; +} +elsif ( $#ARGV == 0 ) +{ + $filename = $ARGV[0]; +} +else +{ + pod2usage(0); +} + +Debug("Parsing tree", DEBUG_LEVEL); + +my $testopiaXml = Bugzilla::Testopia::Xml->new(); +$testopiaXml->parse($xml,$filename); + +exit 0; + +__END__ + +=head1 NAME + +tr_importxml - Import Testopia data from xml. + +=head1 SYNOPSIS + + tr_importxml.pl [options] [file] + + Options: + -? --help Brief help message. + -v --verbose Print error and debug information. + Multiple -v options increase verbosity. + + With no file read standard input. + +=head1 OPTIONS + +=over 8 + +=item B<-?> + + Print a brief help message and exits. + +=item B<-v> + + Print error and debug information. Mulltiple -v increases verbosity + +=back + +=head1 DESCRIPTION + + This script is used import Test Plans and Test Cases into Testopia. + + +=cut diff --git a/tr_install.pl b/tr_install.pl new file mode 100644 index 0000000..2779f3f --- /dev/null +++ b/tr_install.pl @@ -0,0 +1,862 @@ +#!/usr/bin/perl -w +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Maciej Maczynski <macmac@xdsnet.pl> +# Ed Fuentetaja <efuentetaja@acm.org> +# Vance Baarda <vrb@novell.com> + +use File::Copy; +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::DB; + +my $VERSION = "1.2"; + +#check that we are on the Bugzilla's directory: + +if (! -e "testopia") { + # I don't know where the heck I am + DieWithStyle("Please unpack Testopia's distribution file and run this script from within Bugzilla's directory.\n". + "Can't continue.\n"); +} + +# use localconfig file default or as specified by $PROJECT variable +our $project; +our $localconfig; +if ($ENV{'PROJECT'} && $ENV{'PROJECT'} =~ /^(\w+)$/) { + $project = $1; + $localconfig = "localconfig.$project"; +} else { + $localconfig = "localconfig"; +} + +if (! -e "$localconfig") { + DieWithStyle("Can't find file: $localconfig\nBugzilla is not installed in this directory.\n". + "Can't continue.\n"); +} + +############################################################################## +print "Now installing Testopia using $localconfig...\n\n"; +do "$localconfig"; +############################################################################## +# Patching. +my $rollbackPatchOnFail = 0; +my $patchSuccessFile = "testopia/tr_patch_successful"; +my @files = (); + +my $patchFile = $ARGV[0]; + +if ($patchFile && $patchFile eq "-nopatch") { + #skip patching + print "Skip patching Bugzilla's files.\n"; +} else { + doPatch($patchFile); +} +############################################################################## +print "\nSetting file permissions ...\n"; +SetupPermissions(); +print "Done.\n\n"; +############################################################################## +print "Checking Testopia database ...\n"; +my $dbh = Bugzilla::DB::connect_main(); +UpdateDB($dbh); +print "Done.\n\n"; +############################################################################## +print "Checking Testopia group ...\n"; +# Create group if needed and grant permissions to the admin group over it. +my $adminid = GetAdminGroup($dbh); +my $groupid; +if (!GroupExists($dbh, "Testers")) { + $groupid = tr_AddGroup($dbh, 'Testers', + 'Can read, write, and delete all test plans, runs, and cases.', $adminid); + tr_AssignAdminGrants($dbh, $groupid, $adminid); +} +updateACLs($dbh); +migrateAttachments($dbh); +print "Done.\n\n"; +############################################################################## +print "Cleaning up Testopia cache ...\n"; +unlink "data/plancache"; +print "Done.\n\n"; + +print "Testopia installed successfully!\n"; +############################################################################## +1; +############################################################################## + +sub doPatch { + my ($fPatch) = @_; + + if (-e $patchSuccessFile) { + print "Patch already run successfully. Skipping.\n"; + return 1; + } + + print "Patching Bugzilla's files ...\n"; + + if ($fPatch) { + # check that the patch file exists: + if (!-e $fPatch) { + DieWithStyle("Cannot find patch file: $fPatch\n". + "Please, double-check the patch's file name and try again."); + } + + print "\nUsing patch file: $fPatch\n\n"; + + } else { + # Guess the patch file to use: + print "\nNo patch file specified, trying to determine the right one to use ...\n\n"; + + print "Bugzilla version ".$Bugzilla::Config::VERSION." detected.\n"; + + # This piece of code needs to be modified when a new patch file is added to the distribution: + + if ($Bugzilla::Config::VERSION =~ /^2\.22\.1$/) { + # version 2.20.* detected + $fPatch = "patch-2.22.1"; + } elsif ($Bugzilla::Config::VERSION =~ /^2\.22\.2$/) { + # version 2.20.* detected + $fPatch = "patch-2.22.2"; + } elsif ($Bugzilla::Config::VERSION =~ /^2\.22.*/) { + # version 2.20.* detected + $fPatch = "patch-2.22"; + } else { + # no suitable version available + DieWithStyle("No suitable patch detected for your Bugzilla. Patch cannot continue.\n". + "Still, there is a chance that a manual patch might work on your installation. Please, check out Testopia's installation manual for details."); + } + + print "Patch file chosen: $fPatch\n\n"; + + if (isWindows()) { + $fPatch = "testopia\\".$fPatch; + } else { + $fPatch = "testopia/".$fPatch; + } + } + + # Read the files involved in the patch and put them in @files + readPatchFiles($fPatch, \@files); + + # Now, let's go ahead and run the patch command: + + print "Now patching ...\n\n"; + + my $patchPath = isWindows() ? + "testopia\\tools\\patch.exe --binary" : "patch"; + my $no_patch_msg = isWindows() ? + "Cannot find patch.exe. Please see testopia\\tools\\readme for " . + "instructions.\n" : + "Cannot find the patch command. Is it installed and in your PATH?\n"; + `$patchPath -v` || DieWithStyle($no_patch_msg); + + my $output = `$patchPath -s -l --dry-run -b -p0 -i $fPatch 2>&1`; + + # If the output is empty, everything was perfect (the -s argument) + chomp $output; + if ($output) { + + # Nope... the patch didn't apply correctly: + + # Print out the output: + print $output; + + DieWithStyle ("\n*** Patching of Bugzilla's files failed. None of your files has been modified.\n". + "\n". + "Some possible reasons:\n". + "\n". + "- Your Bugzilla installation has been modified from the original.\n". + "> Please scroll up and see if the patch command output you can see above gives you any clue. Consult Testopia's installation manual and get ready for some manual patching.\n". + "\n". + "- The patch file used was the wrong version.\n". + "> If you didn't especify the patch file to use, maybe this installation script picked up the wrong one. ". + "In this case, please, check out in the testopia directory the list of available patch files (files named as patch*) and run the install script especifying the file to use, according to the Bugzilla's version you are using. ". + "For instance, if you are using Bugzilla version 2.19.2, this is the command line you should use:\n". + " tr_install.pl testopia/patch-2.19.2\n". + "> If you did in fact especify a patch file on the command line, please, double-check your Bugzilla version and the patch file you used and try again.\n". + "\n". + "- Testopia is not prepared to work with this particular version of Bugzilla.\n". + "> Please, check the documentation. Verify that this version of Bugzilla is supported.\n". + "\n". + "If you still have problems, please, check out Testopia's installation manual again and, if nothing helps, report the problem to Testopia sourceforge forum at http://sourceforge.net/projects/testopia."); + + } + + $rollbackPatchOnFail = 1; + + #Now let's really run the patch: + $output = `$patchPath -s -l -z .orig -bp 0 -i $fPatch`; + + # If the output is empty, everything was perfect (the -s argument) + chomp $output; + if ($output) { + + # Nope... the patch didn't apply correctly: + + # Print out the output: + print $output; + + DieWithStyle ("\n*** Unexpected condition. Patch failed, but I was pretty sure it should have worked.\n". + "Try to repeat the installation.\n"); + } + + $rollbackPatchOnFail = 0; + + print "\nDone.\n"; + + restorePermissions(); + + open(MYOUTPUTFILE, ">$patchSuccessFile") or DieWithStyle("Couldn't write file: $patchSuccessFile"); + print MYOUTPUTFILE $VERSION; + close(MYOUTPUTFILE); + + print "\nCongratulations, patch worked flawlessly!\n\n"; + print "A backup copy of the modified files has been saved with the .orig sufix.\n"; + print "\nBecause tr_install has patched some Bugzilla files, please run tr_install\n"; + print "again to finish the installation.\n"; + exit 0; +} + +sub isWindows { + return ($^O eq "MSWin32" || $^O eq "cygwin"); +} + +sub SetupPermissions { + if (isWindows()) { + SetupPermissions_windows(); + } else { + SetupPermissions_unix(); + } +} + +sub SetupPermissions_windows { + print "Running on Windows or Cygwin... skipping permissions...\n"; +} + +sub SetupPermissions_unix { + `chmod 750 tr_*.cgi`; + `chmod 640 tr_*.pl`; + `chmod 750 tr_install.pl`; + `chmod 750 testopia`; + `chmod -R 750 testopia/doc`; + `chmod -R 750 testopia/img`; + `chmod -R 750 testopia/css`; + `chmod -R 750 testopia/js`; + `chmod -R 750 testopia/dojo`; + `chmod -R 750 testopia/scripts`; + `chmod 770 testopia/temp`; + if (defined $::webservergroup && ($::webservergroup ne '')) { + `chown :$::webservergroup tr_*`; + `chown :$::webservergroup testopia`; + `chown -R :$::webservergroup testopia/doc`; + `chown -R :$::webservergroup testopia/img`; + `chown -R :$::webservergroup testopia/css`; + `chown -R :$::webservergroup testopia/js`; + `chown -R :$::webservergroup testopia/dojo`; + `chown -R :$::webservergroup testopia/scripts`; + `chown :$::webservergroup testopia/temp`; + } +} + +sub UpdateDB { + my ($dbh) = (@_); + + # If the database contains Testopia tables but bz_schema doesn't + # know about them, then we need to update bz_schema. + if (grep(/^test_cases$/, $dbh->bz_table_list_real) and + !$dbh->_bz_real_schema->get_table_abstract('test_cases')) { + my $msg = "Sorry, we cannot upgrade from Testopia 1.0 using this " . + "database. Upgrades are supported only with MySQL."; + DieWithStyle($msg) unless $dbh->isa('Bugzilla::DB::Mysql'); + my $built_schema = $dbh->_bz_build_schema_from_disk; + foreach my $table (grep(/^test_/, $built_schema->get_table_list())) { + $dbh->_bz_real_schema->add_table($table, + $built_schema->get_table_abstract($table)); + } + $dbh->_bz_store_real_schema; + } + + $dbh->bz_setup_database(); + + $dbh->bz_drop_table('test_case_group_map'); + $dbh->bz_drop_table('test_category_templates'); + $dbh->bz_drop_table('test_plan_testers'); + $dbh->bz_drop_table('test_plan_group_map'); + $dbh->bz_drop_column('test_plans', 'editor_id'); + + $dbh->bz_add_column('test_case_bugs', 'case_id', {TYPE => 'INT4', UNSIGNED => 1}); + $dbh->bz_add_column('test_case_runs', 'environment_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}, 0); + $dbh->bz_add_column('test_case_tags', 'userid', {TYPE => 'INT3', NOTNULL => 1}, 0); + $dbh->bz_add_column('test_case_texts', 'setup', {TYPE => 'MEDIUMTEXT'}); + $dbh->bz_add_column('test_case_texts', 'breakdown', {TYPE => 'MEDIUMTEXT'}); + $dbh->bz_add_column('test_environments', 'product_id', {TYPE => 'INT2', NOTNULL => 1}, 0); + $dbh->bz_add_column('test_environments', 'isactive', {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, 1); + $dbh->bz_add_column('test_plan_tags', 'userid', {TYPE => 'INT3', NOTNULL => 1}, 0); + $dbh->bz_add_column('test_runs', 'default_tester_id', {TYPE => 'INT3'}); + $dbh->bz_add_column('test_run_tags', 'userid', {TYPE => 'INT3', NOTNULL => 1}, 0); + $dbh->bz_add_column('test_builds', 'isactive', {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '1'}, 1); + $dbh->bz_add_column('test_cases', 'estimated_time', {TYPE => 'TIME'}, 0); + $dbh->bz_add_column('test_case_runs', 'running_date', {TYPE => 'DATETIME'}, 0); + $dbh->bz_add_column('test_plan_types', 'description', {TYPE => 'MEDIUMTEXT'}, 0); + $dbh->bz_add_column('test_case_status', 'description', {TYPE => 'MEDIUMTEXT'}, 0); + $dbh->bz_add_column('test_case_run_status', 'description', {TYPE => 'MEDIUMTEXT'}, 0); + + fixTables($dbh); + + $dbh->bz_alter_column('test_attachment_data', 'attachment_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_attachments', 'attachment_id', {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_attachments', 'creation_ts', {TYPE => 'DATETIME', NOTNULL => 1}); + $dbh->bz_alter_column('test_builds', 'build_id', {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_activity', 'case_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_bugs', 'case_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_bugs', 'case_run_id', {TYPE => 'INT4', UNSIGNED => 1}); + $dbh->bz_alter_column('test_case_components', 'case_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_dependencies', 'blocked', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_dependencies', 'dependson', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_plans', 'case_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_plans', 'plan_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_runs', 'build_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_runs', 'case_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_runs', 'case_run_id', {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_runs', 'environment_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_runs', 'iscurrent', {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => '0'}); + $dbh->bz_alter_column('test_case_runs', 'run_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_run_status', 'case_run_status_id', {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_cases', 'case_id', {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_status', 'case_status_id', {TYPE => 'TINYSERIAL', PRIMARYKEY => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_tags', 'case_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_texts', 'case_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_case_texts', 'creation_ts', {TYPE => 'DATETIME', NOTNULL => 1}); + $dbh->bz_alter_column('test_environment_map', 'environment_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_environments', 'environment_id', {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_named_queries', 'isvisible', {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 1}); + $dbh->bz_alter_column('test_plan_activity', 'plan_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_plans', 'plan_id', {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_plan_tags', 'plan_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_plan_texts', 'creation_ts', {TYPE => 'DATETIME', NOTNULL => 1}); + $dbh->bz_alter_column('test_plan_texts', 'plan_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_plan_texts', 'plan_text', {TYPE => 'MEDIUMTEXT'}); + $dbh->bz_alter_column('test_run_activity', 'run_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_run_cc', 'run_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_runs', 'build_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_runs', 'environment_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_runs', 'plan_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_runs', 'run_id', {TYPE => 'INTSERIAL', PRIMARYKEY => 1, NOTNULL => 1}); + $dbh->bz_alter_column('test_runs', 'start_date', {TYPE => 'DATETIME', NOTNULL => 1}); + $dbh->bz_alter_column('test_run_tags', 'run_id', {TYPE => 'INT4', UNSIGNED => 1, NOTNULL => 1}); + + $dbh->bz_drop_index('test_attachments', 'AI_attachment_id'); + $dbh->bz_drop_index('test_attachments', 'attachment_id'); + $dbh->bz_drop_index('test_builds', 'build_id'); + $dbh->bz_drop_index('test_case_bugs', 'case_run_bug_id_idx'); + $dbh->bz_drop_index('test_case_bugs', 'case_run_id_idx'); + $dbh->bz_drop_index('test_case_categories', 'AI_category_id'); + $dbh->bz_drop_index('test_case_categories', 'category_name_idx'); + $dbh->bz_drop_index('test_case_categories', 'category_name_indx'); + $dbh->bz_drop_index('test_case_components', 'case_commponents_component_id_idx'); + $dbh->bz_drop_index('test_case_components', 'case_components_case_id_idx'); + $dbh->bz_drop_index('test_case_components', 'case_components_component_id_idx'); + $dbh->bz_drop_index('test_case_plans', 'case_plans_case_id_idx'); + $dbh->bz_drop_index('test_case_plans', 'case_plans_plan_id_idx'); + $dbh->bz_drop_index('test_case_runs', 'AI_case_run_id'); + $dbh->bz_drop_index('test_case_runs', 'case_run_build_idx'); + $dbh->bz_drop_index('test_case_runs', 'case_run_env_idx'); + $dbh->bz_drop_index('test_case_runs', 'case_run_id'); + $dbh->bz_drop_index('test_case_runs', 'case_run_id_2'); + $dbh->bz_drop_index('test_case_runs', 'case_run_run_id_idx'); + $dbh->bz_drop_index('test_case_runs', 'case_run_shortkey_idx'); + $dbh->bz_drop_index('test_case_runs', 'case_run_sortkey_idx'); + $dbh->bz_drop_index('test_case_run_status', 'AI_case_run_status_id'); + $dbh->bz_drop_index('test_case_run_status', 'case_run_status_name_idx'); + $dbh->bz_drop_index('test_case_run_status', 'case_run_status_sortkey_idx'); + $dbh->bz_drop_index('test_case_run_status', 'sortkey'); + $dbh->bz_drop_index('test_cases', 'AI_case_id'); + $dbh->bz_drop_index('test_cases', 'alias'); + $dbh->bz_drop_index('test_cases', 'case_id'); + $dbh->bz_drop_index('test_cases', 'case_id_2'); + $dbh->bz_drop_index('test_case_status', 'AI_case_status_id'); + $dbh->bz_drop_index('test_case_status', 'case_status_id'); + $dbh->bz_drop_index('test_case_status', 'test_case_status_name_idx'); + $dbh->bz_drop_index('test_cases', 'test_case_requirment_idx'); + $dbh->bz_drop_index('test_case_tags', 'case_tags_case_id_idx'); + $dbh->bz_drop_index('test_case_tags', 'case_tags_case_id_idx_v2'); + $dbh->bz_drop_index('test_case_tags', 'case_tags_tag_id_idx'); + $dbh->bz_drop_index('test_case_tags', 'case_tags_user_idx'); + $dbh->bz_drop_index('test_email_settings', 'test_event_user_event_dx'); + $dbh->bz_drop_index('test_email_settings', 'test_event_user_event_idx'); + $dbh->bz_drop_index('test_email_settings', 'test_event_user_relationship_idx'); + $dbh->bz_drop_index('test_environment_category', 'env_category_idx'); + $dbh->bz_drop_index('test_environment_element', 'env_element_category_idx'); + $dbh->bz_drop_index('test_environment_property', 'env_element_property_idx'); + $dbh->bz_drop_index('test_environments', 'environment_id'); + $dbh->bz_drop_index('test_environments', 'environment_name_idx'); + $dbh->bz_drop_index('test_fielddefs', 'AI_fieldid'); + $dbh->bz_drop_index('test_fielddefs', 'fielddefs_name_idx') if $dbh->isa('Bugzilla::DB::Mysql'); + $dbh->bz_drop_index('test_fielddefs', 'test_fielddefs_name_idx'); + $dbh->bz_drop_index('test_plans', 'AI_plan_id'); + $dbh->bz_drop_index('test_plans', 'plan_id'); + $dbh->bz_drop_index('test_plans', 'plan_id_2'); + $dbh->bz_drop_index('test_plan_tags', 'plan_tags_idx'); + $dbh->bz_drop_index('test_plan_tags', 'plan_tags_user_idx'); + $dbh->bz_drop_index('test_plan_types', 'AI_type_id'); + $dbh->bz_drop_index('test_plan_types', 'plan_type_name_idx'); + $dbh->bz_drop_index('test_run_cc', 'run_cc_run_id_who_idx'); + $dbh->bz_drop_index('test_runs', 'AI_run_id'); + $dbh->bz_drop_index('test_runs', 'run_id'); + $dbh->bz_drop_index('test_runs', 'run_id_2'); + $dbh->bz_drop_index('test_runs', 'test_run_plan_id_run_id__idx'); + $dbh->bz_drop_index('test_run_tags', 'run_tags_idx'); + $dbh->bz_drop_index('test_run_tags', 'run_tags_user_idx'); + $dbh->bz_drop_index('test_tags', 'AI_tag_id'); + $dbh->bz_drop_index('test_tags', 'tag_name'); + $dbh->bz_drop_index('test_tags', 'test_tag_name_idx'); + $dbh->bz_drop_index('test_tags', 'test_tag_name_indx'); + + $dbh->bz_add_index('test_attachment_data', 'test_attachment_data_primary_idx', ['attachment_id']); + $dbh->bz_add_index('test_attachments', 'test_attachments_submitter_idx', ['submitter_id']); + $dbh->bz_add_index('test_builds', 'build_milestone_idx', ['milestone']); + $dbh->bz_add_index('test_builds', 'build_name_idx', ['name']); + $dbh->bz_add_index('test_builds', 'build_prod_idx', {FIELDS => [qw(build_id product_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_builds', 'build_product_id_name_idx', {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_case_attachments', 'test_case_attachments_primary_idx', ['attachment_id']); + $dbh->bz_add_index('test_case_bugs', 'case_bugs_bug_id_idx', ['bug_id']); + $dbh->bz_add_index('test_case_bugs', 'case_bugs_case_id_idx', ['case_id']); + $dbh->bz_add_index('test_case_bugs', 'case_bugs_case_run_id_idx', ['case_run_id']); + $dbh->bz_add_index('test_case_categories', 'category_name_idx_v2', ['name']); + $dbh->bz_add_index('test_case_categories', 'category_product_id_name_idx', {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_case_categories', 'category_product_idx', {FIELDS => [qw(category_id product_id)], TYPE => 'UNIQUE'} ); + $dbh->bz_add_index('test_case_components', 'components_case_id_idx', {FIELDS => [qw(case_id component_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_case_components', 'components_component_id_idx', ['component_id']); + $dbh->bz_add_index('test_case_dependencies', 'case_dependencies_blocked_idx', ['blocked']); + $dbh->bz_add_index('test_case_dependencies', 'case_dependencies_primary_idx', {FIELDS => [qw(dependson blocked)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_case_plans', 'test_case_plans_case_idx', [qw(case_id)]); + $dbh->bz_add_index('test_case_plans', 'test_case_plans_primary_idx', {FIELDS => [qw(plan_id case_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_case_runs', 'case_run_build_env_idx', {FIELDS => [qw(run_id case_id build_id environment_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_case_runs', 'case_run_build_idx_v2', ['build_id']); + $dbh->bz_add_index('test_case_runs', 'case_run_env_idx_v2', ['environment_id']); + $dbh->bz_add_index('test_case_runs', 'case_run_status_idx', ['case_run_status_id']); + $dbh->bz_add_index('test_case_runs', 'case_run_text_ver_idx', ['case_text_version']); + $dbh->bz_add_index('test_cases', 'test_case_requirement_idx', ['requirement']); + $dbh->bz_add_index('test_cases', 'test_case_status_idx', ['case_status_id']); + $dbh->bz_add_index('test_cases', 'test_case_tester_idx', ['default_tester_id']); + $dbh->bz_add_index('test_case_tags', 'case_tags_case_id_idx_v3', [qw(case_id)]); + $dbh->bz_add_index('test_case_tags', 'case_tags_primary_idx', {FIELDS => [qw(tag_id case_id userid)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_case_tags', 'case_tags_secondary_idx', {FIELDS => [qw(tag_id case_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_case_tags', 'case_tags_userid_idx', [qw(userid)]); + $dbh->bz_add_index('test_email_settings', 'test_email_setting_user_id_idx', {FIELDS => [qw(userid relationship_id eventid)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_environment_category', 'test_environment_category_key1', {FIELDS => [qw(env_category_id product_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_environment_category', 'test_environment_category_key2', {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_environment_element', 'test_environment_element_key1', {FIELDS => [qw(element_id env_category_id)], TYPE => 'UNIQUE'},); + $dbh->bz_add_index('test_environment_element', 'test_environment_element_key2', {FIELDS => [qw(env_category_id name)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_environment_map', 'test_environment_map_key3', {FIELDS => [qw(environment_id element_id property_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_environment_property', 'test_environment_property_key1', {FIELDS => [qw(property_id element_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_environment_property', 'test_environment_property_key2', {FIELDS => [qw(element_id name)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_environments', 'environment_name_idx_v2', ['name']); + $dbh->bz_add_index('test_environments', 'test_environments_key1', {FIELDS => [qw(environment_id product_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_environments', 'test_environments_key2', {FIELDS => [qw(product_id name)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_named_queries', 'test_namedquery_primary_idx', {FIELDS => [qw(userid name)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_plan_activity', 'plan_activity_changed_idx', ['changed']); + $dbh->bz_add_index('test_plan_activity', 'plan_activity_field_idx', ['fieldid']); + $dbh->bz_add_index('test_plan_activity', 'plan_activity_primary_idx', ['plan_id']); + $dbh->bz_add_index('test_plan_attachments', 'test_plan_attachments_primary_idx', ['attachment_id']); + $dbh->bz_add_index('test_plan_permissions', 'testers_plan_grant_idx', ['grant_type']); + $dbh->bz_add_index('test_plan_tags', 'plan_tags_plan_id_idx', [qw(plan_id)]); + $dbh->bz_add_index('test_plan_tags', 'plan_tags_primary_idx', {FIELDS => [qw(tag_id plan_id userid)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_plan_tags', 'plan_tags_secondary_idx', {FIELDS => [qw(tag_id plan_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_plan_tags', 'plan_tags_userid_idx', [qw(userid)]); + $dbh->bz_add_index('test_run_activity', 'run_activity_field_idx', ['fieldid']); + $dbh->bz_add_index('test_run_cc', 'test_run_cc_primary_idx', {FIELDS => [qw(run_id who)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_run_cc', 'test_run_cc_who_idx', [qw(who)]); + $dbh->bz_add_index('test_runs', 'test_run_build_idx', ['build_id']); + $dbh->bz_add_index('test_runs', 'test_run_env_idx', ['environment_id']); + $dbh->bz_add_index('test_runs', 'test_run_plan_id_run_id_idx', [qw(plan_id run_id)]); + $dbh->bz_add_index('test_runs', 'test_run_plan_ver_idx', ['plan_text_version']); + $dbh->bz_add_index('test_runs', 'test_runs_summary_idx', {FIELDS => ['summary'], TYPE => 'FULLTEXT'}); + $dbh->bz_add_index('test_runs', 'test_run_tester_idx', ['default_tester_id']); + $dbh->bz_add_index('test_run_tags', 'run_tags_primary_idx', {FIELDS => [qw(tag_id run_id userid)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_run_tags', 'run_tags_run_id_idx', [qw(run_id)]); + $dbh->bz_add_index('test_run_tags', 'run_tags_secondary_idx', {FIELDS => [qw(tag_id run_id)], TYPE => 'UNIQUE'}); + $dbh->bz_add_index('test_run_tags', 'run_tags_userid_idx', [qw(userid)]); + $dbh->bz_add_index('test_tags', 'test_tag_name_idx_v2', [qw(tag_name)]); + + populateMiscTables($dbh); + populateEnvTables($dbh); + migrateEnvData($dbh); +} + +sub updateACLs { + my $dbh = shift; + return unless $dbh->selectrow_array("SELECT COUNT(*) FROM test_plan_permissions") == 0; + + print "Populating plan ACLs ...\n"; + my $ref = $dbh->selectall_arrayref("SELECT plan_id, author_id FROM test_plans", {'Slice' =>{}}); + foreach my $plan (@$ref){ + my ($finished) = $dbh->selectrow_array( + "SELECT COUNT(*) FROM test_plan_permissions + WHERE plan_id = ? AND userid = ?", + undef, ($plan->{'plan_id'}, $plan->{'author_id'})); + next if ($finished); + $dbh->do("INSERT INTO test_plan_permissions(userid, plan_id, permissions) + VALUES(?,?,?)", + undef, ($plan->{'author_id'}, $plan->{'plan_id'}, 15)); + } +} + +sub migrateAttachments { + my $dbh = shift; + return unless $dbh->bz_column_info('test_attachments', 'case_id'); + print "Migrating attachments...\n"; + + my $rows = $dbh->selectall_arrayref( + "SELECT attachment_id, case_id, plan_id + FROM test_attachments", {'Slice' => {}}); + + foreach my $row (@$rows){ + if ($row->{'case_id'}){ + $dbh->do("INSERT INTO test_case_attachments (attachment_id, case_id) + VALUES (?,?)", undef, ($row->{'attachment_id'}, $row->{'case_id'})); + } + elsif ($row->{'plan_id'}){ + $dbh->do("INSERT INTO test_plan_attachments (attachment_id, plan_id) + VALUES (?,?)", undef, ($row->{'attachment_id'}, $row->{'plan_id'})); + } + } + $dbh->bz_drop_column('test_attachments', 'case_id'); + $dbh->bz_drop_column('test_attachments', 'plan_id'); +} + +sub populateMiscTables { + my ($dbh) = (@_); + + if ($dbh->selectrow_array("SELECT COUNT(*) FROM test_fielddefs " . + "WHERE table_name = 'test_cases' " . + "AND name = 'estimated_time'") == 0) { + $dbh->do("INSERT INTO test_fielddefs " . + "(fieldid, name, description, table_name) " . + "VALUES (24, 'estimated_time', 'Estimated Time', 'test_cases')"); + } + + # Insert initial values in static tables. Going out on a limb and + # assuming that if one table is empty, they all are. + return unless $dbh->selectrow_array("SELECT COUNT(*) FROM test_case_run_status") == 0; + + print "Populating test_case_run_status table ...\n"; + print "Populating test_case_status table ...\n"; + print "Populating test_plan_types table ...\n"; + print "Populating test_fielddefs table ...\n"; + open FH, "< testopia/testopia.insert.sql" or die; + $dbh->do($_) while (<FH>); + close FH; +} + +sub populateEnvTables { + my ($dbh) = (@_); + my $sth; + my $ary_ref; + my $value; + + return unless $dbh->selectrow_array("SELECT COUNT(*) FROM test_environment_category") == 0; + if ($dbh->selectrow_array("SELECT COUNT(*) FROM test_environment_element") != 0) { + print STDERR "\npopulateEnv: Fatal Error: test_environment_category " . + "is empty but\ntest_environment_element is not. This ought " . + "to be impossible.\n\n"; + return; + } + + $dbh->bz_lock_tables( + 'test_environment_category WRITE', + 'test_environment_element WRITE', + 'op_sys READ', + 'rep_platform READ'); + + print "Populating test_environment_category table ...\n"; + $dbh->do("INSERT INTO test_environment_category " . + "(env_category_id, product_id, name) " . + "VALUES (1, 0, 'Operating System')"); + $dbh->do("INSERT INTO test_environment_category " . + "(env_category_id, product_id, name) " . + "VALUES (2, 0, 'Hardware')"); + + print "Populating test_environment_element table ...\n"; + $sth = $dbh->prepare("INSERT INTO test_environment_element " . + "(env_category_id, name, parent_id, isprivate) " . + "VALUES (?, ?, ?, ?)"); + $ary_ref = $dbh->selectcol_arrayref("SELECT value FROM op_sys"); + foreach $value (@$ary_ref) { + $sth->execute(1, $value, 0, 0); + } + $ary_ref = $dbh->selectcol_arrayref("SELECT value FROM rep_platform"); + foreach $value (@$ary_ref) { + $sth->execute(2, $value, 0, 0); + } + + $dbh->bz_unlock_tables(); +} + +sub migrateEnvData { + my ($dbh) = (@_); + my $os_mapping; + my $platform_mapping; + my $ary_ref; + my $i; + + return unless $dbh->bz_column_info('test_environments', 'op_sys_id'); + + # Map between IDs in op_sys table and IDs in + # test_environment_element table. + $os_mapping = $dbh->selectall_hashref("SELECT " . + "os.id AS op_sys_id, " . + "env_elem.element_id AS element_id " . + "FROM op_sys os, test_environment_element env_elem " . + "WHERE os.value = env_elem.name " . + "AND env_elem.env_category_id = 1", + 'op_sys_id'); + + # Map between IDs in rep_platform table and IDs in + # test_environment_element table. + $platform_mapping = $dbh->selectall_hashref("SELECT " . + "platform.id AS rep_platform_id, " . + "env_elem.element_id AS element_id " . + "FROM rep_platform platform, test_environment_element env_elem " . + "WHERE platform.value = env_elem.name " . + "AND env_elem.env_category_id = 2", + 'rep_platform_id'); + + $dbh->bz_lock_tables( + 'test_environment_map WRITE', + 'test_environments READ'); + print "Migrating data from test_environments to test_environment_map ...\n"; + $sth = $dbh->prepare("INSERT INTO test_environment_map " . + "(environment_id, property_id, element_id, value_selected) " . + "VALUES (?, ?, ?, ?)"); + $ary_ref = $dbh->selectall_arrayref("SELECT environment_id, op_sys_id " . + "FROM test_environments"); + foreach $i (@$ary_ref) { + $sth->execute(@$i[0], 0, $os_mapping->{@$i[1]}->{'element_id'}, ''); + } + $ary_ref = $dbh->selectall_arrayref("SELECT environment_id, rep_platform_id " . + "FROM test_environments"); + foreach $i (@$ary_ref) { + $sth->execute(@$i[0], 0, $platform_mapping->{@$i[1]}->{'element_id'}, ''); + } + $dbh->bz_unlock_tables(); + + print "Saving data from test_environments.xml column into text files ...\n"; + $ary_ref = $dbh->selectall_arrayref("SELECT environment_id, name, xml " . + "FROM test_environments WHERE xml != ''"); + foreach $value (@$ary_ref) { + open(FH, ">environment_" . @$value[0] . "_xml.txt"); + print FH "environment ID: @$value[0]\n"; + print FH "environment name: @$value[1]\n"; + print FH "environment xml:\n@$value[2]\n"; + close(FH); + } + + $dbh->bz_drop_column('test_environments', 'op_sys_id'); + $dbh->bz_drop_column('test_environments', 'rep_platform_id'); + $dbh->bz_drop_column('test_environments', 'xml'); +} + +# Copied from checksetup.pl +# +## This subroutine checks if a group exist. If not, it will be automatically +## created with the next available groupid +## +# + +sub tr_AddGroup { + my ($dbh, $name, $desc) = @_; + + print "Adding group $name ...\n"; + my $sth = $dbh->prepare("INSERT INTO groups " . + "(name, description, userregexp, isbuggroup, last_changed) " . + "VALUES (?, ?, ?, ?, NOW())"); + $sth->execute($name, $desc, "", 0); + return $dbh->bz_last_key("groups", "id"); +} + +sub GetAdminGroup { + my ($dbh) = @_; + + my $sth = $dbh->prepare("SELECT id FROM groups WHERE name = 'admin'"); + $sth->execute(); + my ($adminid) = $sth->fetchrow_array(); + + return $adminid; +} + +sub tr_AssignAdminGrants { + my ($dbh, $id, $adminid) = @_; + + #clean up first: + $dbh->do("DELETE FROM group_group_map ". + "WHERE member_id=$adminid AND grantor_id=$id"); + + #Assign privileges to the admin group over this group: + + my $blessColumn; + my $group_membership; + my $group_bless; + if ($Bugzilla::Config::VERSION =~ /^2\.18.*/) { + # version 2.18.* detected + $blessColumn = 'isbless'; + $group_membership = 0; + $group_bless = 1; + } else { + $blessColumn = 'grant_type'; + $group_membership = GROUP_MEMBERSHIP; + $group_bless = GROUP_BLESS; + } + + # Admins can bless. + $dbh->do("INSERT INTO group_group_map ". + "(member_id, grantor_id, $blessColumn) ". + "VALUES ($adminid, $id," . $group_bless . ")"); + # Admins are initially members. + $dbh->do("INSERT INTO group_group_map ". + "(member_id, grantor_id, $blessColumn) ". + "VALUES ($adminid, $id," . $group_membership . ")"); +} + +sub GroupExists { + my ($dbh, $name) = @_; + return $dbh->selectrow_array("SELECT COUNT(*) FROM groups WHERE name = ?", + undef, $name); +} + +sub DieWithStyle { + my($message) = @_; + + print "\n$message\n"; + + if ($rollbackPatchOnFail) { + rollbackPatch(); + } + + die "\nInstall failed. See details above.\n"; +} + +sub readPatchFiles { + my($path, $f) = (@_); + + open(MYINPUTFILE, "<$path") or DieWithStyle("Couldn't find file: $path"); + while (<MYINPUTFILE>) { + my $line = $_; + if($line =~ /^diff -[\w]* \.\/([^ ]*) .*$/) { + push @$f, $1; + } + } + close(MYINPUTFILE); +} + +sub rollbackPatch { + # Recovered files from the .orig copies made by patch: + + print "\n"; + print "Restoring original files ...\n"; + foreach my $file (@files) { + if (-e $file.".orig") { + rename($file.".orig", $file); + } else { + print " Couldn't restore file: $file because $file.orig doesn't exist!.\n"; + } + } + print "Done.\n"; +} + +sub restorePermissions { + # Restore permissions from the .orig files: + + print "\n"; + print "Recovering original permissions ...\n"; + foreach my $file (@files) { + perm_cp($file.".orig", $file); + } + print "Done.\n"; +} + +sub fixTables { + my $dbh = shift; + my ($count) = $dbh->selectrow_array("SELECT COUNT(*) FROM test_case_bugs WHERE case_id IS NULL"); + if ($count){ + require Bugzilla::Testopia::TestCaseRun; + my $caseruns = $dbh->selectcol_arrayref("SELECT case_run_id FROM test_case_bugs WHERE case_id IS NULL"); + my $sth = $dbh->prepare_cached("UPDATE test_case_bugs SET case_id = ? WHERE case_run_id = ?"); + foreach my $cr (@$caseruns){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($cr); + $sth->execute($caserun->case->id, $cr); + } + } + eval{ + $dbh->bz_add_index('test_case_components', 'components_case_id_idx', {FIELDS => [qw(case_id component_id)], TYPE => 'UNIQUE'}); + }; + if ($@){ + print "Running component fix...\n"; + my $rows = $dbh->selectall_arrayref("SELECT * FROM test_case_components", {"Slice" => {}}); + my $seen; + foreach my $row (@$rows){ + my $line = $row->{'case_id'} . "-" . $row->{'component_id'}; + if (!$seen->{$line}){ + $seen->{$line} = 'seen'; + } + elsif ($seen->{$line} eq 'seen'){ + $dbh->do("DELETE FROM test_case_components + WHERE case_id = ? AND component_id = ?", + undef, ($row->{'case_id'}, $row->{'component_id'})); + $dbh->do("INSERT INTO test_case_components + VALUES(?,?)", + undef, ($row->{'case_id'}, $row->{'component_id'})); + $seen->{$line} = 'fixed'; + } + elsif ($seen->{$line} eq 'fixed'){ + next; + } + } + } + + +} + +###################################### +# perm_cp lifted from Ben Okopnik's +# http://www.linuxgazette.com/issue87/misc/tips/cpmod.pl.txt + +sub perm_cp { + my $perms = perm_get($_[0]); + perm_set($_[1], $perms); +} + +sub perm_get { + my($filename) = @_; + + my @stats = (stat $filename)[2,4,5] or + DieWithStyle("Cannot stat $filename ($!)"); + + return \@stats; +} + +sub perm_set { + my($filename, $perms) = @_; + + chown($perms->[1], $perms->[2], $filename) or + DieWithStyle("Cannot chown $filename ($!)"); + + chmod($perms->[0] & 07777, $filename) or + DieWithStyle("Cannot chmod $filename ($!)"); +} diff --git a/tr_list_caseruns.cgi b/tr_list_caseruns.cgi new file mode 100755 index 0000000..0b1e2a8 --- /dev/null +++ b/tr_list_caseruns.cgi @@ -0,0 +1,316 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Bug; +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestCaseRun; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::Constants; + +use vars qw($vars); +require 'globals.pl'; + +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; +my $query_limit = 15000; + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +$cgi->send_cookie(-name => "TEST_LAST_ORDER", + -value => $cgi->param('order'), + -expires => "Fri, 01-Jan-2038 00:00:00 GMT"); + +Bugzilla->login(LOGIN_REQUIRED); + +$vars->{'fullwidth'} = 1; + +my $serverpush = support_server_push($cgi); +if ($serverpush) { + print $cgi->multipart_init; + print $cgi->multipart_start; + + $template->process("list/server-push.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} +else { + print $cgi->header; +} +# prevent DOS attacks from multiple refreshes of large data +$::SIG{TERM} = 'DEFAULT'; +$::SIG{PIPE} = 'DEFAULT'; + +my $action = $cgi->param('action') || ''; + +if ($action eq 'Commit'){ + # Get the list of checked items. This way we don't have to cycle through + # every test case, only the ones that are checked. + my $reg = qr/r_([\d]+)/; + my $params = join(" ", $cgi->param()); + my @params = $cgi->param(); + my @buglist; + unless ($params =~ $reg){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-none-selected', {'object' => 'case-run'}); + } + foreach my $bug (split(/[\s,]+/, $cgi->param('bugs'))){ + ValidateBugID($bug); + push @buglist, $bug; + } + + my $progress_interval = 250; + my $i = 0; + my $total = scalar @params; + my @uneditable; + + foreach my $p ($cgi->param()){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($1) if $p =~ $reg; + next unless $caserun; + + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + my $build = $cgi->param('caserun_build') == -1 ? $caserun->build->id : $cgi->param('caserun_build'); + my $notes = $cgi->param('notes'); + my $env = $cgi->param('caserun_env') eq '' ? $caserun->environment->id : $cgi->param('caserun_env'); + + validate_test_id($build, 'build'); + validate_test_id($env, 'environment'); + + detaint_natural($env); + detaint_natural($build); + + trick_taint($notes); + + unless ($caserun->canedit){ + push @uneditable, $caserun; + next; + } + + # Switch to the record representing this build and environment combo. + # If there is not one, it will create it and switch to that. + $caserun = $caserun->switch($build,$env); + + my $status = $cgi->param('status') == -1 ? $caserun->status_id : $cgi->param('status'); + my $assignee = $cgi->param('assignee') eq '' ? $caserun->assignee->id : login_to_id(trim($cgi->param('assignee'))); + unless ($assignee){ + print $cgi->multipart_end if $serverpush; + ThrowUserError("invalid_username", { name => $cgi->param('assignee') }); + } + detaint_natural($status); + + $caserun->set_status($status) if ($caserun->status_id != $status); + $caserun->set_assignee($assignee) if ($caserun->assignee->id != $assignee); + $caserun->append_note($notes); + + foreach my $bug (@buglist){ + $caserun->attach_bug($bug); + } + + + } + $vars->{'title'} = "Update Successful"; + my $updated = $i - scalar @uneditable; + $vars->{'tr_error'} = "You did not have sufficient permission to update " . scalar @uneditable . " case-runs" if scalar @uneditable > 0; + $vars->{'tr_message'} = "$updated Test Case-Runs Updated"; + if ($serverpush && !$cgi->param('debug')) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } + if ($cgi->param('run_id')){ + my $run_id = $cgi->param('run_id'); + my $run = Bugzilla::Testopia::TestRun->new($run_id); + + # See if there is a saved filter + if ($cgi->cookie('TESTOPIA-FILTER-RUN-' . $run_id) && $action ne 'Filter' && $action ne 'clear_filter'){ + $cgi = Bugzilla::CGI->new($cgi->cookie('TESTOPIA-FILTER-RUN-' . $run_id)); + $vars->{'filtered'} = 1; + } + else { + $cgi->delete_all; + } + $cgi->param('run_id', $run_id); + $cgi->param('current_tab', 'case_run'); + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('case_run', 'tr_show_run.cgi', $cgi, undef, $search->query); + + $vars->{'run'} = $run; + $vars->{'table'} = $table; + $vars->{'action'} = 'Commit'; + $vars->{'backlink'} = $run; + $vars->{'form_action'} = "tr_show_run.cgi"; + $vars->{'caserun'} = Bugzilla::Testopia::TestCaseRun->new({}); + $vars->{'case'} = Bugzilla::Testopia::TestCase->new({}); + + $template->process("testopia/run/show.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + + } + else { + my $case = Bugzilla::Testopia::TestCase->new({ 'case_id' => 0 }); + $vars->{'case'} = $case; + $vars->{'current_tab'} = 'cases'; + $template->process("testopia/search/advanced.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + } + print $cgi->multipart_final if $serverpush; + exit; +} +elsif ($action eq 'Delete Selected'){ + my $reg = qr/r_([\d]+)/; + my @caseruns; + foreach my $p ($cgi->param()){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($1) if $p =~ $reg; + if (($caserun && !$caserun->candelete)){ + print $cgi->multipart_end if $serverpush; + ThrowUserError("testopia-no-delete", {'object' => $caserun}); + } + push @caseruns, $caserun if $caserun; + } + if ($serverpush) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } + if ((scalar @caseruns < 1)){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-none-selected', {'object' => 'case-run'}); + } + $vars->{'caseruns'} = \@caseruns; + $vars->{'caseruncount'} = scalar @caseruns; + $vars->{'title'} = "Remove Test Cases from Run"; + $vars->{'form_action'} = 'tr_list_caseruns.cgi'; + $vars->{'run_id'} = $cgi->param('run_id'); + $template->process("testopia/caserun/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; + exit; +} +elsif ($action eq 'do_delete'){ + my @caseruns; + my @undeleteable; + foreach my $id ($cgi->param('caserun_id')){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($id); + if ($caserun->candelete){ + push @caseruns, $caserun; + } + else { + push @undeleteable, $caserun; + } + } + my $progress_interval = 250; + my $i = 0; + my $total = scalar @caseruns; + foreach my $c (@caseruns){ + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + $c->obliterate; + } + if ($serverpush) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } + $vars->{'deleted'} = 1; + $vars->{'run_id'} = $cgi->param('run_id'); + $template->process("testopia/caserun/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; + exit; +} + +$vars->{'qname'} = $cgi->param('qname') if $cgi->param('qname'); + +# Take the search from the URL params and convert it to SQL +$cgi->param('current_tab', 'case_run'); +my $search = Bugzilla::Testopia::Search->new($cgi); +my $table = Bugzilla::Testopia::Table->new('case_run', 'tr_list_caseruns.cgi', $cgi, undef, $search->query); +if ($table->view_count > $query_limit){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-query-too-large', {'limit' => $query_limit}); +} + +if ($table->list_count > 0){ + my $prod_id = $table->list->[0]->run->plan->product_id; + foreach my $caserun (@{$table->list}){ + if ($caserun->run->plan->product_id != $prod_id){ + $vars->{'multiprod'} = 1; + last; + } + } + if (!$vars->{'multiprod'}){ + my $p = $table->list->[0]->run->plan; + my $build_list = $p->product->builds; + unshift @{$build_list}, {'id' => -1, 'name' => "--Do Not Change--"}; + $vars->{'build_list'} = $build_list; + } + +} +if ($cgi->param('run_id')){ + my @runs = split(",", $cgi->param('run_id')); + if (scalar @runs == 1){ + $vars->{'run'} = Bugzilla::Testopia::TestRun->new($cgi->param('run_id')); + $vars->{'filtered'} = 1 if $cgi->cookie('TESTOPIA-FILTER-RUN-' . $vars->{'run'}->id) && $cgi->param('action') ne 'clear_filter'; + } +} +my $case = Bugzilla::Testopia::TestCase->new({'case_id' => 0}); +$vars->{'expand_report'} = $cgi->param('expand_report') || 0; +$vars->{'expand_filter'} = $cgi->param('expand_filter') || 0; +$vars->{'table'} = $table; +$vars->{'action'} = 'tr_list_caserun.cgi'; +$vars->{'caserun'} = Bugzilla::Testopia::TestCaseRun->new({}); +$vars->{'case'} = Bugzilla::Testopia::TestCase->new({}); +if ($vars->{'run'}) { + $vars->{'dotweak'} = $vars->{'run'}->canedit(); + $vars->{'candelete'} = $vars->{'run'}->candelete(); +} +else { + $vars->{'dotweak'} = Bugzilla->user->in_group('Testers'); + $vars->{'candelete'} = Bugzilla->user->in_group('admin') + || (Bugzilla->user->in_group('Testers') && Param('testopia-allow-group-member-deletes')); +} +if ($serverpush && !$cgi->param('debug')) { + print $cgi->multipart_end; + print $cgi->multipart_start; +} +$template->process("testopia/caserun/list.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +print $cgi->multipart_final if $serverpush; diff --git a/tr_list_cases.cgi b/tr_list_cases.cgi new file mode 100755 index 0000000..feccbd8 --- /dev/null +++ b/tr_list_cases.cgi @@ -0,0 +1,438 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestCase; +use Bugzilla::Testopia::TestCaseRun; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestTag; +use Bugzilla::Testopia::Table; + +use vars qw($vars); + +require "globals.pl"; + +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; +my $query_limit = 10000; + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +$cgi->send_cookie(-name => "TEST_LAST_ORDER", + -value => $cgi->param('order'), + -expires => "Fri, 01-Jan-2038 00:00:00 GMT"); + +Bugzilla->login(LOGIN_REQUIRED); + +# Determine the format in which the user would like to receive the output. +# Uses the default format if the user did not specify an output format; +# otherwise validates the user's choice against the list of available formats. +my $format = $template->get_format("testopia/case/list", scalar $cgi->param('format'), scalar $cgi->param('ctype')); + +my $action = $cgi->param('action') || ''; +my $serverpush = ( support_server_push($cgi) ) && ( $format->{'extension'} eq "html" ); + +if ($serverpush) { + print $cgi->multipart_init; + print $cgi->multipart_start; + + $template->process("list/server-push.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} + +# prevent DOS attacks from multiple refreshes of large data +$::SIG{TERM} = 'DEFAULT'; +$::SIG{PIPE} = 'DEFAULT'; + +############### +### Actions ### +############### +if ($action eq 'Commit'){ + + # Match the list of checked items. + my $reg = qr/c_([\d]+)/; + my $params = join(" ", $cgi->param()); + my @params = $cgi->param(); + + unless ($params =~ $reg){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-none-selected', {'object' => 'case'}); + } + + my $progress_interval = 250; + my $i = 0; + my $total = scalar @params; + my @uneditable; + + foreach my $p ($cgi->param()){ + my $case = Bugzilla::Testopia::TestCase->new($1) if $p =~ $reg; + next unless $case; + + unless ($case->canedit){ + push @uneditable, $case; + next; + } + + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + my $requirement = $cgi->param('requirement') eq '--Do Not Change--' ? $case->requirement : $cgi->param('requirement'); + my $arguments = $cgi->param('arguments') eq '--Do Not Change--' ? $case->arguments : $cgi->param('requirement'); + my $script = $cgi->param('script') eq '--Do Not Change--' ? $case->script : $cgi->param('requirement'); + my $status = $cgi->param('status') == -1 ? $case->status_id : $cgi->param('status'); + my $priority = $cgi->param('priority') == -1 ? $case->{'priority_id'} : $cgi->param('priority'); + my $category = $cgi->param('category') == -1 ? $case->{'category_id'} : $cgi->param('category'); + my $isautomated = $cgi->param('isautomated') == -1 ? $case->isautomated : $cgi->param('isautomated'); + my @comps = $cgi->param("components"); + my $tester = $cgi->param('tester') || ''; + if ($tester && $tester ne '--Do Not Change--'){ + $tester = login_to_id(trim($cgi->param('tester'))) + || ThrowUserError("invalid_username", { name => $cgi->param('tester') }); + } + else { + $tester = $case->default_tester->id; + } + + # We use placeholders so trick_taint is ok. + trick_taint($requirement) if $requirement; + trick_taint($arguments) if $arguments; + trick_taint($script) if $script; + + detaint_natural($status); + detaint_natural($priority); + detaint_natural($category); + detaint_natural($isautomated); + + my @components; + foreach my $id (@comps){ + detaint_natural($id); + validate_selection($id, 'id', 'components'); + push @components, $id; + } + + my %newvalues = ( + 'case_status_id' => $status, + 'category_id' => $category, + 'priority_id' => $priority, + 'isautomated' => $isautomated, + 'requirement' => $requirement, + 'script' => $script, + 'arguments' => $arguments, + 'default_tester_id' => $tester || $case->default_tester->id, + ); + + $case->update(\%newvalues); + $case->add_component($_) foreach (@components); + if ($cgi->param('addtags')){ + foreach my $name (split(/[,]+/, $cgi->param('addtags'))){ + trick_taint($name); + my $tag = Bugzilla::Testopia::TestTag->new({'tag_name' => $name}); + my $tag_id = $tag->store; + $case->add_tag($tag_id); + } + } + # Add to runs + my @runs; + foreach my $runid (split(/[\s,]+/, $cgi->param('addruns'))){ + validate_test_id($runid, 'run'); + push @runs, Bugzilla::Testopia::TestRun->new($runid); + } + foreach my $run (@runs){ + $run->add_case_run($case->id) if $run->canedit; + } + # Clone + my %planseen; + foreach my $planid (split(",", $cgi->param('linkplans'))){ + validate_test_id($planid, 'plan'); + my $plan = Bugzilla::Testopia::TestPlan->new($planid); + next unless $plan->canedit; + $planseen{$planid} = 1; + } + if ($cgi->param('copymethod') eq 'copy'){ + foreach my $planid (keys %planseen){ + my $author = $cgi->param('newauthor') ? Bugzilla->user->id : $case->author->id; + my $newcaseid = $case->copy($planid, $author, 1); + $case->link_plan($planid, $newcaseid); + my $newcase = Bugzilla::Testopia::TestCase->new($newcaseid); + foreach my $tag (@{$case->tags}){ + # Doing it this way avoids collisions + my $newtag = Bugzilla::Testopia::TestTag->new({ + tag_name => $tag->name + }); + my $newtagid = $newtag->store; + $newcase->add_tag($newtagid); + } + foreach my $comp (@{$case->components}){ + $newcase->add_component($comp->{'id'}); + } + } + } + elsif ($cgi->param('copymethod') eq 'link'){ + foreach my $planid (keys %planseen){ + $case->link_plan($planid); + } + } + + } + if ($serverpush && !$cgi->param('debug')) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } + my @runlist = split(/[\s,]+/, $cgi->param('addruns')); + if (scalar @runlist == 1){ + my $run_id = $cgi->param('addruns'); + validate_test_id($run_id, 'run'); + $cgi->delete_all; + $cgi->param('run_id', $run_id); + $cgi->param('current_tab', 'case_run'); + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('case_run', 'tr_show_run.cgi', $cgi, undef, $search->query); + + my @case_list; + foreach my $caserun (@{$table->list}){ + push @case_list, $caserun->case_id; + } + $vars->{'run'} = Bugzilla::Testopia::TestRun->new($run_id); + $vars->{'table'} = $table; + $vars->{'case_list'} = join(",", @case_list); + $vars->{'action'} = 'Commit'; + $template->process("testopia/run/show.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; + } + my $case = Bugzilla::Testopia::TestCase->new({}); + my $updated = $i - scalar @uneditable; + $vars->{'case'} = $case; + $vars->{'title'} = "Update Successful"; + $vars->{'tr_error'} = "You did not have rights to edit ". scalar @uneditable . "cases" if scalar @uneditable > 0; + $vars->{'tr_message'} = "$updated Test Cases Updated"; + $vars->{'current_tab'} = 'case'; + + $template->process("testopia/search/advanced.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; + exit; + +} +elsif ($action eq 'Delete Selected'){ + # Match the list of checked items. + my $reg = qr/c_([\d]+)/; + my $params = join(" ", $cgi->param()); + my @params = $cgi->param(); + + unless ($params =~ $reg){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-none-selected', {'object' => 'case'}); + } + # You must have rights to delete from all the plans this case + # is linked to in order to delete. + # We separate them here so that users can still remove the ones + # they have rights to. + my @deletable; + my @undeletable; + foreach my $p ($cgi->param()){ + my $case = Bugzilla::Testopia::TestCase->new($1) if $p =~ $reg; + next unless $case; + + if ($case->candelete){ + push @deletable, $case; + } + else { + push @undeletable, $case; + } + } + print $cgi->multipart_end if $serverpush; + $vars->{'delete_list'} = \@deletable; + $vars->{'unable_list'} = \@undeletable; + $template->process("testopia/case/delete-list.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; + exit; + +} + +elsif ($action eq 'do_delete'){ + my @case_ids = split(",", $cgi->param('case_list')); + my $progress_interval = 250; + my $i = 0; + my $total = scalar @case_ids; + + foreach my $id (@case_ids){ + + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + detaint_natural($id); + next unless $id; + my $case = Bugzilla::Testopia::TestCase->new($id); + next unless $case->candelete; + $case->obliterate; + } + + print $cgi->multipart_end if $serverpush; + my $case = Bugzilla::Testopia::TestCase->new({}); + $vars->{'case'} = $case; + $vars->{'title'} = "Update Successful"; + $vars->{'tr_message'} = "$i test cases deleted"; + $vars->{'current_tab'} = 'case'; + + $template->process("testopia/search/advanced.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; + exit; +} + +############### +### Display ### +############### + +$vars->{'qname'} = $cgi->param('qname') if $cgi->param('qname'); + +# Take the search from the URL params and convert it to SQL +$cgi->param('current_tab', 'case'); +my $search = Bugzilla::Testopia::Search->new($cgi); +my $table = Bugzilla::Testopia::Table->new('case', 'tr_list_cases.cgi', $cgi, undef, $search->query); +if ($table->view_count > $query_limit){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-query-too-large', {'limit' => $query_limit}); +} +# Check that all of the test cases returned only belong to one product. +if ($table->list_count > 0 && !$cgi->param('addrun')){ + my %case_prods; + my $prod_id; + foreach my $case (@{$table->list}){ + $case_prods{$case->id} = $case->get_product_ids; + $prod_id = @{$case_prods{$case->id}}[0]; + if (scalar(@{$case_prods{$case->id}} > 1)){ + $vars->{'multiprod'} = 1 ; + last; + } + } + # Check that all of them are the same product + if (!$vars->{'multiprod'}){ + foreach my $c (keys %case_prods){ + if ($case_prods{$c}->[0] != $prod_id){ + $vars->{'multiprod'} = 1; + last; + } + } + } + if (!$vars->{'multiprod'}) { + my $category_list = $table->list->[0]->get_category_list; + unshift @{$category_list}, {'id' => -1, 'name' => "--Do Not Change--"}; + $vars->{'category_list'} = $category_list; + } +} +# create an empty case to use for getting status and priority lists +my $c = Bugzilla::Testopia::TestCase->new({}); +my $status_list = $c->get_status_list; +my $priority_list = $c->get_priority_list; + +# add the "do not change" option to each list +# we use unshift so they show at the top of the list +unshift @{$status_list}, {'id' => -1, 'name' => "--Do Not Change--"}; +unshift @{$priority_list}, {'id' => -1, 'name' => "--Do Not Change--"}; + +my $addrun = $cgi->param('addrun'); +if ($addrun){ + validate_test_id($addrun, 'run'); + my $run = Bugzilla::Testopia::TestRun->new($addrun); + $vars->{'addruns'} = $addrun; + $vars->{'plan'} = $run->plan; +} + +$vars->{'addrun'} = $cgi->param('addrun'); +$vars->{'fullwidth'} = 1; #novellonly +$vars->{'case'} = $c; +$vars->{'status_list'} = $status_list; +$vars->{'priority_list'} = $priority_list; +$vars->{'table'} = $table; +$vars->{'urlquerypart'} = $cgi->canonicalise_query('cmdtype'); +if ($cgi->param('plan_id')){ + my $plan_id = $cgi->param('plan_id'); + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + $vars->{'dotweak'} = $plan->canedit; + $vars->{'candelete'} = $plan->candelete; +} +else{ + $vars->{'dotweak'} = Bugzilla->user->in_group('Testers'); + $vars->{'candelete'} = Bugzilla->user->in_group('admin') + || (Bugzilla->user->in_group('Testers') && Param('testopia-allow-group-member-deletes')); +} +my $contenttype; + +if ($format->{'extension'} eq "html") { + $contenttype = "text/html"; +} +else { + $contenttype = $format->{'ctype'}; +} + +if ($serverpush && !$cgi->param('debug')) { + print $cgi->multipart_end; + print $cgi->multipart_start; +} +else { + my @time = localtime(time()); + my $date = sprintf "%04d-%02d-%02d", 1900+$time[5],$time[4]+1,$time[3]; + my $filename = "testcases-$date.$format->{extension}"; + + my $disp = "inline"; + # We set CSV files to be downloaded, as they are designed for importing + # into other programs. + if ( $format->{'extension'} eq "csv" || $format->{'extension'} eq "xml" ) + { + $disp = "attachment"; + $vars->{'displaycolumns'} = \@Bugzilla::Testopia::Constants::TESTCASE_EXPORT; + } + + # Suggest a name for the bug list if the user wants to save it as a file. + print $cgi->header(-type => $contenttype, + -content_disposition => "$disp; filename=$filename"); +} + +$template->process($format->{'template'}, $vars) + || ThrowTemplateError($template->error()); + +print $cgi->multipart_final if $serverpush; diff --git a/tr_list_environments.cgi b/tr_list_environments.cgi new file mode 100755 index 0000000..d78b1c9 --- /dev/null +++ b/tr_list_environments.cgi @@ -0,0 +1,58 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Environment::Element; +use Bugzilla::Testopia::Environment::Category; +use Bugzilla::Testopia::Environment::Property; + +Bugzilla->login(LOGIN_REQUIRED); + + +use vars qw($vars); +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; + +print $cgi->header; + +my $action = $cgi->param('action') || ''; + +$vars->{'qname'} = $cgi->param('qname') if $cgi->param('qname'); + +$cgi->param('current_tab', 'environment'); +my $search = Bugzilla::Testopia::Search->new($cgi); +my $table = Bugzilla::Testopia::Table->new('environment', 'tr_list_environments.cgi', $cgi, undef, $search->query); + +$vars->{'table'} = $table; + +$template->process("testopia/environment/list.html.tmpl", $vars) + || print $template->error(); diff --git a/tr_list_plans.cgi b/tr_list_plans.cgi new file mode 100755 index 0000000..51a9fa6 --- /dev/null +++ b/tr_list_plans.cgi @@ -0,0 +1,166 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Config; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Util; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; + +use vars qw($vars); + +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; +my $query_limit = 5000; + +Bugzilla->login(LOGIN_REQUIRED); +my $serverpush = support_server_push($cgi); +if ($serverpush) { + print $cgi->multipart_init; + print $cgi->multipart_start; + + $template->process("list/server-push.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} +else { + print $cgi->header; +} +# prevent DOS attacks from multiple refreshes of large data +$::SIG{TERM} = 'DEFAULT'; +$::SIG{PIPE} = 'DEFAULT'; + +my $action = $cgi->param('action') || ''; +if ($action eq 'Commit'){ + # Get the list of checked items. This way we don't have to cycle through + # every test case, only the ones that are checked. + my $reg = qr/p_([\d]+)/; + my $params = join(" ", $cgi->param()); + my @params = $cgi->param(); + unless ($params =~ $reg){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-none-selected', {'object' => 'plan'}); + } + + my $progress_interval = 250; + my $i = 0; + my $total = scalar @params; + my @uneditable; + foreach my $p ($cgi->param()){ + my $plan = Bugzilla::Testopia::TestPlan->new($1) if $p =~ $reg; + next unless $plan; + + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + unless ($plan->canedit){ + push @uneditable, $p; + next; + } + my $plan_type = $cgi->param('plan_type') == -1 ? $plan->type_id : $cgi->param('plan_type'); + my $product = $cgi->param('product_id') == -1 ? $plan->product_id : $cgi->param('product_id'); + my $prodver = $cgi->param('prod_version') == -1 ? $plan->product_version : $cgi->param('prod_version'); + + # We use placeholders so trick_taint is ok. + trick_taint($prodver) if $prodver; + + detaint_natural($product); + detaint_natural($plan_type); + + my %newvalues = ( + 'type_id' => $plan_type, + 'product_id' => $product, + 'default_product_version' => $prodver, + ); + $plan->update(\%newvalues); + $plan->toggle_archive if $cgi->param('togglearch'); + if ($cgi->param('addtags')){ + foreach my $name (split(/[,]+/, $cgi->param('addtags'))){ + trick_taint($name); + my $tag = Bugzilla::Testopia::TestTag->new({'tag_name' => $name}); + my $tag_id = $tag->store; + $plan->add_tag($tag_id); + } + } + } + if ($serverpush && !$cgi->param('debug')) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } + my $plan = Bugzilla::Testopia::TestPlan->new({ 'plan_id' => 0 }); + my $updated = $i - scalar @uneditable; + + $vars->{'plan'} = $plan; + $vars->{'title'} = "Update Successful"; + $vars->{'tr_error'} = "You did not have rights to edit ". scalar @uneditable . "plans" if scalar @uneditable > 0; + $vars->{'tr_message'} = "$i Test Plan(s) Updated"; + $vars->{'current_tab'} = 'plan'; + $template->process("testopia/search/advanced.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; + exit; + +} +else { + $vars->{'qname'} = $cgi->param('qname') if $cgi->param('qname'); + $cgi->param('current_tab', 'plan'); + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('plan', 'tr_list_plans.cgi', $cgi, undef, $search->query); + if ($table->view_count > $query_limit){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-query-too-large', {'limit' => $query_limit}); + } + + my $p = Bugzilla::Testopia::TestPlan->new({}); + my $product_list = Bugzilla->user->get_selectable_products; + my $prodver_list = []; + my $type_list = $p->get_plan_types; + + unshift @{$product_list}, {'id' => -1, 'name' => "--Do Not Change--"}; + unshift @{$prodver_list}, {'id' => -1, 'name' => "--Do Not Change--"}; + unshift @{$type_list}, {'id' => -1, 'name' => "--Do Not Change--"}; + $vars->{'product_list'} = $product_list; + $vars->{'prodver_list'} = $prodver_list; + $vars->{'type_list'} = $type_list; + + $vars->{'fullwidth'} = 1; #novellonly + $vars->{'dotweak'} = Bugzilla->user->in_group('Testers'); + $vars->{'table'} = $table; + if ($serverpush && !$cgi->param('debug')) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } + $template->process("testopia/plan/list.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; +} diff --git a/tr_list_runs.cgi b/tr_list_runs.cgi new file mode 100755 index 0000000..c2e69b8 --- /dev/null +++ b/tr_list_runs.cgi @@ -0,0 +1,192 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Config; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::TestRun; + +use vars qw($vars); + +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; +my $query_limit = 5000; + +Bugzilla->login(LOGIN_REQUIRED); +my $serverpush = support_server_push($cgi); +if ($serverpush) { + print $cgi->multipart_init; + print $cgi->multipart_start; + + $template->process("list/server-push.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} +else { + print $cgi->header; +} +# prevent DOS attacks from multiple refreshes of large data +$::SIG{TERM} = 'DEFAULT'; +$::SIG{PIPE} = 'DEFAULT'; + +my $action = $cgi->param('action') || ''; +if ($action eq 'Commit'){ + # Get the list of checked items. This way we don't have to cycle through + # every test case, only the ones that are checked. + my $reg = qr/r_([\d]+)/; + my $params = join(" ", $cgi->param()); + my @params = $cgi->param(); + unless ($params =~ $reg){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-none-selected', {'object' => 'run'}); + } + if ($cgi->param('environment') eq ''){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-missing-required-field', {'field' => 'environment'}); + } + + my $progress_interval = 250; + my $i = 0; + my $total = scalar @params; + my @uneditable; + + foreach my $p ($cgi->param()){ + my $run = Bugzilla::Testopia::TestRun->new($1) if $p =~ $reg; + next unless $run; + + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + unless ($run->canedit){ + push @uneditable, $run; + next; + } + my $manager = login_to_id(trim($cgi->param('manager'))); + if ($cgi->param('manager') && !$manager){ + print $cgi->multipart_end if $serverpush; + ThrowUserError("invalid_username", { name => $cgi->param('manager') }) if $cgi->param('manager'); + } + my $stop_date; + if ($cgi->param('run_status')){ + if ($cgi->param('run_status') == -1 || $run->stop_date){ + $stop_date = $run->stop_date; + } + else { + $stop_date = get_time_stamp(); + } + } + + my $enviro = $cgi->param('environment') eq '--Do Not Change--' ? $run->environment->id : $cgi->param('environment'); + my $build = $cgi->param('build') == -1 ? $run->build->id : $cgi->param('build'); + + validate_test_id($enviro, 'environment'); + validate_test_id($build, 'build'); + my %newvalues = ( + 'manager_id' => $manager || $run->manager->id, + 'stop_date' => $stop_date, + 'environment_id' => $enviro, + 'build_id' => $build + ); + $run->update(\%newvalues); + if ($cgi->param('addtags')){ + foreach my $name (split(/[,]+/, $cgi->param('addtags'))){ + trick_taint($name); + my $tag = Bugzilla::Testopia::TestTag->new({'tag_name' => $name}); + my $tag_id = $tag->store; + $run->add_tag($tag_id); + } + } + } + if ($serverpush && !$cgi->param('debug')) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } + my $run = Bugzilla::Testopia::TestRun->new({}); + $vars->{'run'} = $run; + $vars->{'title'} = "Update Successful"; + $vars->{'tr_message'} = "$i Test Runs Updated"; + $vars->{'current_tab'} = 'run'; + $vars->{'build_list'} = $run->get_distinct_builds(); + $template->process("testopia/search/advanced.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; + exit; + +} +else { + $vars->{'qname'} = $cgi->param('qname') if $cgi->param('qname'); + $cgi->param('current_tab', 'run'); + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('run', 'tr_list_runs.cgi', $cgi, undef, $search->query); + if ($table->view_count > $query_limit){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-query-too-large', {'limit' => $query_limit}); + } + + if ($table->list_count > 0){ + my $plan_id = $table->list->[0]->plan->product_id; + foreach my $run (@{$table->list}){ + if ($run->plan->product_id != $plan_id){ + $vars->{'multiprod'} = 1; + last; + } + } + if (!$vars->{'multiprod'}) { + my $p = $table->list->[0]->plan; + my $build_list = $p->product->builds; + unshift @{$build_list}, {'id' => -1, 'name' => "--Do Not Change--"}; + $vars->{'build_list'} = $build_list; + } + + } + my $r = Bugzilla::Testopia::TestRun->new({'run_id' => 0 }); + + my $status_list = $r->get_status_list; + + unshift @{$status_list}, {'id' => -1, 'name' => "--Do Not Change--"}; + + $vars->{'status_list'} = $status_list; + + $vars->{'fullwidth'} = 1; #novellonly + $vars->{'dotweak'} = Bugzilla->user->in_group('Testers'); + $vars->{'table'} = $table; + if ($serverpush && !$cgi->param('debug')) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } + $template->process("testopia/run/list.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; +} diff --git a/tr_new_case.cgi b/tr_new_case.cgi new file mode 100755 index 0000000..555c2d0 --- /dev/null +++ b/tr_new_case.cgi @@ -0,0 +1,262 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestCase; +use JSON; + +use vars qw($vars); + +require "globals.pl"; + +Bugzilla->login(LOGIN_REQUIRED); + +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; + +print $cgi->header; + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +my $action = $cgi->param('action') || ''; +my @plan_id = $cgi->param('plan_id'); + +unless ($plan_id[0]){ + $vars->{'product'} = Bugzilla::Testopia::Product->new({'name' => $cgi->param('product')}) if ($cgi->param('product')); + $vars->{'bug_id'} = $cgi->param('bug'); + $vars->{'form_action'} = 'tr_new_case.cgi'; + $template->process("testopia/plan/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; +} +my %seen; +my @plans; +my @plan_ids; +my @categories; +foreach my $entry (@plan_id){ + foreach my $id (split(/[\s,]+/, $entry)){ + detaint_natural($id); + validate_test_id($id, 'plan'); + $seen{$id} = 1; + } +} +foreach my $id (keys %seen){ + my $plan = Bugzilla::Testopia::TestPlan->new($id); + ThrowUserError("testopia-create-denied", {'object' => 'Test Case', 'plan' => $plan}) unless $plan->canedit; + push @plan_ids, $id; + push @plans, $plan; + push @categories, @{$plan->product->categories}; +} + +ThrowUserError('testopia-create-category', {'plan' => $plans[0] }) if scalar @categories < 1; +if ($action eq 'Add'){ + my $alias = $cgi->param('alias')|| ''; + my $category = $cgi->param('category'); + my $status = $cgi->param('status'); + my $priority = $cgi->param('priority'); + my $isautomated = $cgi->param("isautomated"); + my $script = $cgi->param("script")|| ''; + my $arguments = $cgi->param("arguments")|| ''; + my $summary = $cgi->param("summary")|| ''; + my $requirement = $cgi->param("requirement")|| ''; + my $tcaction = $cgi->param("tcaction") || ''; + my $tceffect = $cgi->param("tceffect") || ''; + my $tcsetup = $cgi->param("tcsetup") || ''; + my $tcbreakdown = $cgi->param("tcbreakdown") || ''; + my $tcdependson = $cgi->param("tcdependson")|| ''; + my $tcblocks = $cgi->param("tcblocks")|| ''; + my $tester = $cgi->param("tester") || ''; + my $est_time = $cgi->param("estimated_time") || ''; + my @comps = $cgi->param("components"); + if ($tester){ + $tester = login_to_id(trim($cgi->param('tester'))) + || ThrowUserError("invalid_username", { name => $cgi->param('tester') }); + } + + ThrowUserError('testopia-missing-required-field', {'field' => 'summary'}) if $summary eq ''; + + detaint_natural($status); + detaint_natural($category); + detaint_natural($priority); + detaint_natural($isautomated); + + $est_time =~ m/(\d+)[:\s](\d+)[:\s](\d+)/; + ThrowUserError('testopia-format-error', {'field' => 'Estimated Time' }) + unless ($1 < 24 && $2 < 60 && $3 < 60); + $est_time = "$1:$2:$3"; + + # All inserts are done with placeholders so this is OK + trick_taint($alias); + trick_taint($script); + trick_taint($arguments); + trick_taint($summary); + trick_taint($requirement); + trick_taint($tcaction); + trick_taint($tceffect); + trick_taint($tcdependson); + trick_taint($tcsetup); + trick_taint($tcbreakdown); + trick_taint($tcblocks); + + validate_selection($category, 'category_id', 'test_case_categories'); + validate_selection($status, 'case_status_id', 'test_case_status'); + + my @components; + foreach my $id (@comps){ + detaint_natural($id); + validate_selection($id, 'id', 'components'); + push @components, $id; + } + my @runs; + foreach my $runid (split(/[\s,]+/, $cgi->param('addruns'))){ + validate_test_id($runid, 'run'); + push @runs, Bugzilla::Testopia::TestRun->new($runid); + } + + my $case = Bugzilla::Testopia::TestCase->new({ + 'alias' => $alias || undef, + 'case_status_id' => $status, + 'category_id' => $category, + 'priority_id' => $priority, + 'isautomated' => $isautomated, + 'estimated_time' => $est_time, + 'script' => $script, + 'arguments' => $arguments, + 'summary' => $summary, + 'requirement' => $requirement, + 'default_tester_id' => $tester, + 'author_id' => Bugzilla->user->id, + 'action' => $tcaction, + 'effect' => $tceffect, + 'setup' => $tcsetup, + 'breakdown' => $tcbreakdown, + 'dependson' => $tcdependson, + 'blocks' => $tcblocks, + 'plans' => \@plans, + }); + + # Check for valid ids or aliases in dependecy fields + + foreach my $field ("dependson", "blocks") { + if ($case->{$field}) { + my @validvalues; + foreach my $id (split(/[\s,]+/, $case->{$field})) { + next unless $id; + Bugzilla::Testopia::Util::validate_test_id($id, 'case'); + push(@validvalues, $id); + } + $case->{$field} = join(",", @validvalues); + } + } + + ThrowUserError('testiopia-alias-exists', + {'alias' => $alias}) if $case->check_alias($alias); + ThrowUserError('testiopia-invalid-data', + {'field' => 'isautomated', 'value' => $isautomated }) + if ($isautomated !~ /^[01]$/); + + my $case_id = $case->store; + $case = Bugzilla::Testopia::TestCase->new($case_id); + + $case->add_component($_) foreach (@components); + if ($cgi->param('addtags')){ + foreach my $name (split(/,/, $cgi->param('addtags'))){ + trick_taint($name); + my $tag = Bugzilla::Testopia::TestTag->new({'tag_name' => $name}); + my $tag_id = $tag->store; + $case->add_tag($tag_id); + } + } + foreach my $run (@runs){ + $run->add_case_run($case->id); + } + + $vars->{'action'} = "Commit"; + $vars->{'form_action'} = "tr_show_case.cgi"; + $vars->{'case'} = $case; + $vars->{'tr_message'} = "Case $case_id Created. + <a href=\"tr_new_case.cgi?plan_id=" . join(",", @plan_ids) . "\">Add another</a>"; + $vars->{'backlink'} = $case; + $template->process("testopia/case/show.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + +} + +#################### +### Display Form ### +#################### +else { + my $bug; + my $summary; + my $text; + if( $cgi->param('bug')){ + $bug = Bugzilla::Bug->new($cgi->param('bug'),Bugzilla->user->id); + + my $bug_id = $bug->bug_id; + my $description = ${$bug->GetComments}[0]; + my $short_desc = $bug->short_desc; + + $summary = Param('bug-to-test-case-summary'); + my $action = Param('bug-to-test-case-action'); + my $effect = Param('bug-to-test-case-results'); + + $summary =~ s/%id%/$bug_id/g; + $summary =~ s/%summary%/$short_desc/g; + + $action =~ s/%id%/<a href="show_bug.cgi?id=$bug_id">$bug_id<\/a>/g; + $action =~ s/%description%/$description/g; + + $effect =~ s/%id%/<a href="show_bug.cgi?id=$bug_id">$bug_id<\/a>/g; + + $text = {'action' => $action, 'effect' => $effect}; + } + else { + $text = {'action' => Param('new-case-action-template'), + 'effect' => Param('new-case-results-template')}; + } + + my $case = Bugzilla::Testopia::TestCase->new( + {'case_id' => 0, + 'plans' => \@plans, + 'category' => {'name' => 'Default'}, + 'summary' => $summary, + 'text' => $text, + }); + my @comps; + foreach my $comp (@{$case->get_selectable_components(1)}){ + push @comps, $comp->default_qa_contact->login; + } + + $vars->{'case'} = $case; + $vars->{'components'} = objToJson(\@comps); + $vars->{'action'} = "Add"; + $vars->{'form_action'} = "tr_new_case.cgi"; + $template->process("testopia/case/add.html.tmpl", $vars) || + ThrowTemplateError($template->error()); +} diff --git a/tr_new_environment.cgi b/tr_new_environment.cgi new file mode 100755 index 0000000..d27d6f4 --- /dev/null +++ b/tr_new_environment.cgi @@ -0,0 +1,96 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> +# Michael Hight <mjhight@gmail.com> +# Garrett Braden <gbraden@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Config; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Environment::Element; +use Bugzilla::Testopia::Environment::Category; +use Bugzilla::Testopia::Environment::Property; + +Bugzilla->login(LOGIN_REQUIRED); + +my $cgi = Bugzilla->cgi; + +use vars qw($vars); +my $template = Bugzilla->template; + +print $cgi->header; + +ThrowUserError("testopia-create-denied", {'object' => 'Test Environment'}) unless Bugzilla->user->in_group('Testers'); + +my $action = $cgi->param('action') || ''; + +if ($action eq 'Add'){ + my $name = $cgi->param('name'); + my $product = $cgi->param('product'); + + trick_taint($name); + detaint_natural($product); + + my $env = Bugzilla::Testopia::Environment->new({'environment_id' => 0}); + + my $success = $env->store_environment_name($name, $product); + unless ($success){ + $vars->{'tr_error'} = "The environment name '$name' is already taken."; + $vars->{'environment'} = $env; + $template->process("testopia/environment/add.html.tmpl", $vars) + || print $template->error(); + exit; + } + $vars->{'tr_message'} = "The environment '$name' was successfully added."; + + $env = Bugzilla::Testopia::Environment->new($success); + my $category = Bugzilla::Testopia::Environment::Category->new({'id' => 0}); + if (Param('useclassification')){ + $vars->{'allhaschild'} = $category->get_all_child_count; + $vars->{'toplevel'} = Bugzilla->user->get_selectable_classifications; + $vars->{'type'} = 'classification'; + } + else { + $vars->{'toplevel'} = $category->get_env_product_list; + $vars->{'type'} = 'product'; + } + $vars->{'user'} = Bugzilla->user; + $vars->{'action'} = 'do_edit'; + $vars->{'environment'} = $env; + $template->process("testopia/environment/show.html.tmpl", $vars) + || print $template->error(); + +} + +else { + $vars->{'environment'} = Bugzilla::Testopia::Environment->new({'environment_id' => 0}); + $vars->{'backlink'} = $vars->{'environment'}; + $vars->{'products'} = Bugzilla->user->get_selectable_products; + + $template->process("testopia/environment/add.html.tmpl", $vars) + || print $template->error(); +} \ No newline at end of file diff --git a/tr_new_plan.cgi b/tr_new_plan.cgi new file mode 100755 index 0000000..bf0df74 --- /dev/null +++ b/tr_new_plan.cgi @@ -0,0 +1,153 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use JSON; + +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::Product; + +use vars qw($vars); +my $template = Bugzilla->template; + +Bugzilla->login(LOGIN_REQUIRED); + +my $dbh = Bugzilla->dbh; +my $cgi = Bugzilla->cgi; + +print $cgi->header; + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +my $action = $cgi->param('action') || ''; + +if ($action eq 'Add'){ + my $product_id = $cgi->param('product_id'); + #TODO can see product; + my $product = Bugzilla::Testopia::Product->new($product_id); + + ThrowUserError("testopia-create-denied", {'object' => 'Test Plan'}) unless Bugzilla->user->in_group('Testers'); + my $name = $cgi->param('plan_name'); + my $prodver = $cgi->param('prod_version'); + my $type = $cgi->param('type'); + my $text = $cgi->param("plandoc") || ''; + ThrowUserError('testopia-missing-required-field', {'field' => 'name'}) if $name eq ''; + + # All inserts are done with placeholders so this is OK + trick_taint($name); + trick_taint($prodver); + trick_taint($text); + detaint_natural($type); + + validate_selection($type, 'type_id', 'test_plan_types'); + my $version = Bugzilla::Version::check_version($product, $prodver); + + my $plan = Bugzilla::Testopia::TestPlan->new({ + 'name' => $name || '', + 'product_id' => $product->id, + 'default_product_version' => $version->name, + 'type_id' => $type, + 'text' => $text, + 'author_id' => Bugzilla->user->id, + }); + my $plan_id = $plan->store; + my @dojo_search; + push @dojo_search, "plandoc","newtag","tagTable"; + $vars->{'dojo_search'} = objToJson(\@dojo_search); + $vars->{'case_table'} = undef; + $vars->{'case_table'} = undef; + $vars->{'action'} = "Commit"; + $vars->{'form_action'} = "tr_show_plan.cgi"; + $vars->{'plan'} = Bugzilla::Testopia::TestPlan->new($plan_id); + $vars->{'tr_message'} = "Test Plan: \"". $plan->name ."\" created successfully."; + $vars->{'backlink'} = $vars->{'plan'}; + $template->process("testopia/plan/show.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + +} +#################### +### Ajax Actions ### +#################### +elsif ($action eq 'getversions'){ + print $cgi->header; + my $plan = Bugzilla::Testopia::TestPlan->new({}); + my $prod_id = $cgi->param("product_id"); + my @versions; + if ($prod_id == -1){ + # For update multiple from tr_list_plans + push @versions, {'id' => "--Do Not Change--", 'name' => "--Do Not Change--"}; + } + else{ + detaint_natural($prod_id); + my $prod = $plan->lookup_product($prod_id); + unless (Bugzilla->user->can_see_product($prod)){ + print '{ERROR:"You do not have permission to view this product"}'; + exit; + } + my $product = Bugzilla::Testopia::Product->new($prod_id); + @versions = @{$product->versions}; + } + my $json = new JSON; + $json->autoconv(0); + print $json->objToJson(\@versions); +} +# For use in new_case and show_case since new_plan does not require an id +elsif ($action eq 'getcomps'){ + my $plan = Bugzilla::Testopia::TestPlan->new({}); + my $product_id = $cgi->param('product_id'); + + detaint_natural($product_id); + my $prod = $plan->lookup_product($product_id); + unless (Bugzilla->user->can_see_product($prod)){ + print '{ERROR:"You do not have permission to view this product"}'; + exit; + } + my $product = Bugzilla::Testopia::Product->new($product_id); + + my @comps; + foreach my $c (@{$product->components}){ + push @comps, {'id' => $c->id, 'name' => $c->name, 'qa_contact' => $c->default_qa_contact->login}; + } + my $json = new JSON; + print $json->objToJson(\@comps); + exit; +} + +#################### +### Display Form ### +#################### +else { + ThrowUserError("testopia-create-denied", {'object' => 'Test Plan'}) unless Bugzilla->user->in_group('Testers'); + $vars->{'action'} = "Add"; + $vars->{'form_action'} = "tr_new_plan.cgi"; + $vars->{'plan'} = Bugzilla::Testopia::TestPlan->new( + {'plan_id' => 0, + 'product_id' => $cgi->param('product_id')}); + $template->process("testopia/plan/add.html.tmpl", $vars) || + ThrowTemplateError($template->error()); +} diff --git a/tr_new_run.cgi b/tr_new_run.cgi new file mode 100755 index 0000000..d3d55c0 --- /dev/null +++ b/tr_new_run.cgi @@ -0,0 +1,237 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::User; + +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; + +require 'globals.pl'; + +use vars qw($vars); +my $template = Bugzilla->template; +my $query_limit = 10000; + +Bugzilla->login(LOGIN_REQUIRED); +my $cgi = Bugzilla->cgi; + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +my $action = $cgi->param('action') || ''; +my $plan_id = $cgi->param('plan_id'); + +unless ($plan_id){ + $vars->{'form_action'} = 'tr_new_run.cgi'; + print $cgi->header; + $template->process("testopia/plan/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; +} + +detaint_natural($plan_id); +validate_test_id($plan_id, 'plan'); + +my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + +unless ($plan->canedit){ + print $cgi->header; + ThrowUserError("testopia-create-denied", {'object' => 'Test Run', 'plan' => $plan}); +} + +unless (scalar @{$plan->product->builds(1)} > 0){ + print $cgi->header; + ThrowUserError('testopia-create-build', {'plan' => $plan}); +} + +if ($action eq 'Add'){ + my $serverpush = support_server_push($cgi); + if ($serverpush) { + print $cgi->multipart_init; + print $cgi->multipart_start; + + $template->process("list/server-push.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + my $manager = login_to_id(trim($cgi->param('manager'))); + my $status = $cgi->param('status'); + my $prodver = $cgi->param('product_version'); + my $pversion = $cgi->param('plan_version'); + my $build = $cgi->param('build'); + my $summary = $cgi->param('summary'); + my $notes = $cgi->param('notes'); + my $env = $cgi->param('environment') ? $cgi->param('environment') : $cgi->param('env_pick'); + if ($summary eq ''){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-missing-required-field', {'field' => 'summary'}); + } + if ($env eq '' && !$cgi->param('new_env')){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-missing-required-field', {'field' => 'environment'}); + } + unless ($manager){ + print $cgi->multipart_end if $serverpush; + ThrowUserError("invalid_username", { name => $cgi->param('assignee') }); + } + + detaint_natural($status); + detaint_natural($build); + detaint_natural($pversion); + detaint_natural($env); + + # All inserts are done with placeholders so this is OK + trick_taint($summary); + trick_taint($notes); + trick_taint($prodver); + + + if ($cgi->param('new_build')){ + my $new_build = $cgi->param('new_build'); + trick_taint($new_build); + my $b = Bugzilla::Testopia::Build->new({ + 'name' => $new_build, + 'milestone' => '---', + 'product_id' => $plan->product_id, + 'description' => '', + 'isactive' => 1, + }); + my $bid = $b->check_name($new_build); + if($bid){ + $build = $bid; + } + else{ + $build = $b->store; + } + } + + if ($cgi->param('new_env')){ + my $new_env = $cgi->param('new_env'); + trick_taint($new_env); + my $e = Bugzilla::Testopia::Environment->new({ + 'name' => $new_env, + 'product_id' => $plan->product_id, + 'isactive' => 1, + }); + my $eid = $e->check_environment($new_env, $plan->product_id); + if($eid){ + $env = $eid; + } + else { + $env = $e->store; + } + } + validate_test_id($env, 'environment'); + my $reg = qr/c_([\d]+)/; + my @c; + foreach my $p ($cgi->param()){ + push @c, $1 if $p =~ $reg; + } + + my $run = Bugzilla::Testopia::TestRun->new({ + 'plan_id' => $plan_id, + 'environment_id' => $env, + 'build_id' => $build, + 'product_version' => $prodver, + 'plan_text_version' => $pversion, + 'manager_id' => $manager, + 'summary' => $summary, + 'notes' => $notes, + 'plan' => $plan, + }); + my $run_id = $run->store; + $run = Bugzilla::Testopia::TestRun->new($run_id); + + my $progress_interval = 250; + my $i = 0; + my $total = scalar @c; + foreach my $case_id (@c){ + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + $run->add_case_run($case_id); + } + # clear the params so we don't confuse search. + $cgi->delete_all; + if ($serverpush) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } else { + print $cgi->header; + } + $cgi->param('current_tab', 'case_run'); + $cgi->param('run_id', $run_id); + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('case_run', 'tr_show_run.cgi', $cgi, undef, $search->query); + if ($table->view_count > $query_limit){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-query-too-large', {'limit' => $query_limit}); + } + + $vars->{'run'} = $run; + $vars->{'table'} = $table; + $vars->{'action'} = 'Commit'; + $vars->{'form_action'} = 'tr_show_run.cgi'; + $vars->{'tr_message'} = "Test Run: \"". $run->summary ."\" created successfully."; + $vars->{'backlink'} = $run; + $template->process("testopia/run/show.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; + +} + +#################### +### Display Form ### +#################### +else { + $cgi->param('current_tab', 'case'); + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('case', 'tr_new_run.cgi', $cgi, undef, $search->query); + $vars->{'case'} = Bugzilla::Testopia::TestCase->new({}); + $vars->{'table'} = $table; + $vars->{'dotweak'} = 1; + $vars->{'fullwidth'} = 1; #novellonly + $vars->{'plan'} = $plan; + $vars->{'action'} = 'Add'; + my $run = Bugzilla::Testopia::TestRun->new( + {'run_id' => 0, + 'plan' => $plan, + 'plan_text_version' => $plan->version } ); + print $cgi->header; + ThrowUserError('testopia-create-environment') unless (scalar @{$run->environments} > 0); + $vars->{'run'} = $run; + $template->process("testopia/run/add.html.tmpl", $vars) || + ThrowTemplateError($template->error()); +} diff --git a/tr_plan_access.cgi b/tr_plan_access.cgi new file mode 100644 index 0000000..a9d1c0d --- /dev/null +++ b/tr_plan_access.cgi @@ -0,0 +1,134 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Testopia::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Product; + +use vars qw($vars); + +require 'globals.pl'; + +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; + +Bugzilla->login(LOGIN_REQUIRED); +print $cgi->header; + +my $plan_id = trim($cgi->param('plan_id') || ''); +my $action = $cgi->param('action') || ''; + +unless (detaint_natural($plan_id)){ + $vars->{'form_action'} = 'tr_plan_access.cgi'; + $template->process("testopia/plan/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; +} + +validate_test_id($plan_id, 'plan'); +my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + +unless ($plan->canadmin){ + ThrowUserError('testopia-plan-acl-denied', {plan_id => $plan->id}); +} + +if ($action eq 'Apply Changes'){ + do_update(); + display(); +} +elsif ($action eq 'Add User'){ + do_update(); + my $userid = login_to_id(trim($cgi->param('adduser'))); + ThrowUserError("invalid_username", { name => $cgi->param('adduser')}) unless $userid; + ThrowUserError('testopia-tester-already-on-list', {'login' => $cgi->param('adduser')}) + if ($plan->check_tester($userid)); + + my $perms = 0; + + $perms |= TR_READ if $cgi->param("nr"); + $perms |= TR_READ | TR_WRITE if $cgi->param("nw"); + $perms |= TR_READ | TR_WRITE | TR_DELETE if $cgi->param("nd"); + $perms |= TR_READ | TR_WRITE | TR_DELETE | TR_ADMIN if $cgi->param("na"); + + detaint_natural($perms); + $plan->add_tester($userid, $perms); + + display(); +} +elsif ($action eq 'delete'){ + my $userid = $cgi->param('user'); + detaint_natural($userid); + my $user = Bugzilla::User->new($userid); + $plan->remove_tester($user->id); + $vars->{'tr_message'} = $user->login ." Removed from Plan"; + display(); +} + +else{ + display(); +} + +sub do_update { + # We need at least one admin + my $params = join(" ", $cgi->param()); + ThrowUserError('testopia-no-admins') unless $params =~ /(^|\s)a\d+($|\s)/; + + my $tester_regexp = $cgi->param('userregexp'); + trick_taint($tester_regexp); + + my $regexp_perms = 0; + + # Each permission implies the prior ones. + $regexp_perms |= TR_READ if $cgi->param('pr'); + $regexp_perms |= TR_READ | TR_WRITE if $cgi->param('pw'); + $regexp_perms |= TR_READ | TR_WRITE | TR_DELETE if $cgi->param('pd'); + $regexp_perms |= TR_READ | TR_WRITE | TR_DELETE | TR_ADMIN if $cgi->param('pa'); + + detaint_natural($regexp_perms); + $plan->set_tester_regexp($tester_regexp, $regexp_perms); + + foreach my $row (@{$plan->access_list}){ + my $perms = 0; + + $perms |= TR_READ if $cgi->param('r'.$row->{'user'}->id); + $perms |= TR_READ | TR_WRITE if $cgi->param('w'.$row->{'user'}->id); + $perms |= TR_READ | TR_WRITE | TR_DELETE if $cgi->param('d'.$row->{'user'}->id); + $perms |= TR_READ | TR_WRITE | TR_DELETE | TR_ADMIN if $cgi->param('a'.$row->{'user'}->id); + + detaint_natural($perms); + $plan->update_tester($row->{'user'}->id, $perms); + } +} + +sub display { + $vars->{'plan'} = $plan; + $vars->{'user'} = Bugzilla->user; + $template->process("testopia/admin/access-list.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} \ No newline at end of file diff --git a/tr_plan_reports.cgi b/tr_plan_reports.cgi new file mode 100755 index 0000000..3385d9d --- /dev/null +++ b/tr_plan_reports.cgi @@ -0,0 +1,168 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Report; + +require "globals.pl"; + +use vars qw($vars); +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; + +Bugzilla->login(LOGIN_REQUIRED); + +my $type = $cgi->param('type') || ''; + +if ($type eq 'build_coverage'){ + my $plan_id = trim(Bugzilla->cgi->param('plan_id') || ''); + + unless ($plan_id){ + $vars->{'form_action'} = 'tr_plan_reports.cgi'; + $vars->{'type'} = 'build_coverage'; + print $cgi->header; + $template->process("testopia/plan/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; + } + validate_test_id($plan_id, 'plan'); + push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + + my $action = $cgi->param('action') || ''; + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + ThrowUserError("testopia-permission-denied", {'object' => $plan}) unless $plan->canview; + my $report = {}; + my %buildseen; + foreach my $case (@{$plan->test_cases}){ + foreach my $cr (@{$case->caseruns}){ + $buildseen{$cr->build->id} = $cr->build->name; + $report->{$case->id}->{$cr->build->id} = $cr; + } + $report->{$case->id}->{'name'} = $case->summary; + } + my $run_reports = {}; + foreach my $run (@{$plan->test_runs}){ + foreach my $cr (@{$run->caseruns}){ + $run_reports->{$run->id}->{$cr->case->id}->{$cr->build->id} = $cr; + $run_reports->{$run->id}->{$cr->case->id}->{'name'} = $cr->case->summary; + } + + $run_reports->{$run->id}->{'name'} = $run->summary; + } + my @ids = keys %buildseen; + $report->{'build_ids'} = \@ids; + $report->{'builds'} = \%buildseen; + $vars->{'run_reports'} = $run_reports; + $vars->{'report'} = $report; + $vars->{'plan'} = $plan; + + print $cgi->header(); + if ($cgi->param('debug')){ + use Data::Dumper; + print Dumper($report); + print Dumper($run_reports); + } + $template->process("testopia/reports/build-coverage.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} +elsif ($type eq 'bugcounts'){ + my $plan_id = trim(Bugzilla->cgi->param('plan_id') || ''); + + unless ($plan_id){ + $vars->{'form_action'} = 'tr_plan_reports.cgi'; + $vars->{'type'} = 'bugcounts'; + print $cgi->header; + $template->process("testopia/plan/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; + } + validate_test_id($plan_id, 'plan'); + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + ThrowUserError("testopia-permission-denied", {'object' => $plan}) unless $plan->canview; + + my $dbh = Bugzilla->dbh; + my $ref = $dbh->selectall_arrayref( + "SELECT COUNT(bug_id) AS casecount, bug_id FROM test_case_bugs + INNER JOIN test_cases ON test_cases.case_id = test_case_bugs.case_id + INNER JOIN test_case_plans ON test_case_plans.case_id = test_cases.case_id + INNER JOIN test_plans ON test_case_plans.plan_id = test_plans.plan_id + WHERE test_plans.plan_id = ? + GROUP BY test_cases.case_id", {'Slice'=>{}}, $plan->id); + + $vars->{'bug_table'} = $ref; + $vars->{'plan'} = $plan; + + print $cgi->header; + $template->process("testopia/reports/bug-count.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} +else{ + $cgi->param('current_tab', 'plan'); + $cgi->param('viewall', 1); + my $report = Bugzilla::Testopia::Report->new('plan', 'tr_list_plans.cgi', $cgi); + $vars->{'report'} = $report; + + ### From Bugzilla report.cgi by Gervase Markham + my $formatparam = $cgi->param('format'); + my $report_action = $cgi->param('report_action'); + if ($report_action eq "data") { + # So which template are we using? If action is "wrap", we will be using + # no format (it gets passed through to be the format of the actual data), + # and either report.csv.tmpl (CSV), or report.html.tmpl (everything else). + # report.html.tmpl produces an HTML framework for either tables of HTML + # data, or images generated by calling report.cgi again with action as + # "plot". + $formatparam =~ s/[^a-zA-Z\-]//g; + trick_taint($formatparam); + $vars->{'format'} = $formatparam; + $formatparam = ''; + } + elsif ($report_action eq "plot") { + # If action is "plot", we will be using a format as normal (pie, bar etc.) + # and a ctype as normal (currently only png.) + $vars->{'cumulate'} = $cgi->param('cumulate') ? 1 : 0; + $vars->{'x_labels_vertical'} = $cgi->param('x_labels_vertical') ? 1 : 0; + $vars->{'data'} = $report->{'image_data'}; + } + else { + ThrowCodeError("unknown_action", {action => $cgi->param('report_action')}); + } + + my $format = $template->get_format("testopia/reports/report", $formatparam, + scalar($cgi->param('ctype'))); + + my $filename = "report-" . $report->{'date'} . ".$format->{extension}"; + print $cgi->header(-type => $format->{'ctype'}, + -content_disposition => "inline; filename=$filename"); + $vars->{'time'} = time(); + $template->process("$format->{'template'}", $vars) + || ThrowTemplateError($template->error()); + + exit; +} diff --git a/tr_query.cgi b/tr_query.cgi new file mode 100755 index 0000000..fd6abef --- /dev/null +++ b/tr_query.cgi @@ -0,0 +1,340 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Maciej Maczynski <macmac@xdsnet.pl> +# Ed Fuentetaja <efuentetaja@acm.org> +# Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::Environment::Category; +use Bugzilla::Testopia::Environment::Element; +use Bugzilla::Testopia::Environment::Property; +use JSON; + +use vars qw($vars $template); + +my $dbh = Bugzilla->dbh; +my $cgi = Bugzilla->cgi; +my $template = Bugzilla->template; + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +Bugzilla->login(LOGIN_REQUIRED); + +sub get_searchable_objects{ + my $object = shift; + my $dbh = Bugzilla->dbh; + + my $products = Bugzilla->user->get_selectable_products; + my @ids; + foreach my $p (@{$products}){ + push @ids, $p->id; + } + my $ref; + SWITCH: for ($object) { + /^components/ && do { + $ref = $dbh->selectall_arrayref( + "SELECT DISTINCT name AS id, name + FROM components WHERE product_id IN (". join(",",@ids) .") + ORDER BY name", {'Slice'=>{}}); + last SWITCH; + }; + + /^categories/ && do { + $ref = $dbh->selectall_arrayref( + "SELECT DISTINCT name AS id, name + FROM test_case_categories WHERE product_id IN (". join(",",@ids) .") + ORDER BY name", {'Slice'=>{}}); + last SWITCH; + }; + + /^builds/ && do { + $ref = $dbh->selectall_arrayref( + "SELECT DISTINCT name AS id, name + FROM test_builds WHERE product_id IN (". join(",",@ids) .") + ORDER BY name", {'Slice'=>{}}); + last SWITCH; + }; + + /^versions/ && do { + $ref = $dbh->selectall_arrayref( + "SELECT DISTINCT value AS id, value AS name + FROM versions WHERE product_id IN (". join(",",@ids) .") + ORDER BY name", {'Slice'=>{}}); + last SWITCH; + }; + + /^milestones/ && do { + $ref = $dbh->selectall_arrayref( + "SELECT DISTINCT value AS id, value AS name + FROM milestones WHERE product_id IN (". join(",",@ids) .") + ORDER BY name", {'Slice'=>{}}); + last SWITCH; + }; + + /^environments/ && do { + $ref = $dbh->selectall_arrayref( + "SELECT DISTINCT name AS id, name + FROM test_environments WHERE product_id IN (". join(",",@ids) .") + ORDER BY name", {'Slice'=>{}}); + last SWITCH; + }; + } + return $ref; +} + + +print $cgi->header; + +my $action = $cgi->param('action') || ''; + +if ($action eq 'getversions'){ + my @prod_ids = split(",", $cgi->param('prod_ids')); + my $tab = $cgi->param('current_tab') || ''; + my $plan = Bugzilla::Testopia::TestPlan->new({}); + + my $products; + my @validated; + foreach my $p (@prod_ids){ + detaint_natural($p); + validate_selection($p,'id','products'); + my $prod = $plan->lookup_product($p); + push @validated, $p if Bugzilla->user->can_see_product($prod); + } + my $prod_ids = join(",", @validated); + my $dbh = Bugzilla->dbh; + $products->{'version'} = $dbh->selectcol_arrayref("SELECT DISTINCT value FROM versions WHERE product_id IN ($prod_ids)"); + $products->{'milestone'} = $dbh->selectcol_arrayref("SELECT DISTINCT value FROM milestones WHERE product_id IN ($prod_ids)"); + $products->{'component'} = $dbh->selectcol_arrayref("SELECT DISTINCT name FROM components WHERE product_id IN ($prod_ids)"); + $products->{'build'} = $dbh->selectcol_arrayref("SELECT DISTINCT name FROM test_builds WHERE product_id IN ($prod_ids)"); + $products->{'category'} = $dbh->selectcol_arrayref("SELECT DISTINCT name FROM test_case_categories WHERE product_id IN ($prod_ids)"); + $products->{'environment'} = $dbh->selectcol_arrayref("SELECT DISTINCT name FROM test_environments WHERE product_id IN ($prod_ids)"); + + # This list must match the name of the select fields and the names above + $products->{'selectTypes'} = [qw{version milestone component build category environment}]; + + my $json = new JSON; + $json->autoconv(0); + print $json->objToJson($products); +} + +elsif ($action eq 'get_products'){ + my @prod; + if (Param('useclassification')){ + my @classes = $cgi->param('class_ids'); + foreach my $id (@classes){ + my $class = Bugzilla::Classification->new($id); + push @prod, @{$class->user_visible_products}; + } + } + else { + @prod = Bugzilla->user->get_selectable_products; + } + + my $ret; + foreach my $e (@prod){ + $ret .= $e->{'id'}.'||'.$e->{'name'}.'|||'; + } + chop($ret); + print $ret; +} + +elsif ($action eq 'get_categories'){ + my @prod_ids = $cgi->param('prod_id'); + my $ret; + + foreach my $prod_id (@prod_ids){ + detaint_natural($prod_id); + my $cat = Bugzilla::Testopia::Environment::Category->new({}); + my $cats_ref = $cat->get_element_categories_by_product($prod_id); + + foreach my $e (@{$cats_ref}){ + $ret .= $e->id.'||'.$e->name.'|||'; + } + } + chop($ret); + print $ret; +} +elsif ($action eq 'get_elements'){ + my @cat_ids = $cgi->param('cat_id'); + my $ret; + my @elmnts; + + foreach my $cat_id (@cat_ids){ + detaint_natural($cat_id); + + my $cat = Bugzilla::Testopia::Environment::Category->new($cat_id); + my $elmnts_ref = $cat->get_elements_by_category($cat->{'name'}); + + foreach my $e (@{$elmnts_ref}){ + push @elmnts, Bugzilla::Testopia::Environment::Element->new($e->{'element_id'}); + } + } + + foreach my $e (@elmnts){ + $ret .= $e->id.'||'.$e->name.'|||'; + } + chop($ret); + print $ret; +} + +elsif ($action eq 'get_properties'){ + my @elmnt_ids = $cgi->param('elmnt_id'); + my $ret; + + foreach my $elmnt_id (@elmnt_ids){ + detaint_natural($elmnt_id); + + my $elmnt = Bugzilla::Testopia::Environment::Element->new($elmnt_id); + my $props = $elmnt->get_properties(); + + foreach my $e (@{$props}){ + $ret .= $e->id.'||'.$e->name.'|||'; + } + } + chop($ret); + print $ret; +} +elsif ($action eq 'get_valid_exp'){ + my @prop_ids = $cgi->param('prop_id'); + my $ret; + + foreach my $prop_id (@prop_ids){ + detaint_natural($prop_id); + + my $prop = Bugzilla::Testopia::Environment::Property->new($prop_id); + my $exp = $prop->validexp; + + my @exps = split /\|/, $exp; + foreach my $exp (@exps){ + $ret .=$exp.'|||'; + } + } + chop($ret); + print $ret; +} +elsif ($action eq 'save_query'){ + ; + my $query = $cgi->param('query_part'); + my $qname = $cgi->param('query_name'); + + ThrowUserError('query_name_missing') unless $qname; + + trick_taint($query); + trick_taint($qname); + + my ($name) = $dbh->selectrow_array( + "SELECT name + FROM test_named_queries + WHERE userid = ? + AND name = ?", + undef,(Bugzilla->user->id, $qname)); + + if ($name){ + $dbh->do( + "UPDATE test_named_queries + SET query = ? + WHERE userid = ? + AND name = ?", + undef,($query, Bugzilla->user->id, $qname)); + $vars->{'tr_message'} = "Updated saved search '$qname'"; + } + else{ + my $quoted_qname = url_quote($qname); + $query .= "&qname=$quoted_qname"; + $dbh->do("INSERT INTO test_named_queries + VALUES(?,?,?,?)", + undef, (Bugzilla->user->id, $qname, 1, $query)); + + $vars->{'tr_message'} = "Search saved as '$qname'"; + } + display(); +} +elsif ($action eq 'delete_query'){ + my $qname = $cgi->param('query_name'); + + trick_taint($qname); + + $dbh->do("DELETE FROM test_named_queries WHERE userid = ? AND name = ?", + undef, (Bugzilla->user->id, $qname)); + $vars->{'tr_message'} = "Testopia Saved Search '$qname' Deleted"; + display(); +} +else{ + display(); +} + +sub display { + + #TODO: Support default query + my $tab = $cgi->param('current_tab') || ''; + if ($tab eq 'plan'){ + $vars->{'plan'} = Bugzilla::Testopia::TestPlan->new({}); + $vars->{'title'} = "Search For Test Plans"; + $vars->{'versions'} = get_searchable_objects('versions'); + } + elsif ($tab eq 'run'){ + $vars->{'title'} = "Search For Test Runs"; + $vars->{'run'} = Bugzilla::Testopia::TestRun->new({});; + $vars->{'versions'} = get_searchable_objects('versions'); + $vars->{'milestones'} = get_searchable_objects('milestones'); + $vars->{'builds'} = get_searchable_objects('builds'); + $vars->{'environments'} = get_searchable_objects('environments'); + } + elsif ($tab eq 'environment'){ + $vars->{'title'} = "Search For Test Run Environments"; + $vars->{'classifications'} = Bugzilla->user->get_selectable_classifications; + $vars->{'products'} = Bugzilla->user->get_selectable_products; + $vars->{'env'} = Bugzilla::Testopia::Environment->new({}); + } + elsif ($tab eq 'case_run'){ + $vars->{'title'} = "Search For Test Case-Runs"; + $vars->{'case'} = Bugzilla::Testopia::TestCase->new({}); + $vars->{'run'} = Bugzilla::Testopia::TestRun->new({}); + $vars->{'caserun'} = Bugzilla::Testopia::TestCaseRun->new({}); + + $vars->{'versions'} = get_searchable_objects('versions'); + $vars->{'milestones'} = get_searchable_objects('milestones'); + $vars->{'builds'} = get_searchable_objects('builds'); + $vars->{'environments'} = get_searchable_objects('environments'); + $vars->{'components'} = get_searchable_objects('components'); + $vars->{'categories'} = get_searchable_objects('categories'); + } + else { # show the case form + $tab = 'case'; + my $case = Bugzilla::Testopia::TestCase->new({ 'case_id' => 0 }); + $vars->{'title'} = "Search For Test Cases"; + $vars->{'case'} = $case; + $vars->{'components'} = get_searchable_objects('components'); + $vars->{'categories'} = get_searchable_objects('categories'); + } + $vars->{'report'} = $cgi->param('report'); + $vars->{'current_tab'} = $tab; + $template->process("testopia/search/advanced.html.tmpl", $vars) + || ThrowTemplateError($template->error()); +} diff --git a/tr_quicksearch.cgi b/tr_quicksearch.cgi new file mode 100755 index 0000000..9b853f6 --- /dev/null +++ b/tr_quicksearch.cgi @@ -0,0 +1,321 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Config; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::TestRun; + +use JSON; + +use vars qw($vars); + +Bugzilla->login(LOGIN_REQUIRED); + +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; + +my $action = $cgi->param('action') || ''; +my $term = trim($cgi->param('query')) || ''; + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +# Quicksearch allows a user to look up any of the major objects in Testopia +# using a simple prefix. For instance, e:linux will search for all environments +# with linux in the name or tr 33 will bring up Test Run 33. +# If only one is returned, we jump to the appropriate page, otherwise +# we display the list. + +# If we have a term we are using this quicksearch +if ($term){ + SWITCH: for ($term){ + /^(tag)?[\s:-]+(.*)$/i && do{ + my $text = trim($2); + print "Location: " . Param('urlbase') . "tr_tags.cgi?tag=" . $text . "\n\n"; + last SWITCH; + }; + /^(plan|TP|p)?[\s:-]+(.*)$/i && do{ + my $text = trim($2); + if ($text =~ /^\d+$/){ + print "Location: " . Param('urlbase') . "tr_show_plan.cgi?plan_id=" . $text . "\n\n"; + } + else{ + $cgi->param('current_tab', 'plan'); + $cgi->param('name_type', 'anywordssubstr'); + $cgi->param('name', $text); + + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('plan', 'tr_list_plans.cgi', $cgi, undef, $search->query); + if ($table->list_count == 1){ + print "Location: " . Param('urlbase') . "tr_show_plan.cgi?plan_id=" . ${$table->list}[0]->id . "\n\n"; + } + else{ + print "Location: " . Param('urlbase') . "tr_list_plans.cgi?" . $table->get_query_part . "\n\n"; + } + + } + last SWITCH; + }; + /^(run|TR|r)?[\s:-]+(.*)$/i && do{ + my $text = trim($2); + if ($text =~ /^\d+$/){ + print "Location: " . Param('urlbase') . "tr_show_run.cgi?run_id=" . $text . "\n\n"; + } + else{ + $cgi->param('current_tab', 'run'); + $cgi->param('summary_type', 'anywordssubstr'); + $cgi->param('summary', $text); + + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('run', 'tr_list_runs.cgi', $cgi, undef, $search->query); + if ($table->list_count == 1){ + print "Location: " . Param('urlbase') . "tr_show_run.cgi?run_id=" . ${$table->list}[0]->id . "\n\n"; + } + else{ + print "Location: " . Param('urlbase') . "tr_list_runs.cgi?" . $table->get_query_part . "\n\n"; + } + + } + last SWITCH; + }; + /^(environment|TE|e|env)?[\s:-]+(.*)$/i && do{ + my $text = trim($2); + if ($text =~ /^\d+$/){ + print "Location: " . Param('urlbase') . "tr_show_environment.cgi?env_id=" . $text . "\n\n"; + } + else{ + $cgi->param('current_tab', 'environment'); + $cgi->param('name_type', 'anywordssubstr'); + $cgi->param('name', $text); + + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('environment', 'tr_list_runs.cgi', $cgi, undef, $search->query); + if ($table->list_count == 1){ + print "Location: " . Param('urlbase') . "tr_show_environment.cgi?env_id=" . ${$table->list}[0]->id . "\n\n"; + } + else{ + print "Location: " . Param('urlbase') . "tr_list_environments.cgi?" . $table->get_query_part . "\n\n"; + } + + } + last SWITCH; + }; + /^(caserun|TCR|cr)?[\s:-]+(.*)$/i && do{ + my $text = trim($2); + if ($text =~ /^\d+$/){ + print "Location: " . Param('urlbase') . "tr_show_caserun.cgi?caserun_id=" . $text . "\n\n"; + } + else{ + $cgi->param('current_tab', 'case_run'); + $cgi->param('notes_type', 'anywordssubstr'); + $cgi->param('notes', $text); + + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('run', 'tr_list_runs.cgi', $cgi, undef, $search->query); + if ($table->list_count == 1){ + print "Location: " . Param('urlbase') . "tr_show_caserun.cgi?caserun_id=" . ${$table->list}[0]->id . "\n\n"; + } + else{ + print "Location: " . Param('urlbase') . "tr_list_caseruns.cgi?" . $table->get_query_part . "\n\n"; + } + + } + last SWITCH; + }; + do{ + $term =~ s/^(case|TC|c)?[\s:-]+(.*)$/$2/gi; + if ($term =~ /^\d+$/){ + print "Location: " . Param('urlbase') . "tr_show_case.cgi?case_id=" . $term . "\n\n"; + } + else{ + $cgi->param('current_tab', 'case'); + $cgi->param('summary_type', 'anywordssubstr'); + $cgi->param('summary', $term); + + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('case', 'tr_list_cases.cgi', $cgi, undef, $search->query); + if ($table->list_count == 1){ + print "Location: " . Param('urlbase') . "tr_show_case.cgi?case_id=" . ${$table->list}[0]->id . "\n\n"; + } + else{ + print "Location: " . Param('urlbase') . "tr_list_cases.cgi?" . $table->get_query_part . "\n\n"; + } + + } + }; + } + +} +############ +### Ajax ### +############ + +# This is where we lookup items typed into Dojo combo boxes +else{ + print $cgi->header; + +# Environment Lookup + if ($action eq 'getenv'){ + Bugzilla->batch(1); + my $search = $cgi->param('search'); + my $run_id = $cgi->param('run_id'); + eval { + detaint_natural($run_id); + trick_taint($search); + validate_test_id($run_id, 'run'); + }; + exit if $@; + + my $run = Bugzilla::Testopia::TestRun->new($run_id); + $search = "%$search%"; + my $dbh = Bugzilla->dbh; + + # The order of name and environment are important in the select statment. + # JSON will convert this to an array of arrays which Dojo will interpret + # as a select list in the ComboBox widget. + my $ref; + + if ($run_id){ + $ref = $dbh->selectall_arrayref( + "SELECT test_environments.name AS name, test_environments.environment_id + FROM test_environments + WHERE name like ? AND product_id = ? AND isactive = 1 + UNION SELECT test_environments.name AS name, test_environments.environment_id + FROM test_case_runs + INNER JOIN test_environments ON test_case_runs.environment_id = test_environments.environment_id + WHERE name like ? AND test_case_runs.run_id = ? + AND isactive = 1 + ORDER BY name", + undef, ($search, $run->plan->product_id, + $search, $run_id)); + } + else{ + $ref = $dbh->selectall_arrayref( + "SELECT name, environment_id + FROM test_environments + WHERE name like ? AND isactive = 1 + ORDER BY name + LIMIT 20", + undef, ($search)); + } + print objToJson($ref); + } + elsif ($action eq 'getuser'){ + my $search = $cgi->param('search'); + $search = "%$search%"; + trick_taint($search); + my $dbh = Bugzilla->dbh; + + my $query = "SELECT DISTINCT login_name, realname,"; + if (&::Param('usevisibilitygroups')) { + $query .= " COUNT(group_id) "; + } else { + $query .= " 1 "; + } + $query .= "FROM profiles "; + if (&::Param('usevisibilitygroups')) { + $query .= "LEFT JOIN user_group_map " . + "ON user_group_map.user_id = userid AND isbless = 0 " . + "AND group_id IN(" . + join(', ', (-1, @{Bugzilla->user->visible_groups_inherited})) . ")"; + } + $query .= " WHERE disabledtext = '' AND (login_name LIKE ? OR realname LIKE ?) "; + $query .= $dbh->sql_group_by('userid', 'login_name, realname'); + $query .= " ORDER BY login_name LIMIT 20"; + + my $sth = $dbh->prepare($query); + $sth->execute($search,$search); + + my @userlist; + while (my($login, $name, $visible) = $sth->fetchrow_array) { + if ($visible){ + push @userlist, [ + $name ? "$name <$login>" : $login, $login + ]; + } + } + + print objToJson(\@userlist); + + } +# Tag lookup + elsif ($action eq 'gettag'){ + my $search = $cgi->param('search'); + my @product_ids; + foreach my $id (split(",", $cgi->param('product_id'))){ + push @product_ids, $id if detaint_natural($id); + } + my $product_ids = join(",". @product_ids); + + trick_taint($search); + $search = "%$search%"; + my $dbh = Bugzilla->dbh; + my $ref; + my $run_id = $cgi->param('run_id'); + if ($product_ids){ + $ref = $dbh->selectall_arrayref( + "SELECT tag_name, test_tags.tag_id + FROM test_tags + INNER JOIN test_case_tags ON test_tags.tag_id = test_case_tags.tag_id + INNER JOIN test_cases on test_cases.case_id = test_case_tags.case_id + INNER JOIN test_case_plans on test_case_plans.case_id = test_cases.case_id + INNER JOIN test_plans ON test_plans.plan_id = test_case_plans.plan_id + WHERE tag_name like ? AND test_plans.product_id IN ($product_ids) + UNION SELECT tag_name, test_tags.tag_id + FROM test_tags + INNER JOIN test_plan_tags ON test_plan_tags.tag_id = test_tags.tag_id + INNER JOIN test_plans ON test_plan_tags.plan_id = test_plans.plan_id + WHERE tag_name like ? AND test_plans.product_id IN ($product_ids) + UNION SELECT tag_name, test_tags.tag_id + FROM test_tags + INNER JOIN test_run_tags ON test_run_tags.tag_id = test_tags.tag_id + INNER JOIN test_runs ON test_runs.run_id = test_run_tags.run_id + INNER JOIN test_plans ON test_plans.plan_id = test_runs.plan_id + WHERE tag_name like ? AND test_plans.product_id IN ($product_ids) + ORDER BY tag_name", + undef, ($search,$search,$search)); + } + else { + $ref = $dbh->selectall_arrayref( + "SELECT tag_name, tag_id + FROM test_tags + WHERE tag_name like ? + ORDER BY tag_name + LIMIT 20", + undef, $search); + } + print objToJson($ref); + } + +# If neither is true above, display the quicksearch form and explaination. + else{ + $template->process("testopia/quicksearch.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + } +} \ No newline at end of file diff --git a/tr_run_reports.cgi b/tr_run_reports.cgi new file mode 100644 index 0000000..b0f990e --- /dev/null +++ b/tr_run_reports.cgi @@ -0,0 +1,83 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Constants; +use Bugzilla::Testopia::Report; + +use vars qw($vars); +my $template = Bugzilla->template; +my $cgi = Bugzilla->cgi; + +Bugzilla->login(LOGIN_REQUIRED); + +my $type = $cgi->param('type') || ''; + +$cgi->param('current_tab', 'run'); +$cgi->param('viewall', 1); +my $report = Bugzilla::Testopia::Report->new('run', 'tr_list_runs.cgi', $cgi); +$vars->{'report'} = $report; + +### From Bugzilla report.cgi by Gervase Markham +my $formatparam = $cgi->param('format'); +my $report_action = $cgi->param('report_action'); +if ($report_action eq "data") { + # So which template are we using? If action is "wrap", we will be using + # no format (it gets passed through to be the format of the actual data), + # and either report.csv.tmpl (CSV), or report.html.tmpl (everything else). + # report.html.tmpl produces an HTML framework for either tables of HTML + # data, or images generated by calling report.cgi again with action as + # "plot". + $formatparam =~ s/[^a-zA-Z\-]//g; + trick_taint($formatparam); + $vars->{'format'} = $formatparam; + $formatparam = ''; +} +elsif ($report_action eq "plot") { + # If action is "plot", we will be using a format as normal (pie, bar etc.) + # and a ctype as normal (currently only png.) + $vars->{'cumulate'} = $cgi->param('cumulate') ? 1 : 0; + $vars->{'x_labels_vertical'} = $cgi->param('x_labels_vertical') ? 1 : 0; + $vars->{'data'} = $report->{'image_data'}; +} +else { + ThrowCodeError("unknown_action", {action => $cgi->param('report_action')}); +} + +my $format = $template->get_format("testopia/reports/report", $formatparam, + scalar($cgi->param('ctype'))); + +my $filename = "report-" . $report->{'date'} . ".$format->{extension}"; +print $cgi->header(-type => $format->{'ctype'}, + -content_disposition => "inline; filename=$filename"); +$vars->{'time'} = time(); +$template->process("$format->{'template'}", $vars) + || ThrowTemplateError($template->error()); + +exit; + diff --git a/tr_show_case.cgi b/tr_show_case.cgi new file mode 100755 index 0000000..0cb0711 --- /dev/null +++ b/tr_show_case.cgi @@ -0,0 +1,461 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> +# Tyler Peterson <typeterson@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Bug; +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Error; +use Bugzilla::Constants; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestCase; +use Bugzilla::Testopia::TestCaseRun; +use Bugzilla::Testopia::TestTag; +use Bugzilla::Testopia::Attachment; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use JSON; + +require 'globals.pl'; + +use vars qw($vars); +my $template = Bugzilla->template; +my $query_limit = 15000; + + +Bugzilla->login(LOGIN_REQUIRED); + +my $dbh = Bugzilla->dbh; +my $cgi = Bugzilla->cgi; + +my $case_id = trim(Bugzilla->cgi->param('case_id')) || ''; + +unless ($case_id){ + print $cgi->header(); + $template->process("testopia/case/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; +} +validate_test_id($case_id, 'case'); +my $action = $cgi->param('action') || ''; + +$cgi->param('ctype' , 'print') if ($action eq 'Print'); +my $format = $template->get_format("testopia/case/show", scalar $cgi->param('format'), scalar $cgi->param('ctype')); +my $disp = "inline"; +# We set CSV files to be downloaded, as they are designed for importing +# into other programs. +if ( $format->{'extension'} eq "csv" || $format->{'extension'} eq "xml" ) +{ + $disp = "attachment"; + $vars->{'displaycolumns'} = \@Bugzilla::Testopia::Constants::TESTCASE_EXPORT; +} + +# Suggest a name for the file if the user wants to save it as a file. +my @time = localtime(time()); +my $date = sprintf "%04d-%02d-%02d", 1900+$time[5],$time[4]+1,$time[3]; +my $filename = "testcase-$case_id-$date.$format->{extension}"; +print $cgi->header(-type => $format->{'ctype'}, + -content_disposition => "$disp; filename=$filename"); + +$vars->{'action'} = "Commit"; +$vars->{'form_action'} = "tr_show_case.cgi"; + +if ($action eq 'Clone'){ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-create-denied", {'object' => 'Test Case'}) unless $case->canview; + do_update($case); + $vars->{'case'} = $case; + $template->process("testopia/case/clone.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + +} + +elsif ($action eq 'do_clone'){ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + my $count = 0; + my $method; + if ($cgi->param('copymethod') eq 'copy'){ + ThrowUserError('missing-plans-list') if (!$cgi->param('existing') && !$cgi->param('newplans')); + my @planids; + my %planseen; + foreach my $p (split('[\s,]+', $cgi->param('newplans'))){ + validate_test_id($p, 'plan'); + $planseen{$p} = 1; + } + if ($cgi->param('existing')){ + foreach my $p (@{$case->plans}){ + $planseen{$p->id} = 1; + } + } + my $author = $cgi->param('keepauthor') ? $case->author->id : Bugzilla->user->id; + push @planids, keys %planseen; + my $newcase; + foreach my $pid (@planids){ + $count++; + my $plan = Bugzilla::Testopia::TestPlan->new($pid); + next unless $plan->canedit; + my $newcaseid = $case->copy($pid, $author, $cgi->param('copy_doc')); + $case->link_plan($pid, $newcaseid); + $newcase = Bugzilla::Testopia::TestCase->new($newcaseid); + + if($cgi->param('copy_attachments')){ + foreach my $att (@{$case->attachments}){ + $att->link_case($newcaseid); + } + } + if ($cgi->param('copy_tags')){ + foreach my $tag (@{$case->tags}){ + # Doing it this way avoids collisions + my $newtag = Bugzilla::Testopia::TestTag->new({ + tag_name => $tag->name + }); + my $newtagid = $newtag->store; + $newcase->add_tag($newtagid); + } + } + if ($cgi->param('copy_comps')){ + foreach my $comp (@{$case->components}){ + $newcase->add_component($comp->{'id'}); + } + } + } + $method = "copied"; + $vars->{'copied'} = $case; + $vars->{'backlink'} = $case; + $case = $newcase; + } + elsif ($cgi->param('copymethod') eq 'link'){ + # This should be a code error + ThrowUserError('testopia-missing-plans-list') if (!$cgi->param('linkplans')); + my %seen; + foreach my $p (split('[\s,]+', $cgi->param('linkplans'))){ + validate_test_id($p, 'plan'); + $seen{$p} = 1; + } + foreach my $p (keys %seen){ + $count++; + my $plan = Bugzilla::Testopia::TestPlan->new($p); + next unless $plan->canedit; + $case->link_plan($p); + } + delete $case->{'plans'}; + $method = "linked"; + $vars->{'backlink'} = $case; + } + else { + ThrowUserError('testopia-missing-parameter', {'param' => 'copymethod'}); + } + + $vars->{'tr_message'} = "Case $method to $count plans."; + display($case); +} + +elsif ($action eq 'Attach'){ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-read-only", {'object' => $case}) unless $case->canedit; + + defined $cgi->upload('data') + || ThrowUserError("file_not_specified"); + my $filename = $cgi->upload('data'); + $cgi->param('description') + || ThrowUserError("missing_attachment_description"); + my $description = $cgi->param('description'); + my $contenttype = $cgi->uploadInfo($cgi->param('data'))->{'Content-Type'}; + trick_taint($description); + my $fh = $cgi->upload('data'); + my $data; + # enable 'slurp' mode + local $/; + $data = <$fh>; + $data || ThrowUserError("zero_length_file"); + + my $attachment = Bugzilla::Testopia::Attachment->new({ + case_id => $case_id, + submitter_id => Bugzilla->user->id, + description => $description, + filename => $filename, + mime_type => $contenttype, + contents => $data + }); + + $attachment->store; + do_update($case); + $vars->{'tr_message'} = "File attached."; + $vars->{'backlink'} = $case; + display($case); +} + +elsif ($action eq 'Commit'){ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-read-only", {'object' => $case}) unless $case->canedit; + do_update($case); + $vars->{'tr_message'} = "Test case updated"; + $vars->{'backlink'} = $case; + display($case); +} + +elsif ($action eq 'History'){ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-permission-denied", {'object' => $case}) unless $case->canview; + $vars->{'case'} = $case; + $vars->{'diff'} = $case->compare_doc_versions($cgi->param('new'),$cgi->param('old')); + $vars->{'new'} = $cgi->param('new'); + $vars->{'old'} = $cgi->param('old'); + $template->process("testopia/case/history.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} + +elsif ($action eq 'unlink'){ + my $plan_id = $cgi->param('plan_id'); + validate_test_id($plan_id, 'plan'); + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-read-only", {'object' => $case}) + unless ($case->can_unlink_plan($plan_id)); + + if (scalar @{$case->plans} == 1){ + $vars->{'case'} = $case; + $vars->{'runcount'} = scalar @{$case->runs}; + $vars->{'plancount'} = scalar @{$case->plans}; + $vars->{'bugcount'} = scalar @{$case->bugs}; + $template->process("testopia/case/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + } + else { + $vars->{'plan'} = Bugzilla::Testopia::TestPlan->new($plan_id); + $vars->{'case'} = $case; + $template->process("testopia/case/unlink.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + } +} + +elsif ($action eq 'do_unlink'){ + my $plan_id = $cgi->param('plan_id'); + validate_test_id($plan_id, 'plan'); + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-read-only", {'object' => 'case'}) + unless ($case->can_unlink_plan($plan_id)); + + if ($case->unlink_plan($plan_id)){ + $vars->{'tr_message'} = "Test plan successfully unlinked"; + } + + $vars->{'backlink'} = $case; + display($case); +} + +elsif ($action eq 'detach_bug'){ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-read-only", {'object' => $case}) unless $case->canedit; + my @buglist; + foreach my $bug (split(/[\s,]+/, $cgi->param('bug_id'))){ + ValidateBugID($bug); + push @buglist, $bug; + } + foreach my $bug (@buglist){ + $case->detach_bug($bug); + } + display(Bugzilla::Testopia::TestCase->new($case_id)); +} +elsif ($action eq 'Delete'){ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-no-delete", {'object' => $case}) unless $case->candelete; + $vars->{'case'} = $case; + $vars->{'runcount'} = scalar @{$case->runs}; + $vars->{'plancount'} = scalar @{$case->plans}; + $vars->{'bugcount'} = scalar @{$case->bugs}; + $template->process("testopia/case/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + +} +elsif ($action eq 'do_delete'){ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-no-delete", {'object' => $case}) unless $case->candelete; + $case->obliterate; + $vars->{'deleted'} = 1; + $template->process("testopia/case/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); +} +#################### +### Ajax Actions ### +#################### +elsif ($action eq 'addcomponent' || $action eq 'removecomponent'){ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-read-only", {'object' => $case}) unless $case->canedit; + my $comp = $cgi->param('component_id'); + detaint_natural($comp); + validate_selection($comp, 'id', 'components'); + + if ($action eq 'addcomponent'){ + foreach my $c (@{$case->components}){ + if ($c->id == $comp){ + print "{ignore:1}"; + exit; + } + } + $case->add_component($comp); + } + else { + $case->remove_component($comp); + } + my @comps; + foreach my $c (@{$case->components}){ + push @comps, {'id' => $c->id, 'name' => $c->name}; + } + my $json = new JSON; + print $json->objToJson(\@comps); +} + +#TODO: Clean up styles and put them in skins +else{ + my $case = Bugzilla::Testopia::TestCase->new($case_id); + ThrowUserError("testopia-permission-denied", {'object' => $case}) unless $case->canview; + display($case); +} + +####################### +### Helper Routines ### +####################### + +sub do_update{ + my ($case) = @_; + my $newtcaction = $cgi->param("tcaction"); + my $newtceffect = $cgi->param("tceffect"); + my $newtcsetup = $cgi->param("tcsetup") || ''; + my $newtcbreakdown = $cgi->param("tcbreakdown") || ''; + my $alias = $cgi->param('alias')|| ''; + my $category = $cgi->param('category'); + my $status = $cgi->param('status'); + my $priority = $cgi->param('priority'); + my $isautomated = $cgi->param("isautomated"); + my $script = $cgi->param("script")|| ''; + my $arguments = $cgi->param("arguments")|| ''; + my $summary = $cgi->param("summary")|| ''; + my $requirement = $cgi->param("requirement")|| ''; + my $tcdependson = $cgi->param("tcdependson")|| ''; + my $tcblocks = $cgi->param("tcblocks")|| ''; + my $tester = $cgi->param("tester") || ''; + my $est_time = $cgi->param("estimated_time") || ''; + if ($tester){ + $tester = login_to_id(trim($cgi->param('tester'))) || ThrowUserError("invalid_username", { name => $cgi->param('tester') }); + } + + ThrowUserError('testopia-missing-required-field', {'field' => 'summary'}) if $summary eq ''; + + detaint_natural($status); + detaint_natural($category); + detaint_natural($priority); + detaint_natural($isautomated); + + $est_time =~ m/(\d+)[:\s](\d+)[:\s](\d+)/; + ThrowUserError('testopia-format-error', {'field' => 'Estimated Time' }) + unless ($1 < 24 && $2 < 60 && $3 < 60); + $est_time = "$1:$2:$3"; + + # All inserts are done with placeholders so this is OK + trick_taint($alias); + trick_taint($script); + trick_taint($arguments); + trick_taint($summary); + trick_taint($requirement); + trick_taint($newtcaction); + trick_taint($newtceffect); + trick_taint($newtcbreakdown); + trick_taint($newtcsetup); + trick_taint($tcdependson); + trick_taint($tcblocks); + + validate_selection($category, 'category_id', 'test_case_categories'); + validate_selection($status, 'case_status_id', 'test_case_status'); + + my @buglist; + foreach my $bug (split(/[\s,]+/, $cgi->param('bugs'))){ + ValidateBugID($bug); + push @buglist, $bug; + } + my @runs; + foreach my $runid (split(/[\s,]+/, $cgi->param('addruns'))){ + validate_test_id($runid, 'run'); + push @runs, Bugzilla::Testopia::TestRun->new($runid); + } + + ThrowUserError('testiopia-alias-exists', + {'alias' => $alias}) if $case->check_alias($alias); + ThrowUserError('testiopia-invalid-data', + {'field' => 'isautomated', 'value' => $isautomated }) + if ($isautomated !~ /^[01]$/); + + if($case->diff_case_doc($newtcaction, $newtceffect, $newtcsetup, $newtcbreakdown) ne ''){ + $case->store_text($case->id, Bugzilla->user->id, $newtcaction, $newtceffect, $newtcsetup, $newtcbreakdown); + } + + my %newvalues = ( + 'case_status_id' => $status, + 'category_id' => $category, + 'priority_id' => $priority, + 'summary' => $summary, + 'estimated_time' => $est_time, + 'isautomated' => $isautomated, + 'alias' => $alias, + 'requirement' => $requirement, + 'script' => $script, + 'arguments' => $arguments, + 'default_tester_id' => $tester, + ); + $case->update(\%newvalues); + $case->update_deps($cgi->param('tcdependson'), $cgi->param('tcblocks')); + # Add new tags + foreach my $tag_name (split(/[,]+/, $cgi->param('newtag'))){ + trick_taint($tag_name); + my $tag = Bugzilla::Testopia::TestTag->new({tag_name => $tag_name}); + my $tag_id = $tag->store; + $case->add_tag($tag_id); + } + # Attach bugs + foreach my $bug (@buglist){ + $case->attach_bug($bug); + } + # Add to runs + foreach my $run (@runs){ + $run->add_case_run($case->id); + } + $cgi->delete_all; + $cgi->param('case_id', $case->id); +} + +sub display { + my $case = shift; + $cgi->param('case_id', $case->id); + $cgi->param('isactive', 1); + $cgi->param('current_tab', 'case_run'); + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('case_run', 'tr_show_case.cgi', $cgi, undef, $search->query); + ThrowUserError('testopia-query-too-large', {'limit' => $query_limit}) if $table->view_count > $query_limit; + $vars->{'case'} = $case; + $vars->{'table'} = $table; + $vars->{'user'} = Bugzilla->user; + $template->process($format->{'template'}, $vars) || + ThrowTemplateError($template->error()); +} diff --git a/tr_show_caserun.cgi b/tr_show_caserun.cgi new file mode 100755 index 0000000..9b5db9e --- /dev/null +++ b/tr_show_caserun.cgi @@ -0,0 +1,395 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Bug; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::TestCase; +use Bugzilla::Testopia::TestCaseRun; + +require 'globals.pl'; + +use vars qw($vars); +my $template = Bugzilla->template; +my $query_limit = 15000; + +Bugzilla->login(LOGIN_REQUIRED); + +my $dbh = Bugzilla->dbh; +my $cgi = Bugzilla->cgi; + +print $cgi->header; + +my $caserun_id = $cgi->param('caserun_id'); +validate_test_id($caserun_id, 'case_run'); + +ThrowUserError('testopia-missing-parameter', {'param' => 'caserun_id'}) unless ($caserun_id); +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; +$vars->{'fullwidth'} = 1; +my $action = $cgi->param('action') || ''; + +# For use on the classic form + +if ($action eq 'Commit'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + $caserun = do_update($caserun); + display(Bugzilla::Testopia::TestCaseRun->new($caserun->id)); +} +elsif ($action eq 'Attach'){ + my $caserun = do_update(Bugzilla::Testopia::TestCaseRun->new($caserun_id)); + + defined $cgi->upload('data') + || ThrowUserError("file_not_specified"); + my $filename = $cgi->upload('data'); + $cgi->param('description') + || ThrowUserError("missing_attachment_description"); + my $description = $cgi->param('description'); + my $contenttype = $cgi->uploadInfo($cgi->param('data'))->{'Content-Type'}; + trick_taint($description); + my $fh = $cgi->upload('data'); + my $data; + # enable 'slurp' mode + local $/; + $data = <$fh>; + $data || ThrowUserError("zero_length_file"); + + my $attachment = Bugzilla::Testopia::Attachment->new({ + caserun_id => $caserun_id, + case_id => $caserun->case->id, + submitter_id => Bugzilla->user->id, + description => $description, + filename => $filename, + mime_type => $contenttype, + contents => $data + }); + + $attachment->store; + $vars->{'tr_message'} = "File attached."; + $vars->{'backlink'} = $caserun; + display(Bugzilla::Testopia::TestCaseRun->new($caserun->id)); +} + +elsif ($action eq 'delete'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + ThrowUserError("testopia-no-delete", {'object' => $caserun}) unless $caserun->candelete; + $vars->{'title'} = 'Remove Test Case '. $caserun->case->id .' from Run: ' . $caserun->run->summary; + $vars->{'bugcount'} = scalar @{$caserun->bugs}; + $vars->{'form_action'} = 'tr_show_caserun.cgi'; + $vars->{'caserun'} = $caserun; + $template->process("testopia/caserun/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); +} +elsif ($action eq 'do_delete'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + ThrowUserError("testopia-no-delete", {'object' => $caserun}) unless $caserun->candelete; + $caserun->obliterate; + + # See if there is a saved filter + if ($cgi->cookie('TESTOPIA-FILTER-RUN-' . $caserun->run->id) && $action ne 'Filter' && $action ne 'clear_filter'){ + $cgi = Bugzilla::CGI->new($cgi->cookie('TESTOPIA-FILTER-RUN-' . $caserun->run->id)); + $vars->{'filtered'} = 1; + } + else { + $cgi->delete_all; + } + $cgi->param('current_tab', 'case_run'); + $cgi->param('run_id', $caserun->run->id); + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('case_run', 'tr_show_run.cgi', $cgi, undef, $search->query); + ThrowUserError('testopia-query-too-large', {'limit' => $query_limit}) if $table->view_count > $query_limit; + + my @case_list; + foreach my $cr (@{$table->list}){ + push @case_list, $cr->case_id; + } + my $case = Bugzilla::Testopia::TestCase->new({'case_id' => 0}); + $vars->{'run'} = $caserun->run; + $vars->{'table'} = $table; + $vars->{'case_list'} = join(",", @case_list); + $vars->{'action'} = 'Commit'; + $vars->{'tr_message'} = "Case removed"; + $vars->{'backlink'} = $caserun->run; + + # We need these to provide the filter values. + $vars->{'caserun'} = Bugzilla::Testopia::TestCaseRun->new({}); + $vars->{'case'} = Bugzilla::Testopia::TestCase->new({}); + + $template->process("testopia/run/show.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + +} +#################### +### Ajax Actions ### +#################### +elsif ($action eq 'update_build'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + if (!$caserun->canedit) { + print "Error - You don't have permission"; + exit; + } + my $build_id = $cgi->param('build_id'); + detaint_natural($build_id); + validate_test_id($build_id, 'build'); + + $caserun = $caserun->switch($build_id, $caserun->environment->id); + + my $body_data; + my $head_data; + + $vars->{'caserun'} = $caserun; + $vars->{'index'} = $cgi->param('index'); + $vars->{'updating'} = 1; + $template->process("testopia/caserun/short-form-header.html.tmpl", $vars, \$head_data) || + ThrowTemplateError($template->error()); + $template->process("testopia/caserun/short-form.html.tmpl", $vars, \$body_data) || + ThrowTemplateError($template->error()); + + print $head_data . "|~+" . $body_data; +} +elsif ($action eq 'update_environment'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + if (!$caserun->canedit) { + print "Error - You don't have permission"; + exit; + } + my $environment_id = $cgi->param('caserun_env'); + detaint_natural($environment_id); + validate_test_id($environment_id, 'environment'); + + $caserun = $caserun->switch($caserun->build->id, $environment_id); + + my $body_data; + my $head_data; + $vars->{'caserun'} = $caserun; + $vars->{'index'} = $cgi->param('index'); + $vars->{'updating'} = 1; + $template->process("testopia/caserun/short-form-header.html.tmpl", $vars, \$head_data) || + ThrowTemplateError($template->error()); + $template->process("testopia/caserun/short-form.html.tmpl", $vars, \$body_data) || + ThrowTemplateError($template->error()); + print $head_data . "|~+" . $body_data; +} +elsif ($action eq 'update_status'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + if (!$caserun->canedit){ + print "Error - You don't have permission"; + exit; + } + my $status_id = $cgi->param('status_id'); + my $note = $cgi->param('note'); + + detaint_natural($status_id); + trick_taint($note) if $note; + + $caserun->set_status($status_id, $cgi->param('update_bug')); + $caserun->append_note($note) if $note; + + my $percent_data; + my $body_data; + my $head_data; + $vars->{'caserun'} = $caserun; + $vars->{'index'} = $cgi->param('index'); + $vars->{'run'} = $caserun->run; + $vars->{'updating'} = 1; + $template->process("testopia/percent_bar.html.tmpl", $vars, \$percent_data) || + ThrowTemplateError($template->error()); + $template->process("testopia/caserun/short-form-header.html.tmpl", $vars, \$head_data) || + ThrowTemplateError($template->error()); + $template->process("testopia/caserun/short-form.html.tmpl", $vars, \$body_data) || + ThrowTemplateError($template->error()); + print $percent_data . "|~+" . $head_data . "|~+" . $body_data; + if ($caserun->updated_deps) { + print "|~+". join(',', @{$caserun->updated_deps}); + } +} +elsif ($action eq 'update_note'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + if (!$caserun->canedit){ + print "Error - You don't have permission"; + exit; + } + my $note = $cgi->param('note'); + trick_taint($note); + $caserun->append_note($note); + + my $body_data; + my $head_data; + $vars->{'caserun'} = $caserun; + $vars->{'index'} = $cgi->param('index'); + $vars->{'updating'} = 1; + $template->process("testopia/caserun/short-form-header.html.tmpl", $vars, \$head_data) || + ThrowTemplateError($template->error()); + $template->process("testopia/caserun/short-form.html.tmpl", $vars, \$body_data) || + ThrowTemplateError($template->error()); + print $head_data . "|~+" . $body_data; + +} +elsif ($action eq 'update_assignee'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + if (!$caserun->canedit){ + print "Error - You don't have permission"; + exit; + } + my $assignee_id = login_to_id(trim($cgi->param('assignee'))); + if ($assignee_id == 0){ + print "Error - Invalid assignee"; + exit; + } + $caserun->set_assignee($assignee_id); +} +elsif ($action eq 'update_sortkey'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + if (!$caserun->canedit){ + print "Error - You don't have permission"; + exit; + } + my $sortkey = $cgi->param('sortkey'); + unless (detaint_natural($sortkey)){ + print "Error - Please enter a number"; + exit; + } + $caserun->set_sortkey($sortkey); +} +elsif ($action eq 'get_notes'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + if (!$caserun->canedit){ + print "Error - You don't have permission"; + exit; + } + print '<pre>' . $caserun->notes . '</pre>'; +} +elsif ($action eq 'attach_bug'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + if (!$caserun->canedit){ + print "Error - You don't have permission"; + exit; + } + my @buglist; + foreach my $bug (split(/[\s,]+/, $cgi->param('bugs'))){ + Bugzilla->batch(1); + eval{ + ValidateBugID($bug); + }; + if ($@){ + print "<span style='font-weight:bold; color:#FF0000;'>Error - Invalid bug id or alias</span>"; + exit; + } + push @buglist, $bug; + } + foreach my $bug (@buglist){ + $caserun->attach_bug($bug); + } + foreach my $bug (@{$caserun->case->bugs}){ + print &::GetBugLink($bug->bug_id, $bug->bug_id) ." "; + } +} +elsif ($action eq 'detach_bug'){ + my $caserun = Bugzilla::Testopia::TestCaseRun->new($caserun_id); + if (!$caserun->canedit){ + print "Error - You don't have permission"; + exit; + } + my @buglist; + foreach my $bug (split(/[\s,]+/, $cgi->param('bug_id'))){ + ValidateBugID($bug); + push @buglist, $bug; + } + foreach my $bug (@buglist){ + $caserun->detach_bug($bug); + } + display(Bugzilla::Testopia::TestCaseRun->new($caserun_id)); +} +else { + display(Bugzilla::Testopia::TestCaseRun->new($caserun_id)); +} + +sub do_update { + my $caserun = shift; + + ThrowUserError("testopia-read-only", {'object' => $caserun}) unless $caserun->canedit; + + my $status = $cgi->param('status'); + my $notes = $cgi->param('notes'); + my $build = $cgi->param('caserun_build'); + my $env = $cgi->param('caserun_env'); + my $assignee; + if ($cgi->param('assignee')) { + $assignee = login_to_id(trim($cgi->param('assignee'))); + } + ThrowUserError("invalid_username", { name => $cgi->param('assignee') }) unless $assignee; + + ThrowUserError('testopia-missing-required-field', {field => 'Status'}) unless defined $status; + ThrowUserError('testopia-missing-required-field', {field => 'build'}) unless defined $build; + ThrowUserError('testopia-missing-required-field', {field => 'environment'}) unless defined $env; + + validate_test_id($build, 'build'); + validate_test_id($env, 'environment'); + my @buglist; + foreach my $bug (split(/[\s,]+/, $cgi->param('bugs'))){ + ValidateBugID($bug); + push @buglist, $bug; + } + + detaint_natural($env); + detaint_natural($build); + detaint_natural($status); + trick_taint($notes); + + # Switch to the record representing this build and environment combo. + # If there is not one, it will create it and switch to that. + $caserun = $caserun->switch($build,$env); + + $caserun->set_status($status, $cgi->param('update_bug')) if ($caserun->status_id != $status); + $caserun->set_assignee($assignee) if ($caserun->assignee && $caserun->assignee->id != $assignee); + $caserun->append_note($notes) if ($notes && $caserun->notes !~ /$notes/); + + foreach my $bug (@buglist){ + $caserun->attach_bug($bug); + } + + $vars->{'tr_message'} = "Case-run updated."; + + return $caserun; +} + +sub display { + my $caserun = shift; + ThrowUserError("testopia-permission-denied", {'object' => $caserun}) if !$caserun->canview; + my $table = Bugzilla::Testopia::Table->new('case_run'); + ThrowUserError('testopia-query-too-large', {'limit' => $query_limit}) if $table->list_count > $query_limit; + $vars->{'table'} = $table; + $vars->{'caserun'} = $caserun; + $vars->{'action'} = 'tr_show_caserun.cgi'; + $vars->{'run'} = $caserun->run; + $vars->{'single'} = 1; + $template->process("testopia/caserun/show.html.tmpl", $vars) || + ThrowTemplateError($template->error()); +} \ No newline at end of file diff --git a/tr_show_environment.cgi b/tr_show_environment.cgi new file mode 100755 index 0000000..6060b7e --- /dev/null +++ b/tr_show_environment.cgi @@ -0,0 +1,328 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> +# Brian Kramer <bkramer@novell.com> +# Michael Hight <mjhight@gmail.com> +# Garrett Braden <gbraden@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::Product; +use Bugzilla::Testopia::Classification; +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Environment::Element; +use Bugzilla::Testopia::Environment::Category; +use Bugzilla::Testopia::Environment::Property; +use Data::Dumper; +use JSON; + +require 'globals.pl'; + +Bugzilla->login(LOGIN_REQUIRED); + +my $cgi = Bugzilla->cgi; + +use vars qw($vars); +my $template = Bugzilla->template; + +print $cgi->header; + +my $action = $cgi->param('action') || ''; +my $env_id = trim(Bugzilla->cgi->param('env_id')) || ''; + +unless ($env_id || $action){ + $template->process("testopia/environment/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; +} + +if ($action eq 'delete'){ + my $env = Bugzilla::Testopia::Environment->new($env_id); + ThrowUserError('testopia-no-delete', {'object' => $env}) unless $env->candelete; + $vars->{'environment'} = $env; + $template->process("testopia/environment/delete.html.tmpl", $vars) + || print $template->error(); + +} + +elsif ($action eq 'do_delete'){ + my $env = Bugzilla::Testopia::Environment->new($env_id); + ThrowUserError('testopia-no-delete', {'object' => $env}) unless $env->candelete; + $env->obliterate; + $vars->{'tr_message'} = "Environment Deleted"; + $vars->{'deleted'} = 1; + $template->process("testopia/environment/delete.html.tmpl", $vars) + || print $template->error(); + +} + +elsif ($action eq 'hide' || $action eq 'unhide'){ + my $env = Bugzilla::Testopia::Environment->new($env_id); + ThrowUserError('testopia-read-only', {'object' => $env}) unless $env->canedit; + $env->toggle_archive; + display(); +} + +#################### +### Ajax Actions ### +#################### + +elsif ($action eq 'edit'){ + my $env = Bugzilla::Testopia::Environment->new($env_id); + unless ($env->canedit){ + print "{error: 'You don't have rights to edit this environment'}"; + exit; + } + + my $name = $cgi->param('name'); + my $product_id = $cgi->param('product_id'); + Bugzilla->batch(1); + trick_taint($name); + detaint_natural($product_id); + eval{ + validate_selection( $product_id, 'id', 'products'); + }; + if ($@){ + print "{error: 'Invalid product'}"; + exit; + } + unless ($env->update({'product_id' => $product_id, 'isactive' => $cgi->param('isactive') ? 0 : 1})){ + print "{error: 'Error updating product'}"; + exit; + } + unless ($env->update({'name' => $name})){ + print "{error: 'Name already in use in this product, please choose another'}"; + exit; + } + + print "{message: 'Environment updated'}"; + +} + +elsif ($action eq 'getChildren'){ + my $json = new JSON; + my $data = $json->jsonToObj($cgi->param('data')); + + my $node = $data->{'node'}; + my $tree = $data->{'tree'}; + + my $id = $node->{'objectId'}; + my $type = $node->{'widgetId'}; + my $tree_id = $tree->{'objectId'}; + + detaint_natural($id); + trick_taint($type); + print STDERR $type; + for ($type){ + /classification/ && do { get_products($id); }; + /product/ && do { get_categories($id); }; + /category/ && do { get_category_element_json($id) }; + /element/ && do { get_element_children($id) }; + /property/ && do { get_validexp_json($id,$tree_id) }; + /environment/ && do { get_env_elements($id) }; + } +} + +elsif($action eq 'removeNode'){ + my $json = new JSON; + my $data = $json->jsonToObj($cgi->param('data')); + + my $tree = $data->{'tree'}; + my $env_id = $tree->{'objectId'}; + + my $node = $data->{'node'}; + my $id = $node->{'objectId'}; + my $type = $node->{'widgetId'}; + + detaint_natural($env_id) unless $type =~ /validexp/; + detaint_natural($id); + trick_taint($type); + + my $env = Bugzilla::Testopia::Environment->new($env_id); + unless ($env->canedit){ + print 'false'; + exit; + } + $env->delete_element($id); + + print "true"; + +} + +elsif($action eq 'set_selected'){ + my $type = $cgi->param('type'); + + if ($type =~ /exp/) + { + my $env_id = $cgi->param('env_id'); + my $value = $cgi->param('value'); + $value =~ s/<span style='color:blue'>|<\/span>//g; + $type =~ /^validexp(\d+)/; + my $prop_id = $1; + + detaint_natural($env_id); + detaint_natural($prop_id); + trick_taint($value); + + my $env = Bugzilla::Testopia::Environment->new($env_id); + exit unless $env->canedit; + + my $property = Bugzilla::Testopia::Environment::Property->new($prop_id); + my $elmnt_id = $property->element_id(); + my $old = $env->get_value_selected($env->id,$elmnt_id,$property->id); + $old = undef if $old eq $value; + if ($env->store_property_value($prop_id,$elmnt_id,$value) == 0){ + $env->update_property_value($prop_id,$elmnt_id,$value); + } + my $json ='{message:"Updated selection for '. $property->name .'."'; + $json .= ',old: "validexp'. $prop_id. '~'. $old if $old; + $json .= '"}'; + print $json; + } +} + +elsif($action eq 'move'){ + my $json = new JSON; + my $data = $json->jsonToObj($cgi->param('data')); + + my $element = $data->{'child'}; + my $env_tree = $data->{'newParentTree'}; + + my $element_id = $element->{'objectId'}; + my $environment_id = $env_tree->{'objectId'}; + trick_taint($element_id); + trick_taint($environment_id); + + my $env = Bugzilla::Testopia::Environment->new($environment_id); + unless ($env->canedit){ + print "false"; + exit; + } + $element = Bugzilla::Testopia::Environment::Element->new($element_id); + my $properties = $element->get_properties; + if (scalar @$properties == 0){ + my $success = $env->store_property_value(0, $element_id, ""); + } + foreach my $property (@$properties){ + my $success = $env->store_property_value($property->{'property_id'}, $element_id, ""); + if ($success == 0){print "{error:\"error\"";exit;} + } + + print "true"; + exit; + +} + +else { + display(); +} + + +sub display { + detaint_natural($env_id); + validate_test_id($env_id, 'environment'); + my $env = Bugzilla::Testopia::Environment->new($env_id); + + if(!defined($env)){ + my $env = Bugzilla::Testopia::Environment->new({'environment_id' => 0}); + $vars->{'environment'} = $env; + $vars->{'action'} = 'do_add'; + $template->process("testopia/environment/add.html.tmpl", $vars) + || print $template->error(); + exit; + } + ThrowUserError("testopia-read-only", {'object' => $env}) unless $env->canview; + my $category = Bugzilla::Testopia::Environment::Category->new({'id' => 0}); + if (Param('useclassification')){ + $vars->{'allhaschild'} = $category->get_all_child_count; + $vars->{'toplevel'} = Bugzilla->user->get_selectable_classifications; + $vars->{'type'} = 'classification'; + } + else { + $vars->{'toplevel'} = $category->get_env_product_list; + $vars->{'type'} = 'product'; + } + $vars->{'user'} = Bugzilla->user; + $vars->{'action'} = 'do_edit'; + $vars->{'environment'} = $env; + $template->process("testopia/environment/show.html.tmpl", $vars) + || print $template->error(); + +} + +########################### +### Tree Helper Methods ### +########################### +sub get_products{ + my ($class_id) = (@_); + my $class = Bugzilla::Testopia::Classification->new($class_id); + return unless scalar(grep {$class->id eq $class_id} @{Bugzilla->user->get_selectable_classifications}); + print $class->products_to_json(1); +} + +sub get_categories{ + my ($product_id) = (@_); + if ($product_id){ + my $product = Bugzilla::Testopia::Product->new($product_id); + return unless Bugzilla->user->can_see_product($product->name); + } + my $category = Bugzilla::Testopia::Environment::Category->new({}); + print $category->product_categories_to_json($product_id,1); +} + +sub get_category_element_json { + my ($id) = (@_); + my $category = Bugzilla::Testopia::Environment::Category->new($id); + return unless $category->canview; + my $fish = $category->elements_to_json("TRUE"); + print $fish; +} + +sub get_element_children { + my ($id) = (@_); + my $element = Bugzilla::Testopia::Environment::Element->new($id); + print STDERR $element->canview; + return unless $element->canview; + print $element->children_to_json(1); +} + +sub get_env_elements { + my ($id) = (@_); + my $env = Bugzilla::Testopia::Environment->new($id); + return unless $env->canview; + print $env->elements_to_json(1); +} + +sub get_validexp_json { + my ($id,$env_id) = (@_); + my $property = Bugzilla::Testopia::Environment::Property->new($id); + return unless $property->canview; + print $property->valid_exp_to_json(1,$env_id); +} diff --git a/tr_show_plan.cgi b/tr_show_plan.cgi new file mode 100755 index 0000000..1caa405 --- /dev/null +++ b/tr_show_plan.cgi @@ -0,0 +1,481 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Maciej Maczynski <macmac@xdsnet.pl> +# Ed Fuentetaja <efuentetaja@acm.org> +# Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::Constants; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestTag; +use Bugzilla::Testopia::Category; +use Bugzilla::Testopia::Attachment; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use JSON; + +require 'globals.pl'; + +use vars qw($vars); +my $template = Bugzilla->template; +my $run_query_limit = 5000; +my $case_query_limit = 10000; + +Bugzilla->login(LOGIN_REQUIRED); + +my $dbh = Bugzilla->dbh; +my $cgi = Bugzilla->cgi; + +my $plan_id = trim(Bugzilla->cgi->param('plan_id') || ''); +my $action = $cgi->param('action') || ''; +unless ($plan_id){ + $vars->{'form_action'} = 'tr_show_plan.cgi'; + print $cgi->header; + $template->process("testopia/plan/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; +} +validate_test_id($plan_id, 'plan'); + +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +my $serverpush = support_server_push($cgi); + +$vars->{'action'} = "Commit"; +$vars->{'fullwidth'} = 1; +$vars->{'form_action'} = "tr_show_plan.cgi"; + +#################### +### Edit Actions ### +#################### + +### Archive or Unarchive ### +if ($action eq 'Archive' || $action eq 'Unarchive'){ + print $cgi->header; + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + ThrowUserError("testopia-read-only", {'object' => $plan}) unless $plan->canedit; + do_update($plan); + $vars->{'plan'} = $plan; + $plan->toggle_archive(Bugzilla->user->id); + $vars->{'tr_message'} = + $plan->isactive == 0 ? "Plan archived":"Plan Unarchived"; + $vars->{'backlink'} = $plan; + display($plan); + +} +############# +### Clone ### +############# +elsif ($action eq 'Clone'){ + print $cgi->header; + ThrowUserError("testopia-create-denied", {'object' => 'plans'}) unless Bugzilla->user->in_group('Testers'); + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + do_update($plan); + $vars->{'plan'} = $plan; + $template->process("testopia/plan/clone.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} +elsif ($action eq 'do_clone'){ + unless (Bugzilla->user->in_group('Testers')){ + print $cgi->header; + ThrowUserError("testopia-create-denied", {'object' => 'plan'}); + } + + if ($serverpush) { + print $cgi->multipart_init(); + print $cgi->multipart_start(); + + $template->process("list/server-push.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + + } + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + + my $plan_name = $cgi->param('plan_name'); + + # All DB actions use place holders so we are OK doing this + my $product_id = $cgi->param('product_id'); + my $version = $cgi->param('prod_version'); + trick_taint($plan_name); + trick_taint($version); + detaint_natural($product_id); + validate_selection($product_id,'id','products'); + Bugzilla::Version::check_version(Bugzilla::Product->new($product_id),$version); + my $author = $cgi->param('keepauthor') ? $plan->author->id : Bugzilla->user->id; + my $newplanid = $plan->clone($plan_name, $author, $product_id, $version, $cgi->param('copy_doc')); + my $newplan = Bugzilla::Testopia::TestPlan->new($newplanid); + if($cgi->param('copy_tags')){ + foreach my $tag (@{$plan->tags}){ + my $newtag = Bugzilla::Testopia::TestTag->new({ + tag_name => $tag->name + }); + my $newtagid = $newtag->store; + $newplan->add_tag($newtagid); + } + } + if($cgi->param('copy_attachments')){ + foreach my $att (@{$plan->attachments}){ + $att->link_plan($newplanid); + } + } + if ($cgi->param('copy_perms')){ + $plan->copy_permissions($newplanid); + $newplan->derive_regexp_testers($plan->tester_regexp); + } + else { + # Give the author admin rights + $newplan->add_tester($author, TR_READ | TR_WRITE | TR_DELETE | TR_ADMIN ); + $newplan->set_tester_regexp( Param('testopia-default-plan-testers-regexp'), 3) + if Param('testopia-default-plan-testers-regexp'); + $newplan->derive_regexp_testers(Param('testopia-default-plan-testers-regexp')) + } + if ($cgi->param('copy_cases')){ + my @case_ids; + + foreach my $id ($cgi->param('clone_categories')){ + detaint_natural($id); + validate_selection($id,'category_id','test_case_categories'); + my $category = Bugzilla::Testopia::Category->new($id); + push @case_ids, @{$category->plan_case_ids($plan->id)}; + } + + my $progress_interval = 250; + my $i = 0; + my $total = scalar @case_ids; + foreach my $id (@case_ids){ + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + my $case = Bugzilla::Testopia::TestCase->new($id); + # Copy test cases creating new ones + if ($cgi->param('copy_cases') == 2 ){ + my $caseid = $case->copy($newplan->id, $author, 1); + my $newcase = Bugzilla::Testopia::TestCase->new($caseid); + $case->link_plan($newplan->id, $caseid); + + foreach my $tag (@{$case->tags}){ + # Doing it this way avoids collisions + my $newtag = Bugzilla::Testopia::TestTag->new({ + tag_name => $tag->name + }); + my $newtagid = $newtag->store; + $newcase->add_tag($newtagid); + } + + foreach my $comp (@{$case->components}){ + $newcase->add_component($comp->{'id'}); + } + + } + # Just create a link + else { + $case->link_plan($newplan->id); + } + } + } + if ($serverpush) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } else { + print $cgi->header; + } + $vars->{'tr_message'} = "Plan ". $plan->name ." cloned as " . $newplan->name ."."; + $vars->{'backlink'} = $plan; + $cgi->param('plan_id', $newplan->id); + + display($newplan); + print $cgi->multipart_final if $serverpush; +} + +### Changes to Plan Attributes or Doc ### +elsif ($action eq 'Commit'){ + print $cgi->header; + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + ThrowUserError("testopia-read-only", {'object' => $plan}) unless $plan->canedit; + do_update($plan); + $vars->{'tr_message'} = "Test plan updated"; + $vars->{'backlink'} = $plan; + display($plan); +} + +elsif ($action eq 'Print'){ + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + unless ($plan->canview){ + print $cgi->header; + ThrowUserError("testopia-permission-denied", {'object' => $plan}); + } + $vars->{'printdoc'} = 1; + $cgi->param('ctype', 'print'); + display($plan); +} + +elsif ($action eq 'History'){ + print $cgi->header; + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + ThrowUserError("testopia-permission-denied", {'object' => $plan}) unless $plan->canview; + $vars->{'plan'} = $plan; + $vars->{'diff'} = $plan->diff_plan_doc($cgi->param('new'),$cgi->param('old')); + $vars->{'new'} = $cgi->param('new'); + $vars->{'old'} = $cgi->param('old'); + $template->process("testopia/plan/history.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} +####################### +### Add attachments ### +####################### +elsif ($action eq 'Attach'){ + print $cgi->header; + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + ThrowUserError("testopia-read-only", {'object' => $plan}) unless $plan->canedit; + defined $cgi->upload('data') + || ThrowUserError("file_not_specified"); + my $filename = $cgi->upload('data'); + $cgi->param('description') + || ThrowUserError("missing_attachment_description"); + my $description = $cgi->param('description'); + my $contenttype = $cgi->uploadInfo($cgi->param('data'))->{'Content-Type'}; + trick_taint($description); + #trick_taint($contenttype); + my $fh = $cgi->upload('data'); + my $data; + # enable 'slurp' mode + local $/; + $data = <$fh>; + $data || ThrowUserError("zero_length_file"); + + my $attachment = Bugzilla::Testopia::Attachment->new({ + plan_id => $plan_id, + submitter_id => Bugzilla->user->id, + description => $description, + filename => $filename, + mime_type => $contenttype, + contents => $data + }); + + $attachment->store; + $vars->{'tr_message'} = "Attachment added successfully"; + $vars->{'backlink'} = $plan; + do_update($plan); + display(Bugzilla::Testopia::TestPlan->new($plan_id)); +} +elsif ($action eq 'Delete'){ + print $cgi->header; + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + ThrowUserError("testopia-no-delete", {'object' => $plan}) unless $plan->candelete; + $vars->{'plan'} = $plan; + $template->process("testopia/plan/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + +} +elsif ($action eq 'do_delete'){ + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + unless ($plan->candelete){ + print $cgi->header; + ThrowUserError("testopia-no-delete", {'object' => $plan}); + } + if ($serverpush) { + print $cgi->multipart_init(); + print $cgi->multipart_start(); + $vars->{'complete'} = 1; + $vars->{'total'} = 250; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + + $plan->obliterate($cgi,$template); + } + else { + $plan->obliterate; + } + + if ($serverpush) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } else { + print $cgi->header; + } + + $vars->{'deleted'} = 1; + $template->process("testopia/plan/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; +} +#################### +### Just show it ### +#################### +else{ + my $plan = Bugzilla::Testopia::TestPlan->new($plan_id); + ThrowUserError("testopia-permission-denied", {'object' => $plan}) unless $plan->canview; + display($plan); +} +################### +### Helper Subs ### +################### +sub do_update { + my ($plan) = @_; + + my $newdoc = $cgi->param("plandoc"); + my $plan_name = trim($cgi->param('plan_name')) || ''; + my $product = Bugzilla::Testopia::Product->new($cgi->param('product_id')); + my $prodver = $cgi->param('prod_version') || ''; + my $type = $cgi->param('type'); + + ThrowUserError('testopia-missing-required-field', + {'field' => 'product'}) unless $product; + ThrowUserError('testopia-missing-required-field', + {'field' => 'name'}) if ($plan_name eq ''); + ThrowUserError('testopia-missing-required-field', + {'field' => 'product version'}) if ($prodver eq ''); + + trick_taint($plan_name); + trick_taint($prodver); + + detaint_natural($type); + + validate_selection($type, 'type_id', 'test_plan_types'); + + my $version = Bugzilla::Version::check_version($product, $prodver); + + if($plan->diff_plan_doc($newdoc) ne ''){ + $plan->store_text($plan->id, Bugzilla->user->id, $newdoc); + } + + my %newvalues = ( + 'name' => $plan_name, + 'product_id' => $product->id, + 'default_product_version' => $version->name, + 'type_id' => $type + ); + + $plan->update(\%newvalues); + + # Add new tags + foreach my $tag_name (split(/[,]+/, $cgi->param('newtag'))){ + trick_taint($tag_name); + my $tag = Bugzilla::Testopia::TestTag->new({tag_name => $tag_name}); + my $tag_id = $tag->store; + $plan->add_tag($tag_id); + } + + $cgi->delete_all; + $cgi->param('plan_id', $plan->id); +} + +sub display { + my $plan = shift; + my $casequery = new Bugzilla::CGI($cgi); + my $runquery = new Bugzilla::CGI($cgi); + + if (($cgi->param('order') || $cgi->param('page') || $cgi->param('viewall')) && $cgi->param('current_tab') eq 'case'){ + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('case', 'tr_show_plan.cgi', $cgi, undef, $search->query); + ThrowUserError('testopia-query-too-large', {'limit' => $case_query_limit}) if $table->view_count > $case_query_limit; + + $vars->{'case_table'} = $table; + $runquery->delete('order'); + $runquery->delete('page'); + $runquery->delete('viewall'); + $runquery->param('current_tab', 'run'); + $search = Bugzilla::Testopia::Search->new($runquery); + $table = Bugzilla::Testopia::Table->new('run', 'tr_show_plan.cgi', $runquery, undef, $search->query); + ThrowUserError('testopia-query-too-large', {'limit' => $run_query_limit}) if $table->view_count > $run_query_limit; + $vars->{'run_table'} = $table; + + } + elsif (($cgi->param('order') || $cgi->param('page') || $cgi->param('viewall')) && $cgi->param('current_tab') eq 'run'){ + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('run', 'tr_show_plan.cgi', $cgi, undef, $search->query); + ThrowUserError('testopia-query-too-large', {'limit' => $run_query_limit}) if $table->view_count > $run_query_limit; + + $vars->{'run_table'} = $table; + $casequery->delete('order'); + $casequery->delete('page'); + $casequery->delete('viewall'); + $casequery->param('current_tab', 'case'); + $search = Bugzilla::Testopia::Search->new($casequery); + $table = Bugzilla::Testopia::Table->new('case', 'tr_show_plan.cgi', $casequery, undef, $search->query); + ThrowUserError('testopia-query-too-large', {'limit' => $case_query_limit}) if $table->view_count > $case_query_limit; + $vars->{'case_table'} = $table; + } + else { + + $casequery->param('current_tab', 'case'); + my $search = Bugzilla::Testopia::Search->new($casequery); + my $table = Bugzilla::Testopia::Table->new('case', 'tr_show_plan.cgi', $casequery, undef, $search->query); + ThrowUserError('testopia-query-too-large', {'limit' => $case_query_limit}) if $table->view_count > $case_query_limit; + $vars->{'case_table'} = $table; + + $runquery->param('current_tab', 'run'); + $search = Bugzilla::Testopia::Search->new($runquery); + $table = Bugzilla::Testopia::Table->new('run', 'tr_show_plan.cgi', $runquery, undef, $search->query); + ThrowUserError('testopia-query-too-large', {'limit' => $run_query_limit}) if $table->view_count > $run_query_limit; + $vars->{'run_table'} = $table; + + } + # Dojo will try to parse every tag looking for widgets unless we tell it + # which tags have them. + my @dojo_search; + foreach my $run (@{$plan->test_runs}){ + push @dojo_search, "tip_" . $run->id; + } + push @dojo_search, "plandoc","newtag","tagTable"; + $vars->{'dojo_search'} = objToJson(\@dojo_search); + + $vars->{'plan'} = $plan; + + my $format = $template->get_format("testopia/plan/show", scalar $cgi->param('format'), scalar $cgi->param('ctype')); + my $disp = "inline"; + # We set CSV files to be downloaded, as they are designed for importing + # into other programs. + if ( $format->{'extension'} eq "csv" || $format->{'extension'} eq "xml" ) + { + $disp = "attachment"; + $vars->{'displaycolumns'} = \@Bugzilla::Testopia::Constants::TESTCASE_EXPORT; + } + + # Suggest a name for the file if the user wants to save it as a file. + my @time = localtime(time()); + my $date = sprintf "%04d-%02d-%02d", 1900+$time[5],$time[4]+1,$time[3]; + my $filename = "testcases-$date.$format->{extension}"; + print $cgi->header(-type => $format->{'ctype'}, + -content_disposition => "$disp; filename=$filename") + unless ($action eq 'do_clone'); + + $vars->{'percentage'} = \&percentage; + $template->process($format->{'template'}, $vars) || + ThrowTemplateError($template->error()); + +} diff --git a/tr_show_run.cgi b/tr_show_run.cgi new file mode 100755 index 0000000..9472708 --- /dev/null +++ b/tr_show_run.cgi @@ -0,0 +1,452 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Test Runner System. +# +# The Initial Developer of the Original Code is Maciej Maczynski. +# Portions created by Maciej Maczynski are Copyright (C) 2001 +# Maciej Maczynski. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Version; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::TestCaseRun; +use Bugzilla::Testopia::TestTag; +use Bugzilla::Testopia::Environment; +use Bugzilla::Testopia::Search; +use Bugzilla::Testopia::Table; +use Bugzilla::Testopia::Product; + +use vars qw($vars); +my $template = Bugzilla->template; +my $query_limit = 15000; + +require "globals.pl"; + +Bugzilla->login(LOGIN_REQUIRED); + +my $dbh = Bugzilla->dbh; +my $cgi = Bugzilla->cgi; + +my $run_id = trim($cgi->param('run_id') || ''); + +unless ($run_id){ + print $cgi->header; + $template->process("testopia/run/choose.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + exit; +} +validate_test_id($run_id, 'run'); +push @{$::vars->{'style_urls'}}, 'testopia/css/default.css'; + +my $serverpush = support_server_push($cgi); + +my $action = $cgi->param('action') || ''; + +#################### +### Edit Actions ### +#################### +if ($action eq 'Commit'){ + print $cgi->header; + my $run = Bugzilla::Testopia::TestRun->new($run_id); + ThrowUserError("testopia-read-only", {'object' => $run}) unless $run->canedit; + do_update($run); + $vars->{'tr_message'} = "Test run updated"; + $vars->{'backlink'} = $run; + display($run); +} + +elsif ($action eq 'History'){ + print $cgi->header; + my $run = Bugzilla::Testopia::TestRun->new($run_id); + ThrowUserError("testopia-permission-denied", {'object' => $run}) unless $run->canview; + $vars->{'run'} = $run; + $template->process("testopia/run/history.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} + +############# +### Clone ### +############# +elsif ($action =~ /^Clone/){ + print $cgi->header; + my $run = Bugzilla::Testopia::TestRun->new($run_id); + ThrowUserError("testopia-read-only", {'object' => $run->plan}) unless $run->plan->canedit; + my $case_list = $cgi->param('case_list'); + do_update($run); + my @ids; + foreach my $id (split(",", $case_list)){ + detaint_natural($id); + push @ids, $id; + } + + my $dbh = Bugzilla->dbh; + my $ref; + if ($case_list){ + $ref = $dbh->selectcol_arrayref( + "SELECT DISTINCT case_id + FROM test_case_runs + WHERE case_run_id IN (" . join(",",@ids) . ")"); + } + + $vars->{'product'} = Bugzilla::Testopia::Product->new($run->plan->product_id); + $vars->{'run'} = $run; + $vars->{'case_list'} = join(",", @$ref) if ($action =~/These Cases/ && $ref); + $vars->{'caserun'} = Bugzilla::Testopia::TestCaseRun->new({'case_run_id' => 0}); + $template->process("testopia/run/clone.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + +} +elsif ($action eq 'do_clone'){ + my $run = Bugzilla::Testopia::TestRun->new($run_id); + if ($serverpush) { + print $cgi->multipart_init(); + print $cgi->multipart_start(); + + $template->process("list/server-push.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + + } + + ThrowUserError("testopia-read-only", {'object' => $run->plan}) unless $run->plan->canedit; + my $summary = $cgi->param('summary'); + my $build = $cgi->param('build'); + my $plan_id = $cgi->param('plan_id'); + trick_taint($summary); + detaint_natural($build); + validate_test_id($plan_id, 'plan'); + my $manager = $cgi->param('keepauthor') ? $run->manager->id : Bugzilla->user->id; + my $newrun = Bugzilla::Testopia::TestRun->new($run->clone($summary, $manager, $plan_id, $build)); + + if($cgi->param('copy_tags')){ + foreach my $tag (@{$run->tags}){ + my $newtag = Bugzilla::Testopia::TestTag->new({ + tag_name => $tag->name + }); +# Store will return the id of the existing tag if it exists +# or create it if it does not + my $newtagid = $newtag->store; + $newrun->add_tag($newtagid); + } + } + my $progress_interval = 250; + + if ($cgi->param('case_list')){ + my @case_ids; + foreach my $id (split(",", $cgi->param('case_list'))){ + + detaint_natural($id); + my $case = Bugzilla::Testopia::TestCase->new($id); + unless ($case->canview){ + print $cgi->multipart_end if $serverpush; + ThrowUserError('testopia-permission-denied', {'object' => $case}); + } + push @case_ids, $id + } + + my $i = 0; + my $total = scalar @case_ids; + + foreach my $id (@case_ids){ + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + $newrun->add_case_run($id); + } + } + if ($cgi->param('copy_test_cases')){ + if ($cgi->param('status')){ + my @status = $cgi->param('status'); + foreach my $s (@status){ + detaint_natural($s); + } + my $ref = $dbh->selectcol_arrayref( + "SELECT case_id + FROM test_case_runs + WHERE run_id = ? + AND case_run_status_id IN (". join(",", @status) .") + AND iscurrent = 1", undef, $run->id); + + my $i = 0; + my $total = scalar @$ref; + + foreach my $case_id (@{$ref}){ + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + $newrun->add_case_run($case_id); + } + } + else { + my $i = 0; + my $total = scalar @{$run->cases}; + + foreach my $case (@{$run->cases}){ + $i++; + if ($i % $progress_interval == 0 && $serverpush){ + print $cgi->multipart_end; + print $cgi->multipart_start; + $vars->{'complete'} = $i; + $vars->{'total'} = $total; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + } + + $newrun->add_case_run($case->id); + } + } + } + if ($serverpush) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } else { + print $cgi->header; + } + + $cgi->delete_all; + $cgi->param('run_id', $newrun->id); + $vars->{'tr_message'} = "Test run cloned"; + $vars->{'backlink'} = $run; + display($newrun); + print $cgi->multipart_final if $serverpush; +} +elsif ($action eq 'Filter'){ + $cgi->send_cookie(-name => 'TESTOPIA-FILTER-RUN-' . $run_id, + -value => $cgi->canonicalise_query('run_id'), + -expires => 'Fri, 01-Jan-2038 00:00:00 GMT'); + + $vars->{'filtered'} = 1; + print $cgi->header; + display(Bugzilla::Testopia::TestRun->new($run_id)); + +} +elsif ($action eq 'clear_filter'){ + $cgi->remove_cookie('TESTOPIA-FILTER-RUN-' . $run_id); + $vars->{'filtered'} = 0; + print $cgi->header; + display(Bugzilla::Testopia::TestRun->new($run_id)); + +} + +#################### +### Ajax Actions ### +#################### +elsif ($action eq 'addcc'){ + my $run = Bugzilla::Testopia::TestRun->new($run_id); + ThrowUserError("testopia-read-only", {'object' => $run}) unless $run->canedit; + my @cclist = split(/[\s,]+/, $cgi->param('cc')); + my %ccids; + foreach my $email (@cclist){ + my $ccid = login_to_id($email) || ThrowUserError("invalid_username", { name => $email }); + if ($ccid && !$ccids{$ccid}) { + $ccids{$ccid} = 1; + } + } + foreach my $ccid (keys(%ccids)) { + $run->add_cc($ccid); + } + my $cc = get_cc_xml($run); + print $cgi->header; + print $cc; +} +elsif ($action eq 'removecc'){ + my $run = Bugzilla::Testopia::TestRun->new($run_id); + ThrowUserError('insufficient-case-perms') unless $run->canedit; + foreach my $ccid (split(",", $cgi->param('cc'))){ + detaint_natural($ccid); + $run->remove_cc($ccid); + } + my $cc = get_cc_xml($run); + print $cgi->header; + print $cc; +} +elsif ($action eq 'Delete'){ + print $cgi->header; + my $run = Bugzilla::Testopia::TestRun->new($run_id); + ThrowUserError("testopia-no-delete", {'object' => $run}) unless $run->candelete; + $vars->{'run'} = $run; + + $template->process("testopia/run/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + +} +elsif ($action eq 'do_delete'){ + my $run = Bugzilla::Testopia::TestRun->new($run_id); + unless ($run->candelete){ + print $cgi->header; + ThrowUserError("testopia-no-delete", {'object' => $run}); + } + if ($serverpush) { + print $cgi->multipart_init(); + print $cgi->multipart_start(); + $vars->{'complete'} = 1; + $vars->{'total'} = 250; + $template->process("testopia/progress.html.tmpl", $vars) + || ThrowTemplateError($template->error()); + + $run->obliterate($cgi,$template); + } + else{ + $run->obliterate; + } + if ($serverpush) { + print $cgi->multipart_end; + print $cgi->multipart_start; + } else { + print $cgi->header; + } + + $vars->{'deleted'} = 1; + $template->process("testopia/run/delete.html.tmpl", $vars) || + ThrowTemplateError($template->error()); + print $cgi->multipart_final if $serverpush; +} + +#################### +### Just show it ### +#################### +else { + print $cgi->header; + display(Bugzilla::Testopia::TestRun->new($run_id)); +} +################### +### Helper Subs ### +################### +#TODO: Replace this with json +sub get_cc_xml { + my ($run) = @_; + my $ret = "<cclist>"; + foreach my $c (@{$run->cc}){ + $ret .= "<user>"; + $ret .= "<id>". $c->{'id'} ."</id>"; + $ret .= "<name>". $c->{'login'} ."</name>"; + $ret .= "</user>"; + } + $ret .= "</cclist>"; + return $ret; +} + +sub do_update { + my ($run) = @_; + + my $timestamp; + $timestamp = $run->stop_date; + $timestamp = undef if $cgi->param('status') && $run->stop_date; + $timestamp = get_time_stamp() if !$cgi->param('status') && !$run->stop_date; + + my $summary = $cgi->param('summary') || ''; + my $prodver = Bugzilla::Version::check_version($run->plan->product, $cgi->param('product_version')); + my $planver = $cgi->param('plan_version'); + my $build = $cgi->param('build'); + my $env = $cgi->param('environment'); + my $manager = login_to_id(trim($cgi->param('manager'))) ||ThrowUserError("invalid_username", { name => $cgi->param('manager') }); + my $notes = trim($cgi->param('notes')); + + ThrowUserError('testopia-missing-required-field', {'field' => 'summary'}) if ($cgi->param('summary') eq ''); + ThrowUserError('testopia-missing-required-field', {'field' => 'environment'}) if ($env eq ''); + + trick_taint($summary); + trick_taint($planver); + trick_taint($notes); + + detaint_natural($build); + detaint_natural($env); + + validate_test_id($build, 'build'); + validate_test_id($env, 'environment'); + + #TODO: Are notes something we want in the history? + #$run->update_notes($notes); + + my %newvalues = ( + 'summary' => $summary, + 'product_version' => $prodver->name, + 'plan_text_version' => $planver, + 'build_id' => $build, + 'environment_id' => $env, + 'stop_date' => $timestamp, + 'manager_id' => $manager, + 'notes' => $notes + ); + $run->update(\%newvalues); + + # Add new tags + foreach my $tag_name (split(/[,]+/, $cgi->param('newtag'))){ + trick_taint($tag_name); + my $tag = Bugzilla::Testopia::TestTag->new({tag_name => $tag_name}); + my $tag_id = $tag->store; + $run->add_tag($tag_id); + } + + $cgi->delete_all; + $cgi->param('run_id', $run->id); + +} + +sub display { + my $run = shift; + ThrowUserError("testopia-permission-denied", {'object' => $run}) unless $run->canview; + # See if there is a saved filter + if ($cgi->cookie('TESTOPIA-FILTER-RUN-' . $run_id) && $action ne 'Filter' && $action ne 'clear_filter'){ + $cgi = Bugzilla::CGI->new($cgi->cookie('TESTOPIA-FILTER-RUN-' . $run_id)); + $cgi->param('run_id', $run_id); + $vars->{'filtered'} = 1; + + } + + $cgi->param('current_tab', 'case_run'); + my $search = Bugzilla::Testopia::Search->new($cgi); + my $table = Bugzilla::Testopia::Table->new('case_run', 'tr_show_run.cgi', $cgi, undef, $search->query); + ThrowUserError('testopia-query-too-large', {'limit' => $query_limit}) if $table->view_count > $query_limit; + + my $case = Bugzilla::Testopia::TestCase->new({'case_id' => 0}); + $vars->{'fullwidth'} = 1; + $vars->{'expand_report'} = $cgi->param('expand_report') || 0; + $vars->{'expand_filter'} = $cgi->param('expand_filter') || 0; + $vars->{'caserun'} = Bugzilla::Testopia::TestCaseRun->new({}); + $vars->{'case'} = Bugzilla::Testopia::TestCase->new({}); + $vars->{'run'} = $run; + $vars->{'table'} = $table; + $vars->{'action'} = 'Commit'; + if ($cgi->param('case_id')){ + $vars->{'expand_filter'} = 1; + $vars->{'filtered'} = 1; + } + $template->process("testopia/run/show.html.tmpl", $vars) || + ThrowTemplateError($template->error()); +} diff --git a/tr_tags.cgi b/tr_tags.cgi new file mode 100755 index 0000000..311b56a --- /dev/null +++ b/tr_tags.cgi @@ -0,0 +1,229 @@ +#!/usr/bin/perl -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Testopia System. +# +# The Initial Developer of the Original Code is Greg Hendricks. +# Portions created by Greg Hendricks are Copyright (C) 2006 +# Novell. All Rights Reserved. +# +# Contributor(s): Greg Hendricks <ghendricks@novell.com> + +use strict; +use lib "."; + +use Bugzilla; +use Bugzilla::Util; +use Bugzilla::User; +use Bugzilla::Config; +use Bugzilla::Constants; +use Bugzilla::Error; +use Bugzilla::Testopia::Util; +use Bugzilla::Testopia::TestTag; +use Bugzilla::Testopia::TestPlan; +use Bugzilla::Testopia::TestRun; +use Bugzilla::Testopia::TestCase; + +Bugzilla->login(LOGIN_REQUIRED); + +my $cgi = Bugzilla->cgi; + +use vars qw($vars $template); +my $template = Bugzilla->template; + +print $cgi->header; + +my $action = $cgi->param('action') || ''; +my $type = $cgi->param('type'); +my $id = $cgi->param('id'); +detaint_natural($id) if $id; + +$vars->{'id'} = $id; +$vars->{'type'} = $type; + +if ($action eq 'delete'){ + my $tag_id = $cgi->param('tagid'); + validate_test_id($tag_id, 'tag'); + my $tag = Bugzilla::Testopia::TestTag->new($tag_id); + ThrowUserError("testopia-no-delete", {'object' => $tag}) unless $tag->candelete; + $tag->obliterate; + $vars->{'tr_message'} = "Tag " . $tag->name . " deleted"; + display(); +} + +#################### +### Ajax Actions ### +#################### +elsif ($action eq 'addtag'){ + my $tag_name = $cgi->param('tag'); + trick_taint($tag_name); + my $tag = Bugzilla::Testopia::TestTag->new({tag_name => $tag_name}); + my $tag_id = $tag->store; + my $obj; + if ($type eq 'plan'){ + $obj = Bugzilla::Testopia::TestPlan->new($id); + } elsif ($type eq 'case'){ + $obj = Bugzilla::Testopia::TestCase->new($id); + } elsif($type eq 'run'){ + $obj = Bugzilla::Testopia::TestRun->new($id); + } + unless ($obj) { + $vars->{'tr_error'} = "Error - I don't know what you are trying to do."; + print $vars->{'tr_error'}; + exit; + } + unless ($obj->canedit) { + $vars->{'tr_error'} = "Error - You do not have permission to modify this ". $obj->type; + print $vars->{'tr_error'}; + exit; + } + my $tagged = $obj->add_tag($tag_id); + + if ($tagged) { + $vars->{'tr_error'} = "Error - This tag is already associated with this $type"; + unless ($cgi->param('method')){ + print $vars->{'tr_error'}; + exit 1; + } + display(); + } + else{ + if ($cgi->param('method')){ + $vars->{'tr_message'} = "Added tag " . $tag->name . " To $type " . $obj->id; + $cgi->param($type.'_id', $obj->id); + display(); + exit; + } + + $vars->{'item'} = $obj; + $vars->{'type'} = $type; + print "OK"; + $template->process("testopia/tag/table.html.tmpl", $vars) + || print $template->error(); + } + +} +elsif ($action eq 'removetag'){ + my $id = $cgi->param('id'); + my $tag_id = $cgi->param('tagid'); + detaint_natural($tag_id); + my $obj; + if ($type eq 'plan'){ + $obj = Bugzilla::Testopia::TestPlan->new($id); + } elsif ($type eq 'case'){ + $obj = Bugzilla::Testopia::TestCase->new($id); + } elsif($type eq 'run'){ + $obj = Bugzilla::Testopia::TestRun->new($id); + } + ThrowUserError('testopia-unkown-object') unless $obj; + ThrowUserError("testopia-read-only", {'object' => $obj}) unless $obj->canedit; + $obj->remove_tag($tag_id); + if ($cgi->param('method')){ + $vars->{'tr_message'} = "Removed tag From $type " . $obj->id; + $cgi->param($type.'_id', $obj->id); + display(); + exit; + } + $vars->{'item'} = $obj; + $vars->{'type'} = $type; + print "OK"; + $template->process("testopia/tag/table.html.tmpl", $vars) + || print $template->error(); +} +################### +### Body ### +################### +else { + display(); +} +################### +### Subroutines ### +################### + +sub display { + my $dbh = Bugzilla->dbh; + my @tags; + my $user = login_to_id($cgi->param('user')) if $cgi->param('user'); + + if ($cgi->param('action') eq 'show_all' && Bugzilla->user->in_group('admin')){ + my $tags = $dbh->selectcol_arrayref( + "SELECT tag_id FROM test_tags + ORDER BY tag_name"); + foreach my $t (@{$tags}){ + push @tags, Bugzilla::Testopia::TestTag->new($t); + } + $vars->{'viewall'} = 1; + } + + my $userid = $user ? $user : Bugzilla->user->id; + ThrowUserError("invalid_username", { name => $cgi->param('user') }) unless $userid; + my $user_tags = $dbh->selectcol_arrayref( + "(SELECT test_tags.tag_id, test_tags.tag_name AS name FROM test_case_tags + INNER JOIN test_tags ON test_case_tags.tag_id = test_tags.tag_id + WHERE userid = ?) + UNION (SELECT test_tags.tag_id, test_tags.tag_name AS name FROM test_plan_tags + INNER JOIN test_tags ON test_plan_tags.tag_id = test_tags.tag_id + WHERE userid = ?) + UNION (SELECT test_tags.tag_id, test_tags.tag_name AS name FROM test_run_tags + INNER JOIN test_tags ON test_run_tags.tag_id = test_tags.tag_id + WHERE userid = ?) + ORDER BY name", undef, ($userid, $userid, $userid)); + my @user_tags; + foreach my $id (@$user_tags){ + push @user_tags, Bugzilla::Testopia::TestTag->new($id); + } + + $vars->{'user_tags'} = \@user_tags; + $vars->{'user_name'} = $cgi->param('user') ? $cgi->param('user') : Bugzilla->user->login; + + if ($cgi->param('case_id')){ + my $case_id = $cgi->param('case_id'); + detaint_natural($case_id); + $vars->{'case'} = Bugzilla::Testopia::TestCase->new($case_id); + } + if ($cgi->param('plan_id')){ + my $plan_id = $cgi->param('plan_id'); + detaint_natural($plan_id); + $vars->{'plan'} = Bugzilla::Testopia::TestPlan->new($plan_id); + } + if ($cgi->param('run_id')){ + my $run_id = $cgi->param('run_id'); + detaint_natural($run_id); + $vars->{'run'} = Bugzilla::Testopia::TestRun->new($run_id); + } + + my @products; + foreach my $id (split(",", $cgi->param('product'))){ + my $product = Bugzilla::Testopia::Product->new($id); + push @products, $product if Bugzilla->user->can_see_product($product->name); + } + $vars->{'products'} = \@products; + + my @tagids = split(/[\s,]/, $cgi->param('tag_id')); + + foreach my $id (@tagids){ + detaint_natural($id); + push @tags, Bugzilla::Testopia::TestTag->new($id); + } + + if ($cgi->param('tag')){ + my $name = trim($cgi->param('tag')); + trick_taint($name); + push @tags, Bugzilla::Testopia::TestTag->new($name); + } + + $vars->{'tags'} = \@tags; + $template->process("testopia/tag/show.html.tmpl", $vars) + || print $template->error(); + +} diff --git a/tr_xmlrpc.cgi b/tr_xmlrpc.cgi new file mode 100755 index 0000000..d99eeee --- /dev/null +++ b/tr_xmlrpc.cgi @@ -0,0 +1,55 @@ +#!/usr/bin/perl +####!/usr/bin/perl -d:ptkdb -wT +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# Contributor(s): Marc Schumann <wurblzap@gmail.com> +# Dallas Harken <dharken@novell.com> + +sub BEGIN +{ + # For use with ptkdb. + $ENV{DISPLAY}=":0.0"; +} + +use strict; +use lib qw(.); + +require "globals.pl"; + +use XMLRPC::Transport::HTTP; +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::WebService; + +# To be used in version 2.23/3.0 of Bugzilla +# Bugzilla->usage_mode(Bugzilla::Constants::USAGE_MODE_WEBSERVICE); + +Bugzilla->batch(1); + +die 'Content-Type must be "text/xml" when using API' unless + $ENV{'CONTENT_TYPE'} eq 'text/xml'; + +my $response = Bugzilla::WebService::XMLRPC::Transport::HTTP::CGI + ->dispatch_with({'TestPlan' => 'Bugzilla::WebService::Testopia::TestPlan', + 'TestCase' => 'Bugzilla::WebService::Testopia::TestCase', + 'TestRun' => 'Bugzilla::WebService::Testopia::TestRun', + 'TestCaseRun' => 'Bugzilla::WebService::Testopia::TestCaseRun', + 'Product' => 'Bugzilla::WebService::Testopia::Product', + 'Environment' => 'Bugzilla::WebService::Testopia::Environment', + 'Build' => 'Bugzilla::WebService::Testopia::Build', + 'Component' => 'Bugzilla::WebService::Component', + 'User' => 'Bugzilla::WebService::User', + }) + ->handle; From 3ce96bfa1f3253bf7f646e4ae0e7900bea7394df Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Wed, 30 May 2007 19:50:26 +0000 Subject: [PATCH 02/21] Entering empy tester causes undef to trick_taint --- tr_show_case.cgi | 1 - 1 file changed, 1 deletion(-) diff --git a/tr_show_case.cgi b/tr_show_case.cgi index dde0b8d..20e8c84 100755 --- a/tr_show_case.cgi +++ b/tr_show_case.cgi @@ -360,7 +360,6 @@ sub do_update{ my $est_time = $cgi->param("estimated_time") || undef; if ($tester){ $tester = login_to_id(trim($cgi->param('tester'))) || ThrowUserError("invalid_username", { name => $cgi->param('tester') }); - trick_taint($tester); } ThrowUserError('testopia-missing-required-field', {'field' => 'summary'}) if $summary eq ''; From 87316d286c51e8f5e69abf1c68038cd6599ecd5e Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Wed, 30 May 2007 20:18:53 +0000 Subject: [PATCH 03/21] Fix undef error when updating test case with no default tester. --- Bugzilla/Testopia/TestCase.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/Bugzilla/Testopia/TestCase.pm b/Bugzilla/Testopia/TestCase.pm index 6854f59..25d54e0 100644 --- a/Bugzilla/Testopia/TestCase.pm +++ b/Bugzilla/Testopia/TestCase.pm @@ -803,7 +803,6 @@ sub update { 'test_fielddefs READ'); foreach my $field (keys %{$newvalues}){ if ($self->{$field} ne $newvalues->{$field}){ - trick_taint($newvalues->{$field}); $dbh->do("UPDATE test_cases SET $field = ? WHERE case_id = ?", undef, $newvalues->{$field}, $self->{'case_id'}); From 5d2ad84d984bb445cc99d886ae2f740b566183df Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Thu, 31 May 2007 19:47:53 +0000 Subject: [PATCH 04/21] undef to trick taint --- tr_list_caseruns.cgi | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tr_list_caseruns.cgi b/tr_list_caseruns.cgi index 2f6407b..577ebf9 100755 --- a/tr_list_caseruns.cgi +++ b/tr_list_caseruns.cgi @@ -125,13 +125,18 @@ if ($action eq 'Commit'){ $caserun = $caserun->switch($build,$env); my $status = $cgi->param('status') == -1 ? $caserun->status_id : $cgi->param('status'); - my $assignee = $cgi->param('assignee') eq '' ? $caserun->assignee->id : login_to_id(trim($cgi->param('assignee'))); - unless ($assignee){ - print $cgi->multipart_end if $serverpush; - ThrowUserError("invalid_username", { name => $cgi->param('assignee') }); + my $assignee; + if ($cgi->param('assignee') eq ''){ + $assignee = $caserun->assignee->id if $caserun->assignee; } + else { + $assignee = login_to_id(trim($cgi->param('assignee'))); + unless ($assignee){ + print $cgi->multipart_end if $serverpush; + ThrowUserError("invalid_username", { name => $cgi->param('assignee') }); + } + } detaint_natural($status); - trick_taint($assignee); $caserun->set_status($status) if ($caserun->status_id != $status); $caserun->set_assignee($assignee) if ($caserun->assignee->id != $assignee); From 9b33bd21e5102c017a002dc6cbe5b36a567a204e Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Tue, 5 Jun 2007 22:40:56 +0000 Subject: [PATCH 05/21] Backing out change to search --- Bugzilla/Testopia/Search.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Bugzilla/Testopia/Search.pm b/Bugzilla/Testopia/Search.pm index 9de0788..70da52d 100644 --- a/Bugzilla/Testopia/Search.pm +++ b/Bugzilla/Testopia/Search.pm @@ -1296,7 +1296,7 @@ sub init { push(@groupby, $field) if !grep($_ eq $field, @groupby); } } - #unshift(@groupby, "test_${obj}s.${obj}_id"); + unshift(@groupby, "test_${obj}s.${obj}_id"); $query .= " " . $dbh->sql_group_by(join(', ', @groupby)) if @groupby; From d3185e598fa07f400266c5830614ae31fa1a229f Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Thu, 7 Jun 2007 16:41:44 +0000 Subject: [PATCH 06/21] =?UTF-8?q?Bug=20383246=20=E2=80=93=20When=20creatin?= =?UTF-8?q?g=20new=20test=20run,=20can't=20enter=20environment=20from=20dr?= =?UTF-8?q?op=20down=20list,=20only=20in=20a=20"new"=20field?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../en/default/testopia/run/form.html.tmpl | 2 +- tr_quicksearch.cgi | 21 ++++--------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/template/en/default/testopia/run/form.html.tmpl b/template/en/default/testopia/run/form.html.tmpl index c8320c8..34e4372 100644 --- a/template/en/default/testopia/run/form.html.tmpl +++ b/template/en/default/testopia/run/form.html.tmpl @@ -91,7 +91,7 @@ <th align="right" valign="top"><a href="tr_list_environments.cgi?product_id=[% run.plan.product_id FILTER none %]">Environment</a></th> <td valign="top"> <input dojoType="select" - dataUrl="tr_quicksearch.cgi?action=getenv&run_id=[% run.id FILTER none %]&search=%{searchString}" + dataUrl="tr_quicksearch.cgi?action=getenv&prod_id=[% run.plan.product.id FILTER none %]&search=%{searchString}" mode="remote" autoComplete="false" id="environment" diff --git a/tr_quicksearch.cgi b/tr_quicksearch.cgi index 9b853f6..33b8923 100755 --- a/tr_quicksearch.cgi +++ b/tr_quicksearch.cgi @@ -182,17 +182,10 @@ else{ # Environment Lookup if ($action eq 'getenv'){ - Bugzilla->batch(1); my $search = $cgi->param('search'); - my $run_id = $cgi->param('run_id'); - eval { - detaint_natural($run_id); - trick_taint($search); - validate_test_id($run_id, 'run'); - }; - exit if $@; + my $prod_id = $cgi->param('prod_id'); + trick_taint($search); - my $run = Bugzilla::Testopia::TestRun->new($run_id); $search = "%$search%"; my $dbh = Bugzilla->dbh; @@ -201,19 +194,13 @@ else{ # as a select list in the ComboBox widget. my $ref; - if ($run_id){ + if ($prod_id){ $ref = $dbh->selectall_arrayref( "SELECT test_environments.name AS name, test_environments.environment_id FROM test_environments WHERE name like ? AND product_id = ? AND isactive = 1 - UNION SELECT test_environments.name AS name, test_environments.environment_id - FROM test_case_runs - INNER JOIN test_environments ON test_case_runs.environment_id = test_environments.environment_id - WHERE name like ? AND test_case_runs.run_id = ? - AND isactive = 1 ORDER BY name", - undef, ($search, $run->plan->product_id, - $search, $run_id)); + undef, ($search, $prod_id)); } else{ $ref = $dbh->selectall_arrayref( From 2447d88f62d4018c37064faaa139042dd26df224 Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Thu, 7 Jun 2007 23:11:43 +0000 Subject: [PATCH 07/21] Satisfy /t tests. --- Bugzilla/Config/Testopia.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/Bugzilla/Config/Testopia.pm b/Bugzilla/Config/Testopia.pm index 4a88e0a..26289e1 100644 --- a/Bugzilla/Config/Testopia.pm +++ b/Bugzilla/Config/Testopia.pm @@ -1,4 +1,3 @@ -#!/usr/bin/perl -wT # -*- Mode: perl; indent-tabs-mode: nil -*- # # The contents of this file are subject to the Mozilla Public From 6f23cbb704f0d8e46daf3f928a5658f3a44cf7aa Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Mon, 11 Jun 2007 22:29:13 +0000 Subject: [PATCH 08/21] tainted prod_id in tr_quicksearch --- tr_quicksearch.cgi | 1 + 1 file changed, 1 insertion(+) diff --git a/tr_quicksearch.cgi b/tr_quicksearch.cgi index 33b8923..73cf59f 100755 --- a/tr_quicksearch.cgi +++ b/tr_quicksearch.cgi @@ -185,6 +185,7 @@ else{ my $search = $cgi->param('search'); my $prod_id = $cgi->param('prod_id'); trick_taint($search); + detaint_natural($prod_id); $search = "%$search%"; my $dbh = Bugzilla->dbh; From 7826bb027576afa5662a2a75ff0feac94a4a46ad Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Tue, 12 Jun 2007 22:10:01 +0000 Subject: [PATCH 09/21] Numerous bug fixes --- Bugzilla/Testopia/Search.pm | 3 +-- Bugzilla/Testopia/TestRun.pm | 2 +- testopia/patch-2.22 | 19 +++++++++++++++++++ testopia/patch-2.22.1 | 19 +++++++++++++++++++ testopia/patch-2.22.2 | 19 +++++++++++++++++++ 5 files changed, 59 insertions(+), 3 deletions(-) diff --git a/Bugzilla/Testopia/Search.pm b/Bugzilla/Testopia/Search.pm index 70da52d..8c6ceda 100644 --- a/Bugzilla/Testopia/Search.pm +++ b/Bugzilla/Testopia/Search.pm @@ -1296,8 +1296,7 @@ sub init { push(@groupby, $field) if !grep($_ eq $field, @groupby); } } - unshift(@groupby, "test_${obj}s.${obj}_id"); - $query .= " " . $dbh->sql_group_by(join(', ', @groupby)) if @groupby; + $query .= " " . $dbh->sql_group_by("test_${obj}s.${obj}_id", join(', ', @groupby)); if (@having) { diff --git a/Bugzilla/Testopia/TestRun.pm b/Bugzilla/Testopia/TestRun.pm index daf7916..502a2e1 100644 --- a/Bugzilla/Testopia/TestRun.pm +++ b/Bugzilla/Testopia/TestRun.pm @@ -987,7 +987,7 @@ sub cases { return $self->{'cases'} if exists $self->{'cases'}; my @cases; foreach my $cr (@{$self->current_caseruns}){ - push @cases, Bugzilla::Testopia::TestCase->new($cr->case_id); + push @cases, Bugzilla::Testopia::TestCase->new($cr); } $self->{'cases'} = \@cases; return $self->{'cases'}; diff --git a/testopia/patch-2.22 b/testopia/patch-2.22 index 335af1b..f8a2e4d 100644 --- a/testopia/patch-2.22 +++ b/testopia/patch-2.22 @@ -842,3 +842,22 @@ diff -u -r1.45 Schema.pm + }, }; #-------------------------------------------------------------------------- +Index: createaccount.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/createaccount.cgi,v +retrieving revision 1.46 +diff -u -r1.46 createaccount.cgi +--- createaccount.cgi 20 Dec 2005 22:16:07 -0000 1.46 ++++ createaccount.cgi 12 Jun 2007 16:31:57 -0000 +@@ -69,8 +69,8 @@ + + $vars->{'login'} = $login; + +- $dbh->bz_lock_tables('profiles WRITE', 'groups READ', +- 'user_group_map WRITE', 'email_setting WRITE', ++ $dbh->bz_lock_tables('profiles WRITE', 'groups READ', 'test_plan_permissions_regexp READ', ++ 'user_group_map WRITE', 'email_setting WRITE', 'test_plan_permissions READ', + 'tokens READ'); + + if (!is_available_username($login)) { + diff --git a/testopia/patch-2.22.1 b/testopia/patch-2.22.1 index 723ea04..95715c9 100644 --- a/testopia/patch-2.22.1 +++ b/testopia/patch-2.22.1 @@ -852,3 +852,22 @@ diff -u -r1.9 Pg.pm SMALLSERIAL => 'serial unique', MEDIUMSERIAL => 'serial unique', INTSERIAL => 'serial unique', +Index: createaccount.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/createaccount.cgi,v +retrieving revision 1.46 +diff -u -r1.46 createaccount.cgi +--- createaccount.cgi 20 Dec 2005 22:16:07 -0000 1.46 ++++ createaccount.cgi 12 Jun 2007 16:31:57 -0000 +@@ -69,8 +69,8 @@ + + $vars->{'login'} = $login; + +- $dbh->bz_lock_tables('profiles WRITE', 'groups READ', +- 'user_group_map WRITE', 'email_setting WRITE', ++ $dbh->bz_lock_tables('profiles WRITE', 'groups READ', 'test_plan_permissions_regexp READ', ++ 'user_group_map WRITE', 'email_setting WRITE', 'test_plan_permissions READ', + 'tokens READ'); + + if (!is_available_username($login)) { + diff --git a/testopia/patch-2.22.2 b/testopia/patch-2.22.2 index 87d367c..676f718 100644 --- a/testopia/patch-2.22.2 +++ b/testopia/patch-2.22.2 @@ -852,3 +852,22 @@ diff -u -r1.12.2.1 Mysql.pm # fields, which have their own special auto-defaults.) # # Here's how we handle this: If it exists in the schema +Index: createaccount.cgi +=================================================================== +RCS file: /cvsroot/mozilla/webtools/bugzilla/createaccount.cgi,v +retrieving revision 1.46 +diff -u -r1.46 createaccount.cgi +--- createaccount.cgi 20 Dec 2005 22:16:07 -0000 1.46 ++++ createaccount.cgi 12 Jun 2007 16:31:57 -0000 +@@ -69,8 +69,8 @@ + + $vars->{'login'} = $login; + +- $dbh->bz_lock_tables('profiles WRITE', 'groups READ', +- 'user_group_map WRITE', 'email_setting WRITE', ++ $dbh->bz_lock_tables('profiles WRITE', 'groups READ', 'test_plan_permissions_regexp READ', ++ 'user_group_map WRITE', 'email_setting WRITE', 'test_plan_permissions READ', + 'tokens READ'); + + if (!is_available_username($login)) { + From 3d5f589a0ec789db84aa8882c5cb854d7dbc5f53 Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Wed, 13 Jun 2007 16:14:43 +0000 Subject: [PATCH 10/21] =?UTF-8?q?Bug=20371957=20=E2=80=93=20when=20clickin?= =?UTF-8?q?g=20on=20the=20magnifying=20glass=20for=20notes=20in=20a=20test?= =?UTF-8?q?=20run,=20the=20context=20of=20the=20screen=20resets=20to=20the?= =?UTF-8?q?=20top?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/en/default/testopia/caserun/short-form.html.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/en/default/testopia/caserun/short-form.html.tmpl b/template/en/default/testopia/caserun/short-form.html.tmpl index 20bed38..55f2bb8 100644 --- a/template/en/default/testopia/caserun/short-form.html.tmpl +++ b/template/en/default/testopia/caserun/short-form.html.tmpl @@ -86,7 +86,7 @@ <td rowspan="2"> [%##### Notes #####%] - <div style="float:left;font-weight:bold;">Notes: <a href="#" onclick="notesZoom([% index %],'[% caserun.case.id %]')"><img src="testopia/img/env_lookup.png" alt="Zoom" title="Zoom"/></a></div> + <div style="float:left;font-weight:bold;">Notes: <a href="javascript: notesZoom([% index %],'[% caserun.case.id %]');"><img src="testopia/img/env_lookup.png" alt="Zoom" title="Zoom"/></a></div> <div class="cc_i"> <div style="height:150px; width:400px; border:1px solid #000; background-color: #f8f8f8; overflow:auto;" id="old_notes[% index %]" ><pre>[% caserun.notes FILTER html %]</pre></div> </div> From 917120cd7bea165c441a2d43e2f96ac0215632fa Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Thu, 14 Jun 2007 16:54:38 +0000 Subject: [PATCH 11/21] Fixed test errors. --- Bugzilla/Testopia/TestPlan.pm | 2 ++ Bugzilla/Testopia/XmlReferences.pm | 12 ++++++------ testopia/js/caserun.js | 2 ++ tr_show_case.cgi | 6 +++++- tr_xmlrpc.cgi | 2 +- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Bugzilla/Testopia/TestPlan.pm b/Bugzilla/Testopia/TestPlan.pm index 9656847..63f30b8 100644 --- a/Bugzilla/Testopia/TestPlan.pm +++ b/Bugzilla/Testopia/TestPlan.pm @@ -743,6 +743,8 @@ sub set_tester_regexp { sub derive_regexp_testers { my $self = shift; my $regexp = shift; + eval{ "" =~ $regexp; }; + ThrowUserError('invalid_regexp') if $@; my $dbh = Bugzilla->dbh; # Get the permissions of the regexp testers so we can set it later. my ($permissions) = $dbh->selectrow_array( diff --git a/Bugzilla/Testopia/XmlReferences.pm b/Bugzilla/Testopia/XmlReferences.pm index 006eee6..94ece3e 100644 --- a/Bugzilla/Testopia/XmlReferences.pm +++ b/Bugzilla/Testopia/XmlReferences.pm @@ -40,7 +40,7 @@ package Bugzilla::Testopia::XmlReferences; use constant IGNORECASE => "ignorecase"; -#use strict; +use strict; sub new { @@ -49,10 +49,10 @@ sub new my $class = ref($invocant) || $invocant; my $self = {}; bless($self, $class); - $self{IGNORECASE} = $ignorecase; + $self->{IGNORECASE} = $ignorecase; for my $field ( split(/ /, $fields) ) { - $field = uc $field if ( $self{IGNORECASE} ); + $field = uc $field if ( $self->{IGNORECASE} ); $self->{$field} = []; } return $self; @@ -62,7 +62,7 @@ sub add { my ($self, $type, $object) = @_; - $type = uc $type if ( $self{IGNORECASE} ); + $type = uc $type if ( $self->{IGNORECASE} ); return 0 if ( ! exists $self->{$type} ); @@ -74,7 +74,7 @@ sub display my ($self) = @_; print "display() self=" . $self . "\n"; - foreach $key (keys %$self) + foreach my $key (keys %$self) { if ( defined $self->{$key} ) { @@ -91,7 +91,7 @@ sub get { my ($self, $type) = @_; - $type = uc $type if ( $self{IGNORECASE} ); + $type = uc $type if ( $self->{IGNORECASE} ); return 0 if ( ! exists $self->{$type} ); diff --git a/testopia/js/caserun.js b/testopia/js/caserun.js index 28effd0..86f146b 100755 --- a/testopia/js/caserun.js +++ b/testopia/js/caserun.js @@ -217,6 +217,8 @@ function chSortKey(idx, cid, svalue){ displayMsg('pp'+ idx, 2, data); return; } + document.getElementById('ra'+idx).style.display='block'; + document.getElementById('id'+idx).src='testopia/img/td.gif'; displayMsg('pp'+ idx, 1, MSG_TESTLOG_UPDATED); setTimeout("clearMsg('pp"+ idx +"')",OK_TIMEOUT); disableAllButtons(false); diff --git a/tr_show_case.cgi b/tr_show_case.cgi index 20e8c84..fe29b94 100755 --- a/tr_show_case.cgi +++ b/tr_show_case.cgi @@ -115,7 +115,11 @@ elsif ($action eq 'do_clone'){ foreach my $pid (@planids){ $count++; my $plan = Bugzilla::Testopia::TestPlan->new($pid); - next unless $plan->canedit; + unless ($plan->canedit){ + $count--; + $vars->{'tr_error'} = "Could not link to at least one plan"; + next; + } my $newcaseid = $case->copy($pid, $author, $cgi->param('copy_doc')); $case->link_plan($pid, $newcaseid); $newcase = Bugzilla::Testopia::TestCase->new($newcaseid); diff --git a/tr_xmlrpc.cgi b/tr_xmlrpc.cgi index d99eeee..487a9e4 100755 --- a/tr_xmlrpc.cgi +++ b/tr_xmlrpc.cgi @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/perl -wT ####!/usr/bin/perl -d:ptkdb -wT # -*- Mode: perl; indent-tabs-mode: nil -*- # From 286df60e49e2a4a0aa11b835c232193de540b666 Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Thu, 21 Jun 2007 20:54:41 +0000 Subject: [PATCH 12/21] Filter by environment throws SQL error --- Bugzilla/Testopia/Search.pm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Bugzilla/Testopia/Search.pm b/Bugzilla/Testopia/Search.pm index 8c6ceda..63c83d3 100644 --- a/Bugzilla/Testopia/Search.pm +++ b/Bugzilla/Testopia/Search.pm @@ -505,6 +505,12 @@ sub init { "ON test_". $obj ."s.environment_id = test_environments.environment_id"); $f = 'test_environments.name'; }, + "^environment_name," => sub { + push(@supptables, + "INNER JOIN test_environments ". + "ON test_". $obj ."s.environment_id = test_environments.environment_id"); + $f = 'test_environments.name'; + }, "^plan_type," => sub { push(@supptables, "INNER JOIN test_plan_types ". From 9b289572698569eb877bf78f4dfa63b02b05e248 Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Fri, 22 Jun 2007 20:08:27 +0000 Subject: [PATCH 13/21] =?UTF-8?q?Bug=20383245=20=E2=80=93=20My=20Runs=20do?= =?UTF-8?q?es=20not=20work?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bugzilla/Testopia/Search.pm | 2 +- tr_tags.cgi | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Bugzilla/Testopia/Search.pm b/Bugzilla/Testopia/Search.pm index 63c83d3..d8829e3 100644 --- a/Bugzilla/Testopia/Search.pm +++ b/Bugzilla/Testopia/Search.pm @@ -790,7 +790,7 @@ sub init { "LEFT JOIN test_case_runs AS case_run " . "ON case_run.run_id = test_runs.run_id"); push(@supptables, - "INNER JOIN profiles AS map_$1 " . + "LEFT JOIN profiles AS map_$1 " . "ON case_run.". $1 ." = map_$1.userid"); } else { diff --git a/tr_tags.cgi b/tr_tags.cgi index 65facbf..36c2d4b 100755 --- a/tr_tags.cgi +++ b/tr_tags.cgi @@ -153,8 +153,8 @@ else { sub display { my $dbh = Bugzilla->dbh; my @tags; - my $user = login_to_id($cgi->param('user')) if $cgi->param('user'); - trick_taint($user); + my $user = $cgi->param('user'); + $user = login_to_id($user) if $user; if ($cgi->param('action') eq 'show_all' && Bugzilla->user->in_group('admin')){ my $tags = $dbh->selectcol_arrayref( From c709bec226db07a232eccaceed3906d8caeddafb Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Fri, 22 Jun 2007 20:21:13 +0000 Subject: [PATCH 14/21] =?UTF-8?q?Bug=20382506=20=E2=80=93=20Cannot=20assig?= =?UTF-8?q?n=20a=20different=20user=20to=20a=20test=20case=20in=20a=20test?= =?UTF-8?q?=20run?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/en/default/testopia/caserun/short-form.html.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/en/default/testopia/caserun/short-form.html.tmpl b/template/en/default/testopia/caserun/short-form.html.tmpl index 55f2bb8..6e557ef 100644 --- a/template/en/default/testopia/caserun/short-form.html.tmpl +++ b/template/en/default/testopia/caserun/short-form.html.tmpl @@ -127,7 +127,7 @@ <div style="float:left;"><input type="text" size="6" value="" id="mbg[% index %]" [% enabled %]/></div> <div class="cc_i"><input type="button" value="Attach Bug" id="sk[% index %]" [% 'disabled="true"' UNLESS caserun.canedit %] onclick="attch([% index %], [% caserun.id FILTER none %], document.getElementById('mbg[% index %]').value);"/></div> [%##### Assignee #####%] - <div class="cc_i"><input value="[% user.login FILTER html %]" id="assignee_[% index %]" /><input type="button" value="Assign" [% 'disabled="true"' UNLESS caserun.canedit %] onclick="chNote([% index %], [% caserun.id FILTER none %], document.getElementById('notes[% index %]').value); chOwn([% index %], [% caserun.id FILTER none %], document.getElementById('assignee_[% index %]').value)"> + <div class="cc_i"><input value="[% user.login FILTER html %]" id="assignee_[% index %]" /><input type="button" value="Assign" [% 'disabled="true"' UNLESS caserun.canedit %] onclick="chOwn([% index %], [% caserun.id FILTER none %], document.getElementById('assignee_[% index %]').value);"> </div> <div style="float:right; margin-right:20px;"> <a href="tr_show_caserun.cgi?caserun_id=[% caserun.id FILTER none %]">Classic interface...</a> From 555c4d239940ff0a5061fe8091e435d12568044a Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Fri, 22 Jun 2007 21:22:22 +0000 Subject: [PATCH 15/21] Fixes for Table bugs. --- Bugzilla/Testopia/Table.pm | 26 +++++++------------------- tr_query.cgi | 1 - 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/Bugzilla/Testopia/Table.pm b/Bugzilla/Testopia/Table.pm index 3bd077a..39d66d7 100644 --- a/Bugzilla/Testopia/Table.pm +++ b/Bugzilla/Testopia/Table.pm @@ -371,8 +371,8 @@ Returns an ineger representing how many items should appear on a page sub page_size { my $self = shift; my $cgi = $self->{'cgi'}; - return $cgi->param('pagesize') if $cgi->param('pagesize'); - return 25; + my $size = $cgi->param('pagesize') || 25; + return $size; } =head2 get_order_url @@ -384,7 +384,7 @@ column headers to produce a sort order sub get_order_url { my $self = shift; - return $self->get_url('(page|order)'); + return $self->get_url('page','order'); } =head2 get_page_url @@ -396,26 +396,14 @@ the page navigation links to move from page to page. sub get_page_url { my $self = shift; - return $self->get_url('page'); + my $cgi = $self->{'cgi'}; + return $self->{'url_loc'} ."?". $cgi->canonicalise_query('page', 'pagesize', 'viewall'); } sub get_url { - my ($self, $regxp) = @_; + my ($self, @drops) = @_; my $cgi = $self->{'cgi'}; - my @keys = $cgi->param; - my $qstring =''; - foreach my $key (@keys){ - if ((defined $regxp) && ($key =~ $regxp)){ - next; - } - my @vals = $cgi->param($key); - foreach my $val (@vals){ - $qstring .= $key ."=". url_quote($val) ."&"; - } - } - chop $qstring; - $qstring = $self->{'url_loc'} ."?". $qstring; - $self->{'url'} = $qstring; + $self->{'url'} = $self->{'url_loc'} ."?". $cgi->canonicalise_query(@drops); return $self->{'url'}; } diff --git a/tr_query.cgi b/tr_query.cgi index fd6abef..e5e2cec 100755 --- a/tr_query.cgi +++ b/tr_query.cgi @@ -239,7 +239,6 @@ elsif ($action eq 'get_valid_exp'){ print $ret; } elsif ($action eq 'save_query'){ - ; my $query = $cgi->param('query_part'); my $qname = $cgi->param('query_name'); From 078067e1e3c6669560e3e7aafd1c3c4f3b080714 Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Mon, 25 Jun 2007 19:51:16 +0000 Subject: [PATCH 16/21] PG error in groupby --- Bugzilla/Testopia/Search.pm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Bugzilla/Testopia/Search.pm b/Bugzilla/Testopia/Search.pm index d8829e3..306b394 100644 --- a/Bugzilla/Testopia/Search.pm +++ b/Bugzilla/Testopia/Search.pm @@ -1302,7 +1302,12 @@ sub init { push(@groupby, $field) if !grep($_ eq $field, @groupby); } } - $query .= " " . $dbh->sql_group_by("test_${obj}s.${obj}_id", join(', ', @groupby)); + if (scalar @groupby){ + $query .= " " . $dbh->sql_group_by("test_${obj}s.${obj}_id", join(', ', @groupby)); + } + else { + $query .= " " . $dbh->sql_group_by("test_${obj}s.${obj}_id"); + } if (@having) { From c829d3c105cfe902a8ffc435efbb8f160013fce6 Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Mon, 25 Jun 2007 20:42:56 +0000 Subject: [PATCH 17/21] Test run cases throws error. --- Bugzilla/Testopia/TestRun.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Bugzilla/Testopia/TestRun.pm b/Bugzilla/Testopia/TestRun.pm index 502a2e1..b2146e2 100644 --- a/Bugzilla/Testopia/TestRun.pm +++ b/Bugzilla/Testopia/TestRun.pm @@ -987,7 +987,7 @@ sub cases { return $self->{'cases'} if exists $self->{'cases'}; my @cases; foreach my $cr (@{$self->current_caseruns}){ - push @cases, Bugzilla::Testopia::TestCase->new($cr); + push @cases, Bugzilla::Testopia::TestCase->new($cr->id); } $self->{'cases'} = \@cases; return $self->{'cases'}; From 9b6f5e161d6140b87c108181657c7cfae0981da0 Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Wed, 27 Jun 2007 22:02:26 +0000 Subject: [PATCH 18/21] Allow product to return only active envrionments. --- Bugzilla/Testopia/Product.pm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Bugzilla/Testopia/Product.pm b/Bugzilla/Testopia/Product.pm index 5ca2341..4f3f113 100644 --- a/Bugzilla/Testopia/Product.pm +++ b/Bugzilla/Testopia/Product.pm @@ -30,12 +30,16 @@ use Bugzilla::Testopia::Environment; sub environments { my $self = shift; + my($active) = @_; my $dbh = Bugzilla->dbh; - my $ref = $dbh->selectcol_arrayref("SELECT environment_id - FROM test_environments - WHERE product_id = ?", - undef, $self->{'id'}); + return $self->{'environments'} if defined $self->{'environments'}; + + my $query = "SELECT environment_id"; + $query .= " FROM test_environments"; + $query .= " WHERE product_id = ?"; + $query .= " AND isactive = 1" if $active; + my $ref = $dbh->selectcol_arrayref($query, undef, $self->{'id'}); my @objs; foreach my $id (@{$ref}){ push @objs, Bugzilla::Testopia::Environment->new($id); From a9434c5a28e6da8bae79b607210f3132a9a55863 Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Wed, 27 Jun 2007 22:24:47 +0000 Subject: [PATCH 19/21] please wait is displayed before error. --- tr_list_cases.cgi | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tr_list_cases.cgi b/tr_list_cases.cgi index affdff4..306a492 100755 --- a/tr_list_cases.cgi +++ b/tr_list_cases.cgi @@ -120,8 +120,11 @@ if ($action eq 'Commit'){ my @comps = $cgi->param("components"); my $tester = $cgi->param('tester') || ''; if ($tester && $tester ne '--Do Not Change--'){ - $tester = login_to_id(trim($cgi->param('tester'))) - || ThrowUserError("invalid_username", { name => $cgi->param('tester') }); + $tester = login_to_id(trim($cgi->param('tester'))); + unless ($tester){ + print $cgi->multipart_end; + ThrowUserError("invalid_username", { name => $cgi->param('tester') }); + } } else { $tester = $case->default_tester->id; From 5a3ef943d601eab554693b05085dfcbbb5daacd5 Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Wed, 27 Jun 2007 22:44:48 +0000 Subject: [PATCH 20/21] Separators between links --- template/en/default/testopia/case/table.html.tmpl | 2 +- template/en/default/testopia/caserun/table.html.tmpl | 2 +- template/en/default/testopia/plan/show.html.tmpl | 2 +- template/en/default/testopia/run/show.html.tmpl | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/template/en/default/testopia/case/table.html.tmpl b/template/en/default/testopia/case/table.html.tmpl index 989b57b..d6367a9 100644 --- a/template/en/default/testopia/case/table.html.tmpl +++ b/template/en/default/testopia/case/table.html.tmpl @@ -31,7 +31,7 @@ [% IF table.view_count >= MAX_LIMIT %] <p><b>This list is too big to display quickly. Action and Effect will not be included.</b></p> [% END %] -<a href="javascript:coal()">Collapse All</a> +<a href="javascript:coal()">Collapse All</a> | <a href="javascript:exal()">Expand All</a> [% IF dotweak %] Select: diff --git a/template/en/default/testopia/caserun/table.html.tmpl b/template/en/default/testopia/caserun/table.html.tmpl index 5b7c8ee..9f0c72d 100644 --- a/template/en/default/testopia/caserun/table.html.tmpl +++ b/template/en/default/testopia/caserun/table.html.tmpl @@ -28,7 +28,7 @@ <script src="testopia/js/caserun.js" type="text/javascript"></script> <p style="margin-top:0;margin-bottom:4px;"> -<a href="javascript:coal()">Collapse All</a> +<a href="javascript:coal()">Collapse All</a> | <a href="javascript:exal()">Expand All</a> </p> <div id="caserun_table"> diff --git a/template/en/default/testopia/plan/show.html.tmpl b/template/en/default/testopia/plan/show.html.tmpl index 1390b3f..851f546 100644 --- a/template/en/default/testopia/plan/show.html.tmpl +++ b/template/en/default/testopia/plan/show.html.tmpl @@ -210,7 +210,7 @@ <h3>Test Cases</h3> <div id="plan_cases"> [% IF case_table.list_count > 0 AND plan.canedit %] - <a href="tr_new_case.cgi?plan_id=[% plan.id FILTER none %]">Create a New Test Case</a> + <a href="tr_new_case.cgi?plan_id=[% plan.id FILTER none %]">Create a New Test Case</a> | [% END %] [% PROCESS testopia/case/table.html.tmpl table = case_table %] diff --git a/template/en/default/testopia/run/show.html.tmpl b/template/en/default/testopia/run/show.html.tmpl index 64100f9..96116a0 100644 --- a/template/en/default/testopia/run/show.html.tmpl +++ b/template/en/default/testopia/run/show.html.tmpl @@ -195,7 +195,7 @@ <input type="hidden" name="case_list" value="[% table.id_list FILTER none %]" /> <input type="hidden" name="run_id" value="[% run.id FILTER none %]" /> <input type="submit" name="action" value="Clone Run With These Cases" /> -<a href="tr_list_caseruns.cgi?[% table.get_query_part FILTER none %]">Update Multiple</a> +<a href="tr_list_caseruns.cgi?[% table.get_query_part FILTER none %]">Update Multiple</a> | [% END %] <a href="tr_list_cases.cgi?run_id=[% run.id FILTER none %]">List Cases</a> From f3c7cc5c162b5f78c8f7a97cf97e03f8783139dc Mon Sep 17 00:00:00 2001 From: Gregary Hendricks <ghendricks@novell.com> Date: Thu, 12 Jul 2007 22:12:34 +0000 Subject: [PATCH 21/21] Branch project --- .project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.project b/.project index 0b5ffe8..fd864c7 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <projectDescription> - <name>testopia-1.0-2.22</name> + <name>testopia-1.2</name> <comment></comment> <projects> </projects>